码迷,mamicode.com
首页 > 编程语言 > 详细

python函数

时间:2019-01-09 15:40:39      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:就会   影子   位置   语句块   函数对象   src   none   函数参数   要求   

函数:

由若干语句组成的语句块、函数名称、参数列表构成,它是组织代码的最小单元 ,完成一定的功能 

作用:结构化编程对代码的最基本的封装,一般按照功能组织一段代码 ,封装的目的为了复用,减少冗余代码 ,代码更加简洁美观、可读易懂 

 

函数参数:参数调用时传入的参数要和定义的个数相匹配(可变参数例外) 

位置参数:按照参数定义顺序传入实参 

关键字参数:使用形参的名字来出入实参的方式,如果使用了形参名字,那么传参顺序就可和定义顺序不同 。 要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的

 

位置参数的可变参数:在形参前使用*表示该形参是可变参数,可以接收多个实参 , 收集多个实参为一个tuple 

关键字参数的可变参数:形参前使用**符号,表示可以接收多个关键字参数 ,收集的实参名称和值组成一个字典

 keyword-only参数(Python3加入) :如果在一个星号参数后,或者一个位置可变参数后,出现的普通参数,实际上已经不是普通的 参数了,而是keyword-only参数 ,args可以看做已经截获了所有的位置参数,x不使用关键字参数就不可能拿到实参 

函数func中的位置参数默认值保存在属性__defaults__中,为一个元组,可以使用func.__defaults__进行查看; 属性__kwdefaults__中使用字典保存所有keyword-only参数的默认值

参数列表参数一般顺序是,普通参数、缺省参数、可变位置参数、keyword-only参数(可带缺 省值)、可变关键字参数 

参数解构: 给函数提供实参的时候,可以在集合类型前使用*或者**,把集合类型的结构解开,提取出所有 元素作为函数的实参 ,非字典类型使用*解构成位置参数 , 字典类型使用**解构成关键字参数 , 提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配 

函数返回值:Python函数使用return语句返回“返回值” ,所有函数都有返回值,如果没有return语句,隐式调用return None , return 语句并不一定是函数的语句块的最后一条语句 , 一个函数可以存在多个return语句,但是只有一条可以被执行。如果没有一条return语句被执 行到,隐式调用return None ,如果函数执行了return语句,函数就会返回,当前被执行的return语句之后的其它语句就不会 被执行了 。作用:结束函数调用、返回值。

函数不能同时返回多个值, return 1, 3, 5 看似返回多个值,隐式的被python封装成了一个元组 。可以使用 x, y, z = showlist() 使用解构提取更为方便。

 

函数嵌套:在一个函数中定义了另外一个函数,内部函数不能在外部直接使用,会抛NameError异常,因为它不可见

 

作用域:一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域 

全局作用域: 在整个程序运行环境中都可见 

局部作用域:在函数、类等内部可见 ,局部变量使用范围不能超过其所在的局部作用域 

例:

 技术分享图片

技术分享图片

x +=1 其实是x=x+1,相当于在f内部定义一个局部变量x,但是这个x还没有完成赋值,就被右边拿来做加1操作了,如何解决?

技术分享图片

使用global关键字,将f内的x声明为使用外部的全局作用域中定义的x,全局作用域中必须有x的定义

global使用原则: 外部作用域变量会内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为 函数的目的就是为了封装,尽量与外界隔离,如果函数需要使用外部全局变量,请使用函数的形参传参解决 

闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就形成 了闭包。

 

 nonlocal关键字:

使用nonlocal关键字,将变量标记为不在本地作用域定义,而在上级的某一级局部作用域中定义,但不 能是全局作用域中定义

 例:技术分享图片

count 是外层函数的局部变量,被内部函数引用 ,内部函数使用nonlocal关键字声明count变量在上级作用域而非本地作用域中定义 ,代码可以正常使用,且形成闭包 

 

默认值的作用域:函数func中的位置参数默认值保存在属性__defaults__中,为一个元组,可以使用func.__defaults__进行查看; 属性__kwdefaults__中使用字典保存所有keyword-only参数的默认值。使用可变类型作为默认值,就可能修改这个默认值,如何做到默认值不会改变呢?

例1:技术分享图片

例2:技术分享图片

第一种方法: 使用影子拷贝创建一个新的对象,永远不能改变传入的参数 

第二种方法: 通过值的判断就可以灵活的选择创建或者修改传入对象 ,很多函数的定义,都可以看到使用None这个不可变的值作为默认参数,可以说这是一种惯用法

 

变量名解析原则LEGB:技术分享图片

函数的销毁:

全局函数销毁:重新定义同名函数,del语句删除函数对象,程序结束时

局部函数销毁:重新在上级作用域定义同名函数,del语句删除函数名称,函数对象的引用计数减1,上级作用域销毁时。

 

python函数

标签:就会   影子   位置   语句块   函数对象   src   none   函数参数   要求   

原文地址:https://www.cnblogs.com/s-p-l/p/10244088.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!