函数返回值,作用域
Python函数使用return语句返回“返回值”
函数一定有返回值。没有return 语句,隐式调用return None
一个函数可以存在多个return语句,但只执行一条,如果一条return都没有执行,就隐式调用return None
如果有必要,可以调用return None,可以简写为return
return直接返回函数,return之后的语句不再执行其他语句不再执行
return 是函数结束标志,返回值只有一个,只返回一次,
return的内容要包装在容器中,没有用元组包
嵌套函数
函数可见范围,就是作用域
内部函数不能在外部使用,不可见,会抛NameError
标识符的可见范围,就是作用域,一般说常量的作用域
全局作用域 在整个程序运行环境中都可见
局部作用域 在函数,类内可见,局部变量使用范围不能超过其所在的局部变量
赋值即重新定义
本地变量作用域作用于整个函数,函数内上方调用时受下方的x的重新定义的影响,不会去上一层函数引用
global 全局变量,
将当前作用域内的变量声明为使用外部的全局变量,全局变量中没有就新建变量,如果是引用没有就报错,
只到全局寻找变量,不到enclosing,
global放在局部作用域相当于全局作用域操作变量
函数使用为了封装,尽量与外界隔离,如果需要使用全局变量,使用形参传参解决
函数中少使用全局变量
闭包:
自由变量:未在本地作用域中定义的变量,例如定义在内层函数外的外层函数的作用域中的变量。
闭包的概念:出现在嵌套函数中,指内层函数用到了外层函数的作用域中的自由变量,就形成了闭包
nonlocal 在外层定义,不能是全局作用域。
内层函数调用外层的自由变量,直接使用就形成闭包,重新定义就要使用nonlocal
使用了nonlocal关键字,将变量标记为不在本地作用域,而在上级某一级的局部作用域中定义,但不能是全局作用域中
默认值的作用域,
函数也是对象,Python中 把函数的默认值放在了属性中,这个属性就伴随着这个函数对象的整个生命周期
查看属性foo.__defaults__
如果默认值是引用类型,变动其中的内容,不会改变引用类型的地址。
属性保存在元组中保存位置参数的默认值,不会在函数体运行中改变。
属性__default__中保存元组中的所有位置参数默认值,
属性__kwdefault__中保存元组中的所有keyword-only参数默认值,
使用可变类型做默认值,就能修改这个默认值,根据情况决定使用与否
可以使用影子拷贝创建新对象,但不能改变传入的参数
使用None作为默认缺省值。通过值得判断,就可以灵活创建或者修改传入的对象,较为常用
变量名解析原则LEGB
Local:本地作用域,局部作用域的 local 命名空间,函数调用时创建,调用结束消亡。
Enclosing:python2.2 时引入了嵌套函数,实现了闭包,这个就是嵌套函数的外部函数的命名空间
Global:全局作用域,即一个模块的命名空间,模块被import时创建,解释器退出时消亡
Build-in:内置模块的命名空间,生命周期从python解释器启动时创建到解释器退出时消亡,如:print(open),printhe open都是内置的变量
函数销毁
全局函数:
同名函数覆盖
del 函数名 删除函数标识符,而非函数对象,引用计数减一。
程序结束时
局部函数:
重新在上级作用域定义同名函数
del 语句删除函数名称,函数对象的引用计数减一
上级作用域销毁时