Pet*_*mit 41 python list generator
我已经制作了一个生成器来逐字读取文件,它运行良好.
def word_reader(file):
for line in open(file):
for p in line.split():
yield p
reader = word_reader('txtfile')
next(reader)
Run Code Online (Sandbox Code Playgroud)
在列表中获取n个下一个值的最简单方法是什么?
Ign*_*ams 57
用途itertools.islice
:
list(itertools.islice(it, n))
Run Code Online (Sandbox Code Playgroud)
Ben*_*kin 13
编辑:使用itertools.islice
.我最初提出的模式是个坏主意 - 当it
收益率低于n
值时崩溃,这种行为取决于微妙的问题,所以阅读这些代码的人不太可能理解它的精确语义.
还有
Run Code Online (Sandbox Code Playgroud)[next(it) for _ in range(n)]
哪个(?)对于不熟悉itertools的人来说更清楚; 但是如果你经常处理迭代器,那么itertools对你的工具集来说是一个有价值的补充.
next(it)
筋疲力尽又会引发StopIteration
什么?(即,当收益率it
低于n
收益率时)
几年前我写这篇文章的时候,我可能认为一个StopIteration
聪明的副作用就是干净地终止列表理解.但不,整个理解都会在StopIteration
向上传递时崩溃.(只有当异常来自range(n)
迭代器时才会干净地退出.)
这可能不是你想要的行为.
但它变得更糟.以下应该等同于列表理解(特别是在Python 3上):
list(next(it) for _ in range(n))
Run Code Online (Sandbox Code Playgroud)
事实并非如此.内部部分是发电机功能的简写; list()
知道它在StopIteration
任何地方升起时都会完成.
=>当没有n
值时,此版本可以安全地处理并返回较短的列表.(喜欢itertools.islice()
.)
但这也会改变!当它内部的任何代码引发时,发生器默默地退出的事实StopIteration
是已知的疣,由PEP 479解决.从Python 3.7(或将来导入的3.5)将导致RuntimeError
而不是干净地完成生成器.即它将变得类似于列表理解的行为.(在最近的HEAD版本上测试过)