python - 迭代器的意外行为
问题描述
我尝试使用迭代器来实现 Eratosthenes 的筛子(因为我想更多地使用 python 进行函数式编程)。可悲的是,发生了一些意想不到的行为。您可以在此视频中看到它:https ://imgur.com/gallery/XfXFw4a
这是我的代码:
def sieve_primes(stop=10):
L = (x for x in range(2, stop+1))
while True:
prime = next(L)
L = filter(lambda x: x % prime != 0 or x == prime, L)
#L, M = itertools.tee(L)
#print(list(M))
yield prime
当两个注释行未注释时,它可以工作(吐出具有所需素数的迭代器对象)。否则,它只会遍历每个数字。
我期待着您的回答:) 谢谢!
解决方案
您prime
在 lambda 中使用变量,这是您从封闭范围继承的引用。当您的代码评估 lambda 时,它将使用在继承引用的范围内绑定到该引用的任何值。当您不使用tee
和评估列表时,所有 lambda 函数都是相同的,并且对prime
.
tee
工作原理是将结果存储在一个列表中,并在您稍后再次询问时从该列表中将它们提供给您,因此对于它的每个值prime
实际上将过滤器应用于来自的所有值L
prime
您可以通过在 的范围内绑定来解决此问题,方法lambda
是将其作为具有默认值的参数传递。这将该值保存为函数对象的一部分,prime
然后引用是对该存储值的本地引用。
推荐阅读
- excel - BluePrism Excel 提取
- angularjs - angularjs ng-repeat 全选
- ios - 从音频可视化器的后台应用程序播放和录制音频
- python-3.6 - 错误:src/main/aerospike.c:17:20:致命错误:Python.h:没有这样的文件或目录;无法使用 python3 安装 aeropike
- angular - 如何重定向到登录页面会话过期?
- batch-file - 从文本文件中提取子字符串
- node.js - AWS Lambda 错误:无法解压缩上传的文件
- rest - AWS S3 - 使用 REST API 生成预签名 URL
- sql - 对具有相似名称的所有数据库运行查询
- java - Spring-Boot-Maven-Plugin,无法实例化接口 org.springframework.context.ApplicationContextInitializer