当前几个值特殊时,循环遍历迭代器的Pythonic方法是什么?

时间:2013-04-06 01:45:06

标签: python

标准之处是:

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错误

2 个答案:

答案 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循环绝对是大多数对象最干净的方法。