1 #定义一个函数 2 def test(number): 3 4 #在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么称里面 的这个函数为闭包 5 def test_in(number_in): 6 print("in test_in 函数, number_in is %d"%number_in) 7 return number+number_in 8 #其实这里返回的就是闭包的结果 9 return test_in 10 11 12 #给test函数赋值,这个20就是给参数number 13 ret = test(20) 14 15 #注意这里的100其实给参数number_in 16 print(ret(100)) 17 18 #注意这里的200其实给参数number_in 19 print(ret(200)) 20 21 运行结果: 22 in test_in 函数, number_in is 100 23 120 24 25 in test_in 函数, number_in is 200 26 220
#内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。 # closure.py def counter(start=0): count=[start] def incr(): count[0] += 1 return count[0] return incr #启动python解释器 >>>import closeure >>>c1=closeure.counter(5) >>>print(c1()) 6 >>>print(c1()) 7 >>>c2=closeure.counter(100) >>>print(c2()) 101 >>>print(c2()) 102 #nonlocal访问外部函数的局部变量 def counter(start=0): def incr(): nonlocal start start += 1 return start return incr c1 = counter(5) print(c1()) print(c1()) c2 = counter(50) print(c2()) print(c2()) print(c1()) print(c1()) print(c2()) print(c2())
闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包. 总结一下,创建一个闭包必须满足以下几点:
1. 必须有一个内嵌函数
2. 内嵌函数必须引用外部函数中的变量
3. 外部函数的返回值必须是内嵌函数
当函数运行完后, 并不被销毁,而是继续留在内存空间里.这个功能类似类里的类变量,只不过迁移到了函数上.