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

目录

  • 函数对象
    • 引用
    • 作为函数参数
    • 作为函数返回值
    • 作为容器类元素
    • 小练习
  • 函数的嵌套
  • 名称空间和作用域
    • 名称空间
      • 内置名称空间
      • 全局名称空间
      • 局部名称空间
      • 名称空间的执行(生成)的顺序
      • 搜索顺序
    • 作用域
      • 全局作用域
      • 局部作用域
    • global关键字
    • nonlocal关键字
    • 注意点

函数对象

python中一切皆对象

引用

def f1():
    print('from f1')
    
func = f1
print('f1:', f1)
print('func', func)

# 打印结果:
f1: 
func 

作为函数参数

def f1():
    print('from f1')


def f2(f2_f1):
    print('f2_f1:', f2_f1)

f2(f1)
print('f1:', f1)

# 打印结果:
f2_f1: 
f1: 

作为函数返回值

def f1():
    print('from f1')
    
    
def f2(f2_f1):
    return f2_f1

res = f2(f1)
print('res:', res)
print('f1:', f1)

# 打印结果:
res: 
f1: 

作为容器类元素

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]

你可能感兴趣的:(函数对象,名称空间和作用域)