chapter4.2、函数返回值

函数返回值,作用域

  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 语句删除函数名称,函数对象的引用计数减一

      上级作用域销毁时

posted on 2018-08-29 22:50  Riper  阅读(143)  评论(0编辑  收藏  举报

导航