• python函数篇:名称空间、作用域和函数的嵌套


    一、名称空间:(有3类)

    (1)内置名称空间(全局作用域)

    (2)全局名称空间(全局作用域)

    (3)局部名称空间(局部作用域)

    关于名称空间的查询:

    x=1
    def func():
        print('from func')
        x=2
        a=1
        b=2
        print(globals())#打印全局名称空间
        print(locals())#打印局部名称空间
    
    func()
    

      执行结果是:

    from func
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000026F9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x00000000028BB8C8>}
    {'b': 2, 'a': 1, 'x': 2}
    

     

    查询名称空间的全局变量:globals()
    查询名称空间的局部变量:locals()
    查询局部变量,只能在局部使用,在全局使用时,局部变量的查询结果和全局变量的查询结果一致
    示例:
    x=1
    def func():
        print('from func')
        x=2
        a=1
        b=2
        print(globals())#在局部打印全局
        print(locals())#在局部打印局部
    
    func()
    a=globals()
    print(a)#在全局打印全局
    b=locals()
    print(b)#在全局打印局部
    print(a == b)#判断在全局打印局部和全局的结果是否一致
    

    执行结果是:(验证了:查询局部变量,只能在局部使用,在全局使用时,局部变量的查询结果和全局变量的查询结果一致)

    from func
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>}
    {'b': 2, 'a': 1, 'x': 2}
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>, 'a': {...}}
    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000005B9550>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/飞秋/徐圆圆课程视频/Python fullstack s4 基础篇-day21/day21/名称空间的查询.py', '__cached__': None, 'x': 1, 'func': <function func at 0x0000000001EBB8C8>, 'a': {...}, 'b': {...}}
    True
    

      

     

    全局与局部变量

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
    当全局变量与局部变量同名时:
    在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
     
     
    示例:
    x=1   #x=1为全局作用域
    def foo():
        x=20 #x=20为局部作用域
        print(x)
    foo() #函数执行时,首先去局部找x的变量值,故打印结果为20
    
    print(x)#输出的x是全局变量内的x,函数内的x与全局的x无关,故打印结果为1
    

     打印结果是:

    20
    1
    

    总结:

    关于函数的作用域找名称的查询顺序是:

    先去局部找,局部没有的话,再去全局查找,全局没有的话,再去内置找(先局部在全局最后内置)

     

     

    二、函数的嵌套:(2个方面)

    (1)、函数的嵌套调用:(函数内调用之前定义好的函数)

    示例:

    # 函数的调用:
    def my_max(x,y):
        res=x if x>y else y#比较x和y的大小,取较大值
        return res
    
    def my_max4(a,b,c,d):
        res1=my_max(a,b)#调用上面的函数,将最大值取出
        res2=my_max(res1,c)#调用上面的函数,将最大值取出后和c比较取最大值
        res3=my_max(res2,d)#调用上面的函数,将最大值取出后和d比较取最大值
        return res3
    print(my_max4(1,2,3,4))
    

     执行结果是:

    4

    (2)、函数的嵌套定义:(即函数内再定义函数)

    示例:

    def foo1():
        x=1
        print("foo1",x)
        def foo2():
            x=2
            print("foo2",x)
            def foo3():
                x=3
                print("foo3",x)
            foo3()
        foo2()
    foo1()
    

    执行结果是:

    foo1 1
    foo2 2
    foo3 3
    

      

     

     

     

  • 相关阅读:
    Log4Net 发布后不能用
    主机ping不通虚拟机
    c# Delegate 和 Events
    ADO.NET
    .NET Windows Service
    Linux 常用命令三 touch mkdir
    Linux 常用命令二 pwd cd
    Linux 常用命令一 ls
    python 面向对象六 动态添加方法 __slots__限制动态添加方法
    python 面向对象六 类属性和实例属性
  • 原文地址:https://www.cnblogs.com/xuyuanyuan123/p/6684957.html
Copyright © 2020-2023  润新知