1

标准是:

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

4

2 回答 2

5

第一条记录并不特别,它只是所有记录中的第一条,所以没有理由提前阅读它。

db = dbfreader(f)
headers = db.next()
spec =  db.next()
for record in db:
    print record
于 2013-04-06T01:51:39.520 回答
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返回的可迭代对象iter(obj)以获取各种elems 直到next引发 a Stopiteration

所以你的循环可以写成:

while True:
    print record
    try:
        record = next(db)
    except StopIteration:
        break

或者更简洁和惯用(只要iter(db)返回db非常典型):

for record in db:
    print record

通常,您可以使用该函数从可迭代对象中获取下一个值next——但该对象需要有一个next方法(或__next__在 python3.x 上)。如果它是一个序列,在这种情况下您可能需要先调用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

请注意,您可以通过提供要返回的第二个参数而不是 raise来抑制 aStopIteration被引发:nextStopIteration

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

于 2013-04-06T01:50:15.393 回答