欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-25 22:29:14
[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)

全局名称空间

除了内置和局部都叫全局

局部名称空间

函数内部定义的都叫局部

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

  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]