闭包
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9
返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
除此之外,发现还可以这样:
def count():
fs = []
for i in range(1, 4):
def f(i = i):
return i*i # 这里的i可以改成a(a=i, a*a),此时这个函数用到的是局部变量a,在for循环时值已经被定义为了等于当前的i(1,2,3)
fs.append(f)
return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9
lambda
输出1000内的素数
廖雪峰python教程——filter里面的一条评论
然后也可以看看上面提到的链接
最终的代码如下
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def _not_divisible(n):
return lambda x: x % n > 0
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列
# it = filter(lambda x: x % n > 0 ,it) 错误
# it = filter(lambda x, n=n: x % n > 0 ,it) 正确
'''
# 如果改成
def test(n, it):
return filter(lambda x: x % n > 0 ,it)
it = test(n, it)
# 也是正确的,因为涉及到了传参,所以都是“当时”的n值,
'''
# 打印1000以内的素数:
for n in primes():
if n < 1000:
print(n)
else:
break
网友评论