• 函数名本质、函数命名空间和作用域链


    函数对象(函数名本质)

    1.函数名传递,可以被引用
    # def name():
    #     print('what is u name')
    # jinpan = name
    # jinpan()
    
    
    2.可以被当作容器类型的元素
    # def name():
    #     print('my name is jinpan')
    #
    #
    # def my_name():
    #     str = 'my name is jinpan'
    #     return str
    #
    #
    # list_clutter = [True,(1,),{'teacher':'jason'},name,my_name,name(),my_name()]
    # print(list_clutter)
    
    
    3.函数名作为参数传入并调用
    # def jinpan():
    #     print('my name is jinpan ')
    #
    # def name(jipan):
    #     print('what is u name')
    #     jinpan()
    #     print(jinpan)
    #     print(id(jipan))
    #
    #
    # res = jinpan
    # name(res)
    
    
    4.函数名作为返回值返回
    # 返回自己例子
    # def name():
    #     print('what is u name')
    #     return name
    #
    # res = name()
    # res()
    
    # 返回其他函数例子
    # def jinpan():
    #     print('hello my name is jinpan')
    #
    #
    # def name():
    #     print('what is u name')
    #     return jinpan
    #
    # res = name()
    # res()

    函数的嵌套

    # 在函数内部调用其他函数
    # 可以将复杂的逻辑简单化
    # def index():
    #     func()
    #     print('index')
    #
    # def func():
    #     # index()
    #     print('func')
    # index()
    
    
    # def my_max(x,y):
    #     if x > y:
    #         return x
    #     return y
    #
    # def my_max4(a,b,c,d):
    #     res1 = my_max(a,b)
    #     res2 = my_max(res1,c)
    #     res3 = my_max(res2,d)
    #     return res3
    # print(my_max4(1,2,10,4))


    # def outer():
    # x = 1
    # print('outer')
    # def inner():
    # print('inner')
    # # print(inner)
    # return inner
    #
    # res = outer()
    # # print(res)
    # res()

    命名空间和调用介绍

    命名空间一共分为三种:
    
      全局命名空间
    
      局部命名空间
    
      内置命名空间
    
    内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
    全局名称空间:文件级别的代码
    局部名称空间:函数体内创建的名字都属于局部名称空间
    

    加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

    
    

    取值:

    在局部调用:局部命名空间->全局命名空间->内置命名空间

    在全局调用:全局命名空间->内置命名空间


    命名空间的生命周期: 内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁 全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁 局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)

    命名名称空间的查找原则

    函数在定义阶段查找名字的顺序就已经固定了 不会因为函数的调用位置变化而改变(******)
    在局部调用:局部命名空间->全局命名空间->内置命名空间
    在全局调用:全局命名空间->内置命名空间

    函数的作用域

    # 全局作用域
    # 全局有效: 内置名称空间  全局名称空间
    
    
    # 局部作用域
    # 局部有效   局部作用域
    
     global nonlocal
    """
    1.在局部修改全局的变量
    """
    
    
    
    # global 在局部修改全局的不可变数据类型
    # x = []  # 因为列表是可变类型
    x = 1  # 不可变类型
    username = 'jason'
    def func():
        # x.append('嘿嘿嘿')
        global x,username  # 修改全局变量 而不是创建局部名称空间
        x = 999
        username = 'egon'
    func()
    print(x)
    print(username)
    
    
    
    # nonlocal  局部修改局部
    def func():
        x = 1
        def index():
            nonlocal x
            x = 2
        index()
        print(x)
    func()
    
    
    """
    global:局部修改全局 如果想修改多个 逗号隔开
    nonlocal:局部修局部 如果想修改多个 逗号隔开
    
    """

    实例+个人理解

    # 函数内定义函数应用场景
    """
    写一个函数
    该函数用户可以通过传参的不同控制函数执行不同的功能
    """
    
    def all_func(type):
        def register():
            print('register...')
        def login():
            print('login....')
        def shopping():
            print('shopping...')
        if type == '1':
            register()
        elif type == '2':
            login()
        elif type == '3':
            shopping()
        else:
            print('type value error')
    while True:
        choose = input('input 1~3 : int >>>>:')
        all_func(choose)
  • 相关阅读:
    支付业务的数据库表的设计
    数据库设计的一些参考(来源网上的一些帖子,仅供作者本人参考)
    Delphi 10.2的 更新说明,所有官方资料:新特征和Bugfix列表,所有工具开发说明
    日本太笨了,以小目标发动大战争,而且偷袭时候如小贼入室,一旦得手就仓皇逃窜
    理论经典:TCP协议的3次握手与4次挥手过程详解
    C++没有库则寸步难行,有库则几乎可以做任何事情——Bjarne Stroustrupi
    Ruby已经慢慢走向衰退了,那些年代久远而且小众的语言没有翻身的可能性
    前端面试题精选
    Spring MVC 基础
    NET WEB
  • 原文地址:https://www.cnblogs.com/jinpan/p/11165160.html
Copyright © 2020-2023  润新知