看廖老板的python教程里面
一直搞不懂上面这个程序,按照我自己的理解当程序运行到 it = filter(_not_divisible(n), it) 的时候难道 程序在调用函数_not_divisible(n) 里面的return lambda x: x % n > 0 难道不会一直运行吗? 一直无限的计算下去吗?后面我自己在这个代码后面加了个打印 会出现内存错误 ,这不正是引证了这个计算会无限的一直算出不能被n整除的数吗? 求大神给我解答下?谢谢
你修改了题目?
根据你题目的算法,用筛选法也可以
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)
yield n
it = filter(_not_divisible, it)
for n in primes():
if n < 100:
print(n)
else:
break;
之所以不会无限执行,是因为这是生成器,所以for n in primes():这个循环其实是
it = primes()
while True:
x = next(it)
print(x)
if (x > 100): break
而每次调用next,
def primes()中的代码会走到下一次yield就暂停了。
from itertools import *
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
def divisible(n):
return lambda x: x % n == 0
def primes():
yield 2
for x in _odd_iter():
for y in range(3, x + 3):
if x == y:
yield x
if divisible(y)(x):
break;
for n in takewhile(lambda x: x < 100, 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
Process finished with exit code 0