Python中内部函数 & 闭包

1、内部函数

def func():
    # 声明变量
    n = 100
    list1 = [1,2,3,4]
    #声明内部函数
    def inner_fnc():
        #对列表list1里面的元素进行加5操作
        for index,i in enumerate(list1):
            nonlocal n
            n = 99
            list1[index] = i+ 5
    list1.sort()
    inner_fnc()
    print(list1)
    print(n)
func()
#输出结果为:
[6, 7, 8, 9]
99
  1. 内部函数可以访问外部函数变量,如果内部函数要修改外部函数的变量时,需要注意以下几点:

    1. 当外部函数变量为不可改变的类型时,内部函数需要修改需要加nonlocal关键字声明。
    2. 当外部函数变量为可变类型时,内部函数可以调用,不需要加任何关键字。
    3. 可变类型与不可变类型可以参考:Python中可变与不可变类型
  2. 查看局部变量和全局变量

    1. 使用locals()系统函数可以查看当前函数中声明的内容有哪些,并以字典形式输出。
    2. 使用globals()系统函数可以查看全局变量有哪些,以字典形式输出。(里面会有系统的键值对)

2、闭包

  1. 闭包符合的条件:

    1. 外部函数中定义了内部函数。
    2. 外部函数是有返回值的。
    3. 返回值是:内部函数名
    4. 内部函数引用了外部函数的变量(严格定义)
    #示例:
    def func():
        a = 200
        def inner_func():
            b = 99
            print(a,b)
        return inner_func
    x = func()
    x()
    #输出结果为:
    200 99
    
  2. 闭包的作用

    1. 可以使用同级的作用域
    2. 读取其他元素的内部变量
    3. 延长作用域
  3. 闭包的应用:计数器(能够返回闭包时的状态)

    def generate_count():
    	cotainer = [0]
    	def add_one():
        cotainer[0] = cotainer[0] + 1
        print('当前是第{}次访问'.format(cotainer[0]))
    	return add_one
    counter = generate_count()
    counter()
    counter()
    #输出结果为:
    当前是第1次访问
    当前是第2次访问
    
  4. 闭包的缺点

    1. 作用域没有那么直观。
    2. 变量不会被垃圾回收,有一定的内存占用问题。
发布了84 篇原创文章 · 获赞 36 · 访问量 4558

猜你喜欢

转载自blog.csdn.net/qq_41475583/article/details/104875156