Python函数高级
函数对象
在面向对象编程中 一切皆对象
函数在python中是第一类对象
-
函数可以这么用
-
可以被引用
def func(): print('hello world !') f=func f()
-
可以当做参数传入
def func(): print('hello world !') def func1(func): print('hello China !') func() f = func1(func)
-
可以当做函数的返回值
a = 1 def func(): return a res = func() print(res) 1
-
可以当做容器类型的元素
def register(): print("注册") def login(): print("登录") def check(): print("查看") l = [register,login,check] l[0]()
-
函数的嵌套
-
函数的嵌套调用
在函数内调用了其他函数
def func(): print('hello world !') def func1(func): print('hello China !') func() f = func1(func)
-
函数的嵌套定义
在函数内又定义了其他函数,定义在函数内部的函数只能在函数内部用
def func(): print("hello world !") def func1(): print("hello China")
名称空间(name space)
-
定义
专门存名字的空间,存放名字与值绑定关系 (名字和地址)的地方。
-
分类
-
内置名称空间(print、len、max)
-
内置名称:存放python解释器自带的名字
-
生效与失效:在解释器启动时即生效,解释器关闭时失效
-
-
全局名称空间
-
全局名称:文件级别的名字(顶头写的)即不是内置名称也不是局部名称就是全局名称
-
生效与失效:在执行文件时生效,在所有文件结束或在执行期间被删除,则失效。
-
-
局部名称空间
-
局部名称:在函数内的名称就是局部名称
-
生效与失效:调用时产生,函数结束时结束。函数内的名字和参数都存放于局部空间
-
名称空间的加载顺序:内置 >>> 全局 >>> 局部
名称空间的查找顺序:局部 >>> 全局 >>> 内置
-
作用域
-
定义:域》指的是区域,范围的意思,作用域即不同名称作用的范围
-
全局作用域:包含内置名称空间和全局名称空间的名字
-
特点:在任何位置都能访问得到
该范围内的名字会伴随程序整个生命周期
-
-
局部作用域:包含局部名称空间的名字
-
特点:只能在函数内使用
-
调用时生效,调用结束时失效
globals(查看全局作用域中的内容) 表示的全局范围 就是所谓的全局作用域
print(dir(globals()["__builtins__"]))
locals(查看局部作用域中的内容)要注意的是你在全局中使用locals看到的就是全局的内容,与globals没有什么区别。
print(locals()) # 在全局中查看作用域,相当于globals def func(): a = 100 print(locals()) # 在局部空间查看作用域 func()
global:明确声明,要使用全局中的名称
nonlocal:明确声明,要使用上一层中的名称,如上一层没有则找上上层,但是注意 不能找到全局中
注意:你在全局中使用locals 看到的就是全局的内容
-
闭包函数
-
定义:定义在函数内部的函数,并且该函数包含对外部函数作用域中名字的引用,该函数称为闭包函数
-
作用域关系在函数定义阶段就规定死了,与调用位置无关。
def outer(): a = 1 def inner(): print(a) return inner