Ifilter 与 lambda 表达式一起
Ifilter together with lambda expression
我想知道如何正确使用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
但是当我将 lambda 表达式与 ifilter 一起使用时,结果并不像我预期的那样,为什么?
您的 primes()
函数在循环中缺少一个 yield
。
要使其在不使用 _not_divisible(n)
的情况下工作,您需要在 lambda 中为 n
提供正确的范围。最简单的方法是使用默认参数,即每次将 lambda 传递给 ifilter()
.
时 "freezes" n
的值
我减小了循环大小以使输出更紧凑。
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)
我想知道如何正确使用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
但是当我将 lambda 表达式与 ifilter 一起使用时,结果并不像我预期的那样,为什么?
您的 primes()
函数在循环中缺少一个 yield
。
要使其在不使用 _not_divisible(n)
的情况下工作,您需要在 lambda 中为 n
提供正确的范围。最简单的方法是使用默认参数,即每次将 lambda 传递给 ifilter()
.
n
的值
我减小了循环大小以使输出更紧凑。
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)