微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python迭代器的怪异行为

如何解决Python迭代器的怪异行为

在Python中使用闭包时,您已经陷入了一个非常普遍的陷阱:闭包具有其作用域,并且您会在同一范围内继续替换值。

candidates = ifilter(lambda n, prime=prime: n % prime, candidates)

解决方法

我在玩Python生成器和itertools模块,并尝试制作无限版的Eratosthenes筛。这是我的代码:

from itertools import count,ifilter,islice

def sieve_broken():
    candidates = count(start=2)
    while True:
        prime = next(candidates)
        yield prime
        candidates = ifilter(lambda n: n % prime,candidates)

当我对其进行测试时,我得到以下信息:

>>> print list(islice(sieve_broken(),10))
[2,3,4,5,6,7,8,9,10,11]

但是,如果我用candidates这样的函数代替的重新分配:

def sieve_fixed():
    def exclude_multiples(factor,numbers):
        return ifilter(lambda n: n % factor,numbers)

    candidates = count(start=2)
    while True:
        prime = next(candidates)
        yield prime
        candidates = exclude_multiples(prime,candidates)

我得到:

>>> print list(islice(sieve_fixed(),11,13,17,19,23,29]

我不知道为什么第一个版本不起作用。据我所知,这两个版本应该等效。有谁知道为什么他们不一样?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。