zoukankan      html  css  js  c++  java
  • 函数对象,名称空间和作用域

    函数对象

    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]
    
  • 相关阅读:
    微软警告:“大规模电子邮件活动”正在推动勒索软件感染
    静态莫队分块
    可持久化线段树练习题
    KMP的一些好题
    KMP模式匹配
    最大异或路径
    人类分块精华(Ex)
    人类分块精华(二)
    人类分块精华(一)
    Treap 详解
  • 原文地址:https://www.cnblogs.com/setcreed/p/11567684.html
Copyright © 2011-2022 走看看