首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可迭代迭代器

可迭代迭代器
EN

Stack Overflow用户
提问于 2021-06-07 01:20:20
回答 1查看 80关注 0票数 0
代码语言:javascript
复制
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))并发现

代码语言:javascript
复制
 Methods defined here:
 |  
 |  __iter__(self, /)
 |      Implement iter(self).
 |  
 |  __next__(self, /)
 |      Implement next(self).

我的问题是,这里的方法__next__(self, /)_i每次调用的方法完全一样吗?_i也携带数据吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-07 01:57:50

csv.reader对象是它自己的迭代器。这是一种通用的迭代实践,它是一次遍历(即只能运行一次)。我们可以通过检查来确认这一点。

代码语言:javascript
复制
>>> 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

将其与列表进行比较,列表是可迭代的,但它本身并不是迭代器。

代码语言:javascript
复制
>>> 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__()方法,因此每个迭代器也是可迭代的,并且可以在大多数其他可迭代性被接受的地方使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67864976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档