函数对象,名称空间和作用域

函数对象

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)

全局名称空间

除了内置和局部都叫全局

局部名称空间

函数内部定义的都叫局部

名称空间的执行(生成)的顺序

  1. 内置名称空间:python解释器启动的时候就有了
  2. 全局名称空间:执行文件代码的时候才会有全局
  3. 局部名称空间:函数调用的时候才会有局部

搜索顺序

从当前位置查找,找不到按照这种顺序,不会逆向寻找:局部 > 全局 > 内置 > 报错

作用域

全局作用域

内置名称空间 +全局名称空间 --> 全局作用域

局部作用域

局部名称空间 --> 局部作用域

  • 全局作用域的 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]

猜你喜欢

转载自www.cnblogs.com/setcreed/p/11566637.html