使用 next() 时停止迭代错误
Stop Iteration error when using next()
我无法通过在 python(3) 中使用 next()
来澄清自己。
我有一个数据:
chr pos ms01e_PI ms01e_PG_al ms02g_PI ms02g_PG_al ms03g_PI ms03g_PG_al ms04h_PI ms04h_PG_al
2 15881989 4 C|C 6 A|C 7 C|C 7 C|C
2 15882091 4 A|T 6 A|T 7 T|A 7 A|A
2 15882148 4 T|T 6 T|T 7 T|T 7 T|G
我读起来像:
工作正常
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
print(list(c))
工作正常
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
keys = next(c)
print('keys:', keys)
但是,现在问题来了
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
print(list(c))
keys = next(c)
print('keys:', keys)
错误信息:
Traceback (most recent call last):
2 15882601 4 C|C 9 C|C 6 C|C 5 T|C
File "/home/everestial007/Test03.py", line 24, in <module>
keys = next(c)
File "/home/everestial007/anaconda3/lib/python3.5/csv.py", line 110, in __next__
row = next(self.reader)
StopIteration
为什么 print(keys)
在 print(list(c))
之后给出 StopIteration
? 我阅读了文档,但我不清楚这个特定示例。
错误与 print
语句无关。它与 keys = next(c)
行。考虑一个重现您的问题的更简单的示例。
a = (i ** 2 for i in range(5))
a # `a` is a generator object
<generator object <genexpr> at 0x150e286c0>
list(a) # calling `list` on `a` will exhaust the generator
[0, 1, 4, 9, 16]
next(a) # calling `next` on an exhausted generator object raises `StopIteration`
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-2076-3f6e2eea332d> in <module>()
----> 1 next(a)
StopIteration:
发生的事情是 c
是一个迭代器对象(非常类似于上面的 generator a
),并且意味着被迭代一次直到用完为止。对该对象调用 list
将耗尽它,以便可以将元素收集到一个列表中。
对象耗尽后,将不再产生元素。此时,生成器机制被设计为在您尝试迭代它时引发 StopIteration
,即使它已经耗尽。 for
循环等构造侦听此错误,默默地吞下它,但是,next
returns 原始异常一旦被引发。
我无法通过在 python(3) 中使用 next()
来澄清自己。
我有一个数据:
chr pos ms01e_PI ms01e_PG_al ms02g_PI ms02g_PG_al ms03g_PI ms03g_PG_al ms04h_PI ms04h_PG_al
2 15881989 4 C|C 6 A|C 7 C|C 7 C|C
2 15882091 4 A|T 6 A|T 7 T|A 7 A|A
2 15882148 4 T|T 6 T|T 7 T|T 7 T|G
我读起来像:
工作正常
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
print(list(c))
工作正常
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
keys = next(c)
print('keys:', keys)
但是,现在问题来了
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
print(list(c))
keys = next(c)
print('keys:', keys)
错误信息:
Traceback (most recent call last):
2 15882601 4 C|C 9 C|C 6 C|C 5 T|C
File "/home/everestial007/Test03.py", line 24, in <module>
keys = next(c)
File "/home/everestial007/anaconda3/lib/python3.5/csv.py", line 110, in __next__
row = next(self.reader)
StopIteration
为什么 print(keys)
在 print(list(c))
之后给出 StopIteration
? 我阅读了文档,但我不清楚这个特定示例。
错误与 print
语句无关。它与 keys = next(c)
行。考虑一个重现您的问题的更简单的示例。
a = (i ** 2 for i in range(5))
a # `a` is a generator object
<generator object <genexpr> at 0x150e286c0>
list(a) # calling `list` on `a` will exhaust the generator
[0, 1, 4, 9, 16]
next(a) # calling `next` on an exhausted generator object raises `StopIteration`
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-2076-3f6e2eea332d> in <module>()
----> 1 next(a)
StopIteration:
发生的事情是 c
是一个迭代器对象(非常类似于上面的 generator a
),并且意味着被迭代一次直到用完为止。对该对象调用 list
将耗尽它,以便可以将元素收集到一个列表中。
对象耗尽后,将不再产生元素。此时,生成器机制被设计为在您尝试迭代它时引发 StopIteration
,即使它已经耗尽。 for
循环等构造侦听此错误,默默地吞下它,但是,next
returns 原始异常一旦被引发。