zoukankan      html  css  js  c++  java
  • Python3-2020-测试开发-16- 嵌套函数(内部函数 )&nonlacal声明外部函数的局部变量&LEGB规则

    一、嵌套函数(内部函数 )

    作用:1.封装-数据隐藏,外部无法访问“嵌套函数”;2.避免重复代码使用3.闭包

    def printName(isChinese,name,familyName):
    
        def inner(a,b):
    
            print("{0}{1}".format(a,b))
    
        if isChinese:
    
            inner(name,familyName)
    
        else:
            inner(familyName,name)
    
    
    printName(True,"","")
    printName(False,"lusy","tony")

    输出:

    褚六
    tonylusy

    二、nonlacal声明外部函数的局部变量

    2.1 不可修改外部函数的局部变量

    def outer01():
    
        b = 10
    
        def inner():
    
            print("inner ",b)
            b = 20             # local variable 'b' referenced before assignment
        inner()
    
    outer01()

    输出:

    local variable 'b' referenced before assignment

    2.2 使用nonlacal,可修改变量

    def outer02():
    
        b = 10
    
        def inner():
    
    
            nonlocal b       # nonlacal声明外部函数的局部变量
            print("inner ",b)
            b = 20              
        inner()
    
    outer02()

    三、LEGB规则

    """
    Python在查找“名称”时,是按照LEGB规则查找的
    Local ---> Enclosed ---> Global ---> Built in
    Local 指的是函数或者类的方法内部
    Enclosed 指的是嵌套函数(一个函数包裹另一个函数,闭包)
    Global 指的是模块中的全局变量
    Built in 指的是Python为知己保留的特殊名称

    如果某个name映射在局部(local)命名空间中咩有找到,接下来会在闭包作用域(enclosed)进行搜索
    如果闭包作用域也没有找到,Python就会到全局(Global)命名空间中进行查找,最后会在内建(built in )命名空间查找
    如果一个名称在所有命名空间中都没有找到,就会产生一个NameError
    """

    3.1 Local
    def legb_outer01():
    
        str = "b"
        def inner():
            str = "a"
            print(str)     # a
    
        inner()
    
    legb_outer01()

    3.2 Enclosed

    def legb_outer02():
    
        str = "b"
        def inner():
            # str = "a"
            print(str)     # b
    
        inner()
    
    legb_outer02()

    3.3 Global

    str = "c"
    def legb_outer03():
    
        # str = "b"
        def inner():
            # str = "a"
            print(str)     # c
    
        inner()
    
    legb_outer03()

    3.4 Built in

    # str = "c"
    def legb_outer04():
    
        # str = "b"
        def inner():
            # str = "a"
            print(str)     # <class 'str'>
    
        inner()
    
    legb_outer04()
  • 相关阅读:
    缺陷笔记
    Eclipse中常用快捷键
    PL/SQL中复制粘贴表结构信息
    request之setAtrribute
    list+map
    套接字初始化失败问题
    上机编程题(2016校招)
    动态规划
    VS中碰到的问题
    IE8添加元素报错《没有权限》错误
  • 原文地址:https://www.cnblogs.com/chushujin/p/13055987.html
Copyright © 2011-2022 走看看