with open("weather_data.csv", 'r') as data_file:
data = csv.reader(data_file)
for x in data:
print(x)我的理解是:csv.reader(data_file)是一个可迭代的,它调用iter(self)并作为迭代器返回_i。此_i每次调用next()以进入下一次迭代。但是,我使用print(help(csv.reader(data_file))并发现
Methods defined here:
|
| __iter__(self, /)
| Implement iter(self).
|
| __next__(self, /)
| Implement next(self).我的问题是,这里的方法__next__(self, /)和_i每次调用的方法完全一样吗?_i也携带数据吗?
发布于 2021-06-07 01:57:50
csv.reader对象是它自己的迭代器。这是一种通用的迭代实践,它是一次遍历(即只能运行一次)。我们可以通过检查来确认这一点。
>>> data
<_csv.reader object at 0x7fe5d4a057b0>
>>> iter(data)
<_csv.reader object at 0x7fe5d4a057b0> # Note: Same as above
>>> id(data)
140625091516336
>>> id(iter(data))
140625091516336 # Note: Same as above
>>> data is iter(data)
True将其与列表进行比较,列表是可迭代的,但它本身并不是迭代器。
>>> lst = [1, 2, 3]
>>> lst
[1, 2, 3]
>>> iter(lst)
<list_iterator object at 0x7fe5d59747f0> # Note: NOT the same as before
>>> lst is iter(lst)
False这允许我们通过多次调用iter(lst)来对列表进行多次迭代,因为每个调用都给了我们一个新的迭代器。但是您的csv.reader对象是单程的,所以我们只有一个迭代器。
在Python中,每个迭代器都是可迭代的,但不是每个迭代器都是迭代器。来自词汇表
迭代器需要有一个返回迭代器对象本身的
__iter__()方法,因此每个迭代器也是可迭代的,并且可以在大多数其他可迭代性被接受的地方使用。
https://stackoverflow.com/questions/67864976
复制相似问题