一、函数对象
1.1 第一类对象概念
- 可在运行期创建
- 可用作函数参数或返回值
- 可存入变量的实体
1.2 函数对象的四大功能
引用
知识兔def func(): pass f = func print(f)
<function func at 0x000002765A812E18>
当做参数传给一个函数
def func(): print('abc')def foo(x): x()foo(func)
abc
当做函数的返回值
def func(): passdef foo(x): return xres = foo(func)print(res)
<function func at 0x0000028A692A2E18>
当做容器类型元素
def func(): print('abc')function_list = [func]function_list[0]()
二、名称空间和作用域
2.1名称空间
定义:内存中的储存变量名与变量间绑定关系的空间。
1. 内置名称空间
作用:存放python解释器自带的名字。
生命周期:解释器启动时生效,关闭时失效。
2. 全局名称空间
作用:除了内置和局部的名字之外,其余都存放在全局名称空间。
生命周期:文件执行时生效,文件执行结束后失效。
3. 局部名称空间
作用:存放函数调用期间函数体产生的名字。
生命周期:文件执行时函数调用期间生效,函数执行结束后失效。
4. 加载顺序
内置(程序运行前加载)>>>全局(从上到下加载)>>>局部(调用时加载)
5. 查找顺序
局部>>>全局>>>内置
x = 1def func(): print(x)x = 10func()
10
2.2 作用域
定义:作用的区域
注意:
作用域关系在函数定义阶段就固定了,与函数调用无关。
在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
1. 全局作用域
全局有效,全局存活,包含内置名称空间和全局名称空间。
x = 1def bar(): print(x) bar()
1
2. 局部作用域
局部有效,临时储存,只包含局部名称空间
def f1(): def f2(): def f3(): print(x) x = 2 f3() f2()f1()
2
3. global和nonlocal
- global
# 修改全局作用域中的变量x = 1def f1(): x = 2 def f2(): global x # 修改全局 x = 3 f2()f1()print(x)
3
- nonlocal
# 修改局部作用域中的变量x = 1def f1(): x = 2 def f2(): nonlocal x x = 3 f2() print(x)f1()
2
三、函数嵌套
# 求四个数中的最大值def max2(x,y): m = x if x>y else y return mdef max4(a,b,c,d): res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3