函数对象,名称空间和作用域
目录
函数对象
python中一切皆对象
引用
def f1():
print('from f1')
func = f1
print('f1:', f1)
print('func', func)
# 打印结果:
f1: <function f1 at 0x000002110991D268>
func <function f1 at 0x000002110991D268>
作为函数参数
def f1():
print('from f1')
def f2(f2_f1):
print('f2_f1:', f2_f1)
f2(f1)
print('f1:', f1)
# 打印结果:
f2_f1: <function f1 at 0x000001E47029D268>
f1: <function f1 at 0x000001E47029D268>
作为函数返回值
def f1():
print('from f1')
def f2(f2_f1):
return f2_f1
res = f2(f1)
print('res:', res)
print('f1:', f1)
# 打印结果:
res: <function f1 at 0x0000019F13E7D268>
f1: <function f1 at 0x0000019F13E7D268>
作为容器类元素
def f1():
print('from f1')
lt = [f1, 12, 3, 4, 5]
lt[0]()
小练习
def pay():
print('支付1e成功')
def withdraw():
print('提现2e成功')
dic = {
'1': pay,
'2': withdraw
}
while True:
msg = '''
'1': 支付,
'2': 提现,
'3': 退出,
'''
print(msg)
choice = input('>>: ').strip()
if choice == '3':
break
elif choice in dic:
dic[choice]()
函数的嵌套
函数里面嵌套函数
def f1():
print('from f1')
def f2():
print('from f2')
f2()
f1()
名称空间和作用域
名称空间
内置名称空间
存储了内置方法的空间
数据类型内置方法;python解释器自带的方法(print / len / list / str / dict)
全局名称空间
除了内置和局部都叫全局
局部名称空间
函数内部定义的都叫局部
名称空间的执行(生成)的顺序
- 内置名称空间:python解释器启动的时候就有了
- 全局名称空间:执行文件代码的时候才会有全局
- 局部名称空间:函数调用的时候才会有局部
搜索顺序
从当前位置查找,找不到按照这种顺序,不会逆向寻找:局部 > 全局 > 内置 > 报错
作用域
全局作用域
内置名称空间 +全局名称空间 --> 全局作用域
局部作用域
局部名称空间 --> 局部作用域
- 全局作用域的 x 和局部作用域 x 没有任何关系
- 局部作用域1 的 x 和局部作用域2 的 x没有任何关系,即使局部作用域1和局部作用域2在同一个局部作用域下
global关键字
x = 10
def func():
global x
x = 20
func()
print(x) # 打印20
nonlocal关键字
x = 10
def f1():
x = 2
def f2():
nonlocal x # nonlocal让x成为额顶层函数的局部,不是让它成为全局
x = 30
f2()
print(x)
f1()
# 打印30
注意点
所有可变数据类型均可打破上述一切规则
lt = [10]
def f1():
lt.append(20)
f1()
print(lt)
# 打印结果:
[10,20]