标准之处是:
it = iter(sequence)
for value in it:
print value
我正在使用第三方库,它返回一个迭代器,第一个值是标题,第二个值是元数据,其余值是记录。我尝试过类似的东西:
db = dbfreader(f)
headers = db.next()
spec = db.next()
record = db.next()
while record:
print record
record = db.next()
但这会导致StopIteration错误
答案 0 :(得分:5)
第一条记录并不特别,它只是所有记录中的第一条记录,因此没有理由提前阅读。
db = dbfreader(f)
headers = db.next()
spec = db.next()
for record in db:
print record
答案 1 :(得分:1)
标准方式是:
it = iter(sequence)
for value in it:
print value
这里不需要调用iter
,它在循环中隐式完成:
for value in sequence:
print value
最终,iter(obj)
会返回obj.__iter__()
。当你启动for循环时,这会被隐式调用:
for elem in x:
含蓄地
for elem in iter(x):
然后,在循环中,python在next
返回的iterable上调用iter(obj)
以获取各种elem
,直到next
引发Stopiteration
。
所以你的循环可以写成:
while True:
print record
try:
record = next(db)
except StopIteration:
break
或者更简洁和惯用(只要iter(db)
返回db
这是非常典型的):
for record in db:
print record
通常,您可以使用next
函数从迭代中获取下一个值 - 但该对象需要具有next
方法(或python3.x上的__next__
)。如果它是一个序列,在这种情况下,您可能需要先在对象上调用iter
:
>>> obj = ['header','header2','record1']
>>> next(obj)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator
>>> iobj = iter(obj)
>>> next(iobj)
'header'
>>> next(iobj)
'header2'
>>> for x in iobj:
... print x
...
record1
请注意,可以通过提供要返回的第二个参数而不是提升StopIteration
来禁止next
引发StopIteration
:
>>> next(iter([]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> next(iter([]),"Hello!")
'Hello!'
看到这一点,我们发现你也可以编写你的循环:
while record:
print record
record = next(db,False)
但for
循环绝对是大多数对象最干净的方法。