我发现:

>>> a={'x':42, 'y':3.14, 'z':7}
>>> b=a.__iter__()
>>> b.__dir__()
['__next__', ..., '__iter__', ...]
>>> b
<set_iterator object at 0x7efdd4e5afc0>

迭代器总是使用__iter__方法吗?

根据https://stackoverflow.com/a/9884259,迭代器也是iterable.如果迭代器总是有__iter__个方法,这是真的吗?

推荐答案

iterable需要实现__iter__ method or a __getitem__ method:

如果一个对象实现了__iter__()__getitem__(),那么它可以用for进行迭代.

迭代器需要一个__iter__方法(返回self)和一个__next__方法(我不能__iter__%确定__next__).

it is true that an iterator always has __iter__ method?

这也记录在Data model:

object.__iter__(self)

当容器需要迭代器时,调用此方法.这个方法应该返回一个新的迭代器对象,它可以遍历容器中的所有对象.对于映射,它应该迭代容器的键.

Iterator objects also need to implement this method; they are required to return themselves.有关迭代器对象的更多信息,请参阅迭代器类型.

(我的)

关于你的第二个问题:

迭代器也是iterable吗?

是的,因为它有一个__iter__的方法.

附加说明

除了正式的实现,只需判断是否可以调用iter(),就可以很容易地判断某个东西是否可以:

def is_iterable(something):
    try:
        iter(something)
    except TypeError:
        return False
    else:
        return True

同样地,也可以通过判断调用某个对象的iter()是否返回自身来判断该对象是否是迭代器:

def is_iterator(something):
    try:
        return iter(something) is something  # it needs to return itself to be an iterator
    except TypeError:
        return False

但不要在开发代码中使用它们,它们只是为了"可视化".大多数情况下,你只需要使用for ... in ...对某个对象进行迭代器,或者如果你需要迭代器,你可以使用iterator = iter(...),然后通过调用next(iterator)来处理迭代器,直到它抛出StopIteration.

Python-3.x相关问答推荐

数组列的极点成对求和

Django 3.2/Django-cms 3.11:查找错误:型号帐户.客户用户未注册

visual studio代码窗口中未激活虚拟环境11

Python VS Code 自动导入路径包含 src

Pandas 窗口聚合两个排序表

如何在带有 GUI 的 python 游戏中设置回答时间限制?

非拉丁字符的Python正则表达式不起作用

如何在 VSCode 的在 Cloud Run Emulator 上运行/调试构建设置中添加 SQL 连接

Pytorch 的随机 Select ?

如何使我的课程在 Python 中非常可打印?

Python 类型提示语法如何/为什么起作用?

Python3 mysqlclient-1.3.6(又名 PyMySQL)的用法?

发送Electron邮件时的 MIMEText UTF-8 编码问题

定义 True,如果没有定义,会导致语法错误

带百分号的 Python 字符串格式

在没有时间的python中创建日期

Python在OrderedDict中 Select 第i个元素

如何遍历某些扩展名的文件?

异常被忽略是什么类型的消息?

哪个更有效:Python 文档字符串还是类型提示?