python - 通过 list() 复制一个迭代器
问题描述
我对python中的迭代器有疑问。代码取自一本书,这个例子对我来说有点棘手
it = read_visits('/tmp/my_numbers.txt')
print(list(it))
print(list(it)) # Already exhausted
这里我们有一个错误,因为迭代器已经被第一次打印耗尽
def normalize_copy(numbers):
numbers = list(numbers) # Copy the iterator
total = sum(numbers)
result = []
for value in numbers:
percent = 100 * value / total
result.append(percent)
return result
it = read_visits(‘/tmp/my_numbers.txt’)
percentages = normalize_copy(it)
print(percentages)
现在这个例子工作正常。我们有迭代器的副本,好的。但是这条线
list(numbers)
两个示例都相等...为什么第一个示例不起作用?
解决方案
这两个示例都没有复制iterator。第一个使用第一个遍历迭代器print
——它创建一个列表,打印列表,然后继续。
第二个print
也尝试将迭代器产生式转换为列表,但迭代器被第一次list
转换耗尽;你得到一个错误。
在第二个示例中,您同样将迭代器内容转换为list
. 但是,不是将该列表通过管道传输到 stdout 并丢弃它,而是将该列表保存为 variable numbers
。这是一个列表,而不是迭代器。因此,您可以根据 class 的属性多次引用它list
。
使用迭代器类似于读取文件:一旦您读取了整个文件,另一次读取尝试将失败......直到您以某种方式重置文件描述符。
这是否有助于清除功能?
推荐阅读
- jenkins - Jenkins:如何禁用 DockerContainerWatchdog 运行
- c# - 如何在命令行 .exe 上部署作为包装器的 C#(ClickOnce?)项目
- android - 将 compileSdkVersion 升级到 29 后,我的 android 应用程序在 Android 10 上崩溃
- matlab - 在 Matlab 中的脚本中创建结构时出现问题
- sql - 如何根据 Teradata 中的条件汇总多行数据?
- javascript - 类似于 Java 的 Node JS 中的 AES 加密/解密
- java - 在 JList (Swing) 中显示 ArrayList
- javascript - 如何使用 NodeJS 从 GeoJSON 文件创建 PBF 文件?
- java-ee-7 - 在 Java 批处理中处理单独的事务 (JSR-352)
- java - Springfox Bean Validations @Size 注解在 List 上不能正常工作