我想知道如何正确地使用ifilter与lambda表达式!这是我的code.The的目的是使素数低于1000。
import itertools
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)
#it=itertools.ifilter(_not_divisible(n),it) #This would work
it=itertools.ifilter(lambda x:x%n>0,it) #This would not work
for n in primes():
if n<1000:
print(n)
else:
break但是当我和ifilter一起使用lambda表达式时,结果并不像我预期的那样,为什么?
发布于 2015-08-29 15:18:09
您的primes()函数在循环中缺少一个yield。
要使它在不使用_not_divisible(n)的情况下工作,您需要在lambda中为n提供正确的范围。最简单的方法是使用默认参数,它在每次将lambda传递给n时“冻结”ifilter()的值。
我缩小了循环的大小,使输出更加紧凑。
import itertools
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def primes():
yield 2
it = _odd_iter()
while True:
n = next(it)
yield n
it = itertools.ifilter(lambda x, n=n: x%n > 0, it)
for n in primes():
if n < 100:
print(n)
else:
break输出
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97以下是上述函数的一个细微变化。
def _iter():
yield 2
n = 3
while True:
yield n
n = n + 2
def primes():
it = _iter()
while True:
n = next(it)
yield n
it = itertools.ifilter(lambda x, n=n: x%n, it) https://stackoverflow.com/questions/32286821
复制相似问题