这不仅仅是一行代码,而是这行代码重复运行,具有不同的n值。在
{cd2>基本上还没有排除素数迭代的候选数。你先把所有的奇数作为候选。在it = _odd_iter()
然后你反复地选择剩下的第一个候选人
^{pr2}$
去掉所有那个候选人的倍数filter(_not_divisible(n), it)
把你的候选素数替换成去掉倍数后剩下的所有素数。在it = ...
如果假设filter返回一个数字列表,而不是iterable,并且假设_odd_iter()返回奇数列表而不是iterable,则可以跟踪循环并确定列表中每一点的内容。例如,运行后it = _odd_iter()
你从it = 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
那就跑吧n = next(it) # 3
它把前面的第一个项目拉下来,留给你it = 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, ...
然后跑it = filter(_not_divisible(3), it)
过滤掉3的所有倍数it = 5, 7, 11, 13, 17, 19, 23, 25, ...
然后回到循环的顶部,从前面拉出新的第一个数字n = next(it) # 5
离开it = 7, 11, 13, 17, 19, 23, 25, ...
然后过滤掉5的所有倍数it = filter(_not_divisible(5), it)
这给了it = 7, 11, 13, 17, 19, 23, ...
等等。在
实际上,由于filter()返回的是迭代器,而不是列表,因此最终得到的是迭代器的嵌套序列。特别是,你要从it = _odd_iter()
在循环的第一次迭代之后,基本上it = filter(_non_divisible(3), _odd_iter())
除了3是从迭代器中获取的,然后在循环的第二次迭代之后it = filter(_non_divisible(5), filter(_non_divisible(3), _odd_iter()))
除了5也从迭代器中获取,然后it = filter(_non_divisible(7), filter(_non_divisible(5), filter(_non_divisible(3), _odd_iter())))
等等。在