函数对象,名称空间和作用域
程序员文章站
2022-06-22 10:42:42
[TOC] 函数对象 python中一切皆对象 引用 作为函数参数 作为函数返回值 作为容器类元素 小练习 函数的嵌套 函数里面嵌套函数 名称空间和作用域 名称空间 内置名称空间 存储了内置方法的空间 数据类型内置方法;python解释器自带的方法(print / len / list / str ......
目录
函数对象
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]