闭包
1、注意:返回的函数内部不要使用后续会发生变化的变量。
def f(): gs = [] for k in range(1, 4): def g(i): return i + k gs.append(g) return gs
例如这段代码感觉上应该返回三个函数分别return i+1、return i+2、return i+3(i为新函数参数),但事实却是得到了三个return i+3。
>>> from test import f >>> g1, g2, g3 = f() >>> g1(0) 3 >>> g2(0) 3 >>> g3(0) 3
2、如果一定要得到return i+1、return i+2、return i+3这三个函数怎么办?
可以这样
def f(): gs = [] gs.append(lambda x : x + 1) gs.append(lambda x : x + 2) gs.append(lambda x : x + 3) return gs
但是要得到return i + 1 ~ return i + 100就行不通了,这时候可以
def f(): hs = [] def g(i): def h(j): return j + i return h for k in range(1, 3): hs.append(g(k)) return hs
这段代码可以这样看:f()最终返回一个函数list->hs,那么hs需要append什么呢?append n个reuturn i+n函数。这些函数又怎么得到呢?利用内部的函数返回得到。更清晰的版本:
def f(): # 返回函数的函数 def g(i): return lambda j : i + j # 获取元素为函数的list hs = [] for k in range(1, 5): hs.append(g(k)) return hs
匿名函数=lambda