Python函数嵌套

内部函数的特点:
    1. 可以访问外部函数的变量
    2. 内部函数可以修改外部函数的可变类型的变量比如:list
    3. 内部函数修改全局的不可变的变量时,需要在内部函数声明:global 变量名
        内部函数修改外部函数的不可变的变量时,需要在内部函数中声明:nonlocal 变量名

global      作用:将一个局部变量,设定为全局变量
            注意1:当设定完global之后,需要去调用这个函数,global关键字才会生效。
            注意2:全局变量如果是不可变在函数中进行修改需要添加global关键字; 如果全局变量是可变的,在函数中修改的时候就不需要添加global

nonlocal    作用:将一个外部函数变量,设定为全局变量
            表示设定一个函数中的局部变量,不再仅仅可以在局部作用域中使用,也可以以在其子函数中使用

locals()    查看本地变量有哪些,以字典的形式输出

globals()   查看全局变量有哪些,椅子垫的形式输出(注意里面会有一些系统的键值对)

# 函数嵌套示例
a = 100                 # 全局变量
print(globals())        # 查看全局变量
def func():             # 函数
    b = 99              # 外部函数变量
    def inner_func():   # 内部函数
        nonlocal b      # 将一个外部函数变量(b),设定为全局变量
        global a        # 将一个局部变量(a),设定为全局变量
        c = 88          # 内部函数变量
        # 尝试做修改操作
        c += 12
        b += 1
        a += 100
        # 尝试打印
        print(a, b, c)  # 只打印,不修改外部函数或者全局变量时不需要声明nonlocal或者global
    inner_func()        # 调用内部函数
    print(locals())     # 查看本地变量
# 调用外部函数
func()      ---> 200 100 100

函数嵌套练习

给列表里面的元素全部加5

def func():
    n = 100     # 局部变量
    list1 = [3, 6, 9, 4]        # 局部变量

    # 声明内部函数
    def inner_func():
        nonlocal n
        # 对list1里面的元素进行加5操作
        for index, i in enumerate(list1):
            list1[index] = i + n
        list1.sort()

        # 修改n变量
        n += 100

        # 打印结果
        print(list1)
        print(n)
    # 调用内部函数
    inner_func()

# 调用
func()
[103, 104, 106, 109]
200

global 与 nonlocal的使用场景

a = 100     # 全局变量
print(globals())
def func():
    b = 99

    def inner_func():
        global a        # 修改全局变量使用global
        nonlocal b      # 修改外部函数变量使用nonlocal
        c = 88
        # 修改
        c += 12
        b += 1
        a += 10
        print(a, b, c)

    # 调用内部函数
    inner_func()

    # 使用locals() 内置函数进行查看,可以看到在当前函数中声明的内容有哪些
    # locals是一个字典{key: value}
    print(locals())

# 调用函数
func()
{'__name__': '__main__', '__doc__': '函数嵌套', '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000024B9695A400>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Python/Code/.Python基础/day16/func07.py', '__cached__': None, 'a': 100}
110 100 100
{'inner_func': <function func.<locals>.inner_func at 0x00000133749749D8>, 'b': 100}
Last modification:August 8th, 2020 at 06:19 pm
如果觉得我的文章对你有用,请随意赞赏