【发布时间】:2017-09-30 00:27:48
【问题描述】:
我是 python 新手。我最近了解了生成器和过滤器(我假设它也是一个生成器)。然后我对以下代码感到非常困惑:
>>> def _not_divisible(n):
return lambda x: x % n > 0
>>> 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 = filter(_not_divisible(n), it)
>>> for n in primes():
if n < 1000:
print(n)
else:
break
据我了解,代码中实际上有三个生成器(包括过滤器)。 '_odd_iter' 是所有奇数。 'primes' 都是素数。而'filter'是除2以外的素数。
但是在primes()中,'next'是'it'的第一个元素,然后传递给'_not_divisible' strong>,所以我认为在等式 'it = filter(...)' 左侧 'it' 是一个等于 'n'。 'it' 怎么会再次作为数字传递给 'next()'。
>>> next(primes())
2
还有一个问题,无论我使用多少次“下一个”,它总是返回 2 而不是主要流。
非常感谢您帮助我
【问题讨论】:
-
它总是返回两个,因为
primes()总是一个新的生成器。打p=primes(),然后打几次next(p)。 -
在回答第二个问题之前,您实际上在问什么?
-
filter不返回单个数字。它接受一个函数和一个可迭代对象作为 args,并返回一个新的可迭代对象,根据函数 arg 产生的值是 True-ish。 -
当 _not_divisible 与 'n' 一起传递时,过滤器真正返回什么,一个数字而不是一个列表。(对不起,混淆,英语不是我的母语。)
-
请注意,
_not_divisible是一个函数 factory。当你将它传递给n时,它会返回一个接受单个 arg (x) 的函数;当x不能被您最初传递给_not_divisible的n整除时,该函数返回 True。
标签: python python-3.5