zoukankan      html  css  js  c++  java
  • 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
    

      

     

     

     

  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/xuyuanyuan123/p/6684957.html
Copyright © 2011-2022 走看看