为什么 next() 函数对 csv.reader 对象'in place',但对列表迭代器不?



根据next()函数的python文档:

next(iterator[, default]):通过调用迭代器的__next__()方法从迭代器中检索下一个项。如果给定了default,则在迭代器耗尽时返回它,否则将引发StopIteration

我的问题:为什么像下面这样使用时它是"就位"的:

import csv
with open('data.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
next(csv_reader)
for row in csv_reader:
print(row)

这将跳过文件的第一行。我想应该是这样的:

csv_reader = next(csv_reader)

next返回迭代器的下一项,而不是";休息";在迭代器删除下一个项之后,迭代器的。因此,如果将next(csv_reader)的结果保存到csv_reader中,则文件的第一行将保存在csv_reader中,并且将丢失迭代器。

一个例子:

my_iterator = iter([1, 2, 3])
result = next(my_iterator)
print(result)  # prints 1
second_result = next(my_iterator)
print(second_result)  # prints 2

请注意,我们总是在同一迭代器对象上调用next()。我们不需要重新分配它,它只是一个接一个地给我们元素,跟踪下一个应该返回的元素。

next可以用来跳过一些元素,比如:

my_iterator = iter([1, 2, 3])
next(my_iterator)  # returns 1, but we don't want to store it, we just want to move past it
for element in my_iterator:
print(element)
# will print 2 and 3

迭代程序与列表

有时会混淆迭代器和列表。列表本身不是迭代器,而是可迭代的。这意味着我们可以使用for x in lst在列表上自动创建迭代器。所以

my_list = [1, 2, 3]
for e in my_list:
pass

实际上,幕后工作有点像这样:

my_list = [1, 2, 3]
# create an iterator from the list for the loop
my_list_iterator = iter(my_list)
for e in my_list_itetator:
pass
# and get rid of the iterator after the loop
del my_list_iterator

相关内容

  • 没有找到相关文章

最新更新