用filter求素数时遇到的疑问

用filter求素数:

图片说明
图片说明

看廖老板的python教程里面
一直搞不懂上面这个程序,按照我自己的理解当程序运行到 it = filter(_not_divisible(n), it) 的时候难道 程序在调用函数_not_divisible(n) 里面的return lambda x: x % n > 0 难道不会一直运行吗? 一直无限的计算下去吗?后面我自己在这个代码后面加了个打印 会出现内存错误 ,这不正是引证了这个计算会无限的一直算出不能被n整除的数吗? 求大神给我解答下?谢谢

3个回答

你修改了题目?
根据你题目的算法,用筛选法也可以

 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就暂停了。

lonesome_zxq
lonesome_zxq 关于这个程序我想请教一下,当n等于7的时候,3,5这些数是怎么传入那个lambda表达式的?是以为闭包吗?执行的原理是什么?
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复weixin_42653818: 调用next才实际执行,并且执行到yield或者结束停止。
接近 2 年之前 回复
weixin_42653818
Tyche_BO 回复caozhy: 网上研究了下,大概勉强明白了,很多人都有相同的疑惑 it = _odd_iter()创建初始序列时这个it到底是不是已经算出来,目前我的理解这应该只是一个生成器,并没有全部把序列全部算出来(也根本不可能算出来 因为这个数是无限的奇数集)。
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复weixin_42653818: 相当于 def 匿名函数(x): return x % 某个数字 > 0
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复weixin_42653818: 不是无限计算,相反,这个lambda只是判断传入的参数能否被x整除
接近 2 年之前 回复
weixin_42653818
Tyche_BO 多谢回答,其实我想问的是 return lambda x: x % n > 0 难道不是一个无限计算的函数式吗? 当程序运行到 要调用这个函数时,难道不会一直计算下去?
接近 2 年之前 回复
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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐