一、函数对象
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(): pass def foo(x): return x res = 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 = 1
def func():
print(x)
x = 10
func()
10
2.2 作用域
定义:作用的区域
注意:
-
作用域关系在函数定义阶段就固定了,与函数调用无关。
-
在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
1. 全局作用域
全局有效,全局存活,包含内置名称空间和全局名称空间。
x = 1
def 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 = 1
def f1():
x = 2
def f2():
global x # 修改全局
x = 3
f2()
f1()
print(x)
3
- nonlocal
# 修改局部作用域中的变量
x = 1
def 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 m
def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,d)
return res3