我有一个算法可以生成素数列表作为生成器:
def _odd_iter():
n=3
while True:
yield n
n=n+2
def _not_divisible(n):
return lambda x: x % n > 0
def primes():
yield 2
L=_odd_iter()
while True:
n=next(L)
yield n
L=filter(_not_divisible(n), L)
x=1
for t in primes():
print(t)
x=x+1
if x==10:
break
但是如果我将lambda函数直接放入filter
函数中,如下所示:
我只能得到一个单数,不能得到素数。似乎filter
函数不起作用。在
我能做什么?在
这里有一个更简单的程序来说明同样的问题。在
虽然预期输出是
3
,但实际输出是6
。 这是因为在创建lambda时,python中的闭包记住变量的名称和范围,而不是它的值。由于使用lambda时,i
已被修改,lambda使用最新的值i
。在同样的事情发生在你的函数中。每当}。在
n
被修改时,各种过滤器中的所有lambda函数也会被修改。所以,当迭代器到达9
时,所有的过滤器都是7
的过滤因子,而不是5
或{因为,在第一种方法中,每次调用
_not_divisible
时都会创建一个新的作用域,因此该函数按预期工作。在如果绝对必须直接使用lambda,则可以使用第二个参数,如下所示:
^{pr2}$工作的lambda是
lambda x, n=n: x%n != 0
。如果您想在定义lambda时捕获n
,显然需要这样做。否则lambda只在计算lambda时才查找变量名。在您的例子中,我认为这意味着在while循环的稍后迭代中锁定一个n
值。在相关问题 更多 >
编程相关推荐