• 函数(二)


    函数的嵌套

    定义

    函数内部定义的函数,无法在函数外部使用内部定义的函数

    def f1():
    	def f2():
    		print('from f2')
    	f2()
    f2()
    
    def f1():
    	def f2():
    		print('from f2')
    f1()
    
    from f2
    

    圆的面积周长

    from math import pi
    def circle(radius,action='area'):
        def area():
            return pi*(radius**2)
        def perimeter():
            return 2*pi*radius
        if action=='area':
            return area()
        else:
            return perimeter()
    print(f'circle(10):{circle(10)}')
    print(f"circle(10,action='perimeter'): {circle(10,action='perimeter')}")
    

    名称空间与作用域

    定义

    内存中有一块内存存储变量名与变量间绑定关系的空间,称为名称空间

    内置名称空间

    存放python解释器自带的名字

    生命周期:解释器启动时生效,关闭失效

    全局名称空间

    处内置与局部的名字之外,其余都存放在全局名称空间

    局部名称空间

    用于存放函数调用期间函数体产生的名字
    生命周期:函数调用期间生效,函数执行结束后失效

    def f1():
    	def f2():
    		print('from f2')
    		f2()
    f1()
    

    加载顺序

    内置-全局-局部

    查找顺序

    当为局部名称空间:局部-全局- 内置

    x = 1
    y = 2
    len = 100
    
    
    def func():
        y = 3
        len = 1000
        print(f"y: {y}")
        print(f"len: {len}")
        # print(a)  # NameError: name 'a' is not defined
    
    
    func()
    
    y: 3
    len: 1000
    
    x = 1
    
    
    def func():
        print(x)
    
    
    x = 10
    func()
    
    10
    

    作用域

    域指的是区域,作用域即作用区域

    全局作用域

    全局作用域:全局有效,全局存活,包含内置名称空间和全局名称空间。

    x = 1
    
    
    def bar():
        print(x)
    
    
    bar()
    
    1
    
    局部作用域

    局部作用域:局部有小,临时存储,只包含局部名称空间

    def f1():
        def f2():
            def f3():
                print(x)
            x = 2
            f3()
        f2()
    
    
    f1()
    
    2
    

    注意:作用域关系在函数定义阶段就固定死了,与函数的调用无关

    # 作用域注意点
    x = 1
    
    
    def f1():  # 定义阶段x=1
        print(x)
    
    
    def f2():
        x = 2
        f1()
    
    
    f2()
    
    1
    

    补充:global:修改全局作用域中的变量

    ​ nonlocal修该局部作用域中的变量

    x = 1
    
    
    def f1():
        x = 2
    
        def f2():
            #         nonlocal x
            x = 3
    
        f2()
        print(x)
    
    
    f1()
    
    2
    
    x = 1
    
    
    def f1():
        x = 2
    
        def f2():
            nonlocal x
            x = 3
    
        f2()
        print(x)
    
    
    f1()
    
    3
    

    注意:

    1. 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。

    2. 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。

  • 相关阅读:
    文件系列--截取路径字符串,获取文件名
    ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同
    大小写字母,特殊字符,数字,四选一组合或者全组合,长度至少八位,验证
    设计模式-23种设计模式介绍
    &和&&区别
    GridView中Button多参数传参
    HTTP 错误 500.19
    Windows系统添加端口号
    win10安装IIS服务
    2019最新整理PHP面试题附答案
  • 原文地址:https://www.cnblogs.com/1naonao/p/10952257.html
Copyright © 2020-2023  润新知