您好,登录后才能下订单哦!
函数由若干语句组成的语句块、函数名、参数列表构成。它是组织代码的最小单元
目的:为了完成一定的功能
定义时,在形参后跟上一个值
缺省参数不指定,且传参时没有传参则引起报错
作用
参数的默认值可以在未传入足够的实参的时候,对没有给定的参数赋值为默认值
参数非常多的时候,并不需要用户都输入所有参数,可以简化函数调用
定义参数时:非缺省参数不能放在缺省参数之后,否则会报错
位置参数的可变参数 (可变位置参数 args 尽可能多的收集位置参数) 类型是元祖
在形参之前使用表示该形参是可变参数,可以就收多个实参
收集多个实参为一个tuple
可变位置参数不允许使用关键字传参方式传入
关键字参数的可变参数 (可变关键字参数 kwargs 尽可能多的收集关键字参数) 类型字典 数据可以被修改
形参之前使用符号,表示可以接收多个关键字参数
收集的实参名称和值组成一个字典
可变位置参数不允许使用关键字传参方式传入
关键字传参时不允许出现重复的key,否则直接报错SyntaxError
可变参数混合使用
def add(*nums):
print(type(nums),nums)
sum = 0
for i in nums:
sum += i
return sum
add(),add({1,2,3}),add((1,2,3)),add(*[1,2,3]),add(1,2,3,4,5)
<class 'tuple'> ()
<class 'tuple'> (1, 2, 3)
<class 'tuple'> (1, 2, 3)
<class 'tuple'> (1, 2, 3)
<class 'tuple'> (1, 2, 3, 4, 5)
可变参数总结
有位置可变参数和关键字可变参数
位置可变参数在形参之前使用一个星号*
关键字可变参数在形参之前使用两个星号**
位置可变参数和关键字可变参数都可以收集若干个实参,位置可变参数收集行形成一个tuple,关键字可变参数收集形成一个dict
混合使用参数时,可变参数要放到参数列表的最后,普通参数需要放到参数列表之前,位置可变参数需要在关键字可变参数之前
参数默认值(缺省值)
keyword-only参数
如果在一个星号参数后,或者一个位置可变参数后,出现普通的参数,实际上已经不是普通参数了,而是keyword-only参数
当*args后面出现 keyword参数时,现在的keyword变成了 keyword-only 参数 必须要有参数出传入,否则报错TypeError
*args已经将所有的位置参数全部收集,而后面的keyword-only收集不到实参,产生报错
位置参数、keyword-only可以设置缺省值,以免发生漏传报错
当有位置参数,且没有指定缺省值时,必须传入实参,否则报错 且 实参与位置形参个数要对应
参数规则
参数列表一般顺序:位置参数、带有缺省值的位置参数、可变位置参数、keyword-only参数(可带缺省值的keyword-only参数)、可变关键字参数
参数的结构
参数结构,顾名思义,只能用在参数部分
给函数提供实参时,可以在集合类型前使用*或则*,把集合类型的结构解开,提取里面的每个元素作为函数的实参
非字典类型使用号解构将类型转换成位置参数
字典类型使用**解构 将类型解构成关键字参数,提取到字典来的vaalue值
提取出来的元素数目要和参数的要求匹配,也要和参数的类型匹配
函数的返回值与作用域
python函数使用return语句返回——“返回值”
所有函数都有返回值,没有return语句,隐式会调用return Neno
return 语句并不一定是函数的语句块的最后一条语句
一个函数可以存在多个return语句,但是只有一条可以被执行。如果没有return语句被执行,隐式调用return Neno
如果有必要,可以显示调用return Neno,可简写为return
如果函数执行了return语句,函数就会返回,当前被执行的return语句之后的语句就不会被执行
作用:
结束函数,返回——返回值
返回多个值
return 只能返回一个值,当你向返回多个值时,python 会以一种方式将其封装为一个元素返回
函数不能同时返回多个值
return 1,2,3 看似返回多个值,其实隐式被python 转换为了一个元组
x,y,z = showlist()#使用解构提取更为方便
函数的嵌套和作用域
在函数中定义另外一个函数叫做嵌套
函数有可见范围,这就是作用于的概念
内部函数不能再外部直接使用,会抛出NameError异常,因为在外部直接找不大该函数 不可见
作用域
一个标识符的可见范围,这就是标识符的作用域范围。一般说是变量的作用域
全局作用域
在整个程序运行环境中都可见
局部作用域
在函数、类等内部可见
局部变量时候用范围不能超过其所在的局部作用域
global全局变量
使用关键字global的变量,将 函数 内的声明变量 声明为使用那个外部的全局变量
全局作用域中,必须要有 变量的定义
赋值即定义,在内部作用域为一个外部作用域的的比那领赋值,不实在内部作用域定义一个洗呢变量,而是将新赋值的变量作用在全局,这里的变量作用域还是全局作用域
global总结
x+=1这种特殊形式产生的错误
x = x+1 当前x属于赋值状态,此时的x并没有值,等号是先算右边在赋值,此时的等号左边x没有值,没有值的情况下+1 在赋值给x 显然是不正确的,故在x += 1 时出现了报错
是因为,先引用后赋值产生的,而python动态语言是赋值才算定义,才能被引用。解决办法,在语句全增加一句辅助语句即可,或者使用global告诉内部作用域,去全局作用域查找变量定义
内部作用域使用的 变量 赋值语句 会重新定义局部作用域使用的变量,但是,一旦这个作用域中使用global声明的变量为 全局的,那么相当于 在为全局作用域的变量赋值
global使用原则
外部作用域变量会在内部作用域可见,但也不雅在这个内部的局部作用于中被直接使用,因为函数的目的就是为了封装,尽可能与外界隔离
如果函数需要使用外部全局变量,请使用函数的形参传参解决
一句话:不用global
闭包
自由变量:
未在本地作用域定义的变量 即定义在内层函数之外的 外层函数作用域中的变量
闭包
就是一个概念,出现在嵌套函数中
内层函数引用了外层函数的自由变量,从而形成了闭包
使用global可以解决,但是这使用的是全局变量,而不是闭包
如果对普通变量闭包,python3 可以使用nonlocal
nonlocal关键字
使用nonlocal关键字,将变量标记为不再本地作用域定义,而在上级的某一级局部作用域中定义,但不能是全局作用域中的定义
默认值作用域
默认值的值是引用的它们在内存中的地址
当默认值的值为非引用类型时,他们的值是不变的。当他们为引用类型时,它们指向的是其内存中的地址,其中的值会发生变化,它们的默认值地址并没有发生变化,还是引用的那个内存地址。这是的默认值就会发生变化
函数地址并没有变,就是说函数这个对象没有变,调用它,它的属性defaultz在使用元祖保存默认值
xyz默认值是引用类型,引用类型元素的变动,并不是元组的变化
属性defaults中使用元组保存所有位置参数默认值,它不会因为在函数体内使用了它而发生变化
属性defaults中使用元组保存所有位置参数默认值
属性kwdefaults中使用字典保存所有keyword-only参数的默认值
使用默认值的方法
一:使用影子拷贝创建一个新的对象,永远不能改变传入的参数
二:通过值得判断就可以领过选择创建或者修改传入对象
这种方式,灵活、被广泛应用
很多函数的定义,都可以看到适应None这个不可变的值作为默认参数,这是一种惯用法
变量名解析原则LEGB
local,本地作用域,局部作用域的local命名空间。函数调用时创建,调用结束消亡
Enclosing,实现了闭包,这个就是嵌套函数的外部函数的命名空间
Global全局作用域,即一个模块的命名空间,模块被import时,创建,解释器退出时消亡
Build-in,内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡
顾名思义 LEGB就是其查找的顺序,就近原则
函数的销毁
全局函数销毁
重新定义同名函数、del语句删除函数对象、程序结束时
局部函数销毁
重新在上级作用域定义同名函数、del语句删除函数名,函数对象的引用计数减1、上级作用域销毁时
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。