1 # File : learning_011_closures.py 2 # Datetime : 2022/4/14 1:22 3 4 5 # 闭包 6 # 一般情况下,如果一个函数结束,函数的内部所有东西都会释放掉,局部变量都会消失。 7 # 但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。 8 9 # 1. 函数的闭包 10 # 在python中,一个函数内部再定义一个其他函数,将外部函数作为其嵌套内部函数的引用环境, 11 # 并且在内部函数处理期间外部函数的引用环境一致都会保持不变, 12 # 这种将内部函数与外部函数作为整体处理的函数嵌套结构在程序设计中称为闭包. 13 # 代码示例: 14 def outer(a): # 定义外部函数 15 print("a = %d" % a) 16 17 def inner(b): # 定义内部函数 18 print("b = %d" % b) 19 return a + b # a为外部函数的参数,与内部函数的参数b相加 20 21 return inner # 返回内部函数对象 22 23 24 result = outer(10) # 接收外部函数对象 25 print(result(11)) # result(11)执行内部函数inner() 26 27 28 # 在outer函数内部嵌套了inner函数,inner函数可以使用外部函数outer中传入的参数, 29 # 在获取内部函数时,首先通过外部函数返回了内部函数的引用给对象result, 30 # 这样result就代表了inner内部函数,当result()执行函数时会继续使用外部函数outer中的变量a执行加法计算 31 32 # 总结: 33 # 在一个外部函数中定义了一个内部函数, 34 # 内部函数里运用了外部函数的临时变量, 35 # 并且外部函数的返回值是内部函数的引用。这样就构成了一个闭包。 36 37 38 # 闭包的最大特点: 39 # 是可保持外部函数操作的状态, 40 # 但是 如果要想在 内部函数中 修改 外部函数中定义的局部变量或者参数的内容,则必须使用nonlocal关键字 41 42 # 代码示例: 43 44 def print_count(login_count): # 外部函数 45 def login(login_name): # 内部函数 46 nonlocal login_count # 修改外部函数变量 使用nonlocal函数 47 login_count += 1 # 修改外部函数变量 48 return "第 %d 次登录信息: %s" % (login_count, login_name) 49 50 return login # 返回内部函数对象 51 52 53 login_info = print_count(0) # 接收外部函数对象,从0开始计数 54 print(login_info("张三")) # 调用内部函数 55 print(login_info("李四")) 56 print(login_info("王五"))