鱼C论坛

 找回密码
 立即注册
查看: 1718|回复: 2

[已解决]关于迭代器方面的疑惑

[复制链接]
发表于 2021-4-7 22:49:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Person:
    def __init__(self):
        self.age = 1
    def __getitem__(self, item):
        self.age += 1
        if self.age >= 6:
            raise StopIteration
        return self.age

import collections
p = Person()
print(isinstance(p,collections.Iterable)) #False
print(isinstance(p,collections.Iterator)) #False
pt = iter(p)
print(isinstance(pt,collections.Iterable)) #True
print(isinstance(pt,collections.Iterator)) #True

若上定义了一个用for遍历的Person类。p实例不是一个可迭代对象,而pt是个迭代器。
问题:一个自定义对象有__getitem__方法,没有__iter__和__next__方法,为什么iter(这个自定义对象)就可以生成迭代器呢?
不是说用iter函数,iter(可迭代对象,如:列表、元组,字符串,range函数返回值、zip函数返回值、enumerate函数返回值等具有__iter__方法的对象)才可以生成迭代器吗?或者说究竟iter函数的对象都是什么才可以生成迭代器呢?
最佳答案
2021-4-8 00:55:24
还是官方文档,让我长知识:
  1. iter(object[, sentinel])
  2. 返回一个 iterator 对象。
  3. 根据是否存在第二个实参,第一个实参的解释是非常不同的。
  4. 如果没有第二个实参,object 必须是支持迭代协议(有 __iter__() 方法)的集合对象,[b]或[/b]必须支持序列协议(有 __getitem__() 方法,且数字参数从 0 开始)。
  5. 如果它不支持这些协议,会触发 TypeError。
  6. 如果有第二个实参 sentinel,那么 object 必须是可调用的对象。这种情况下……
复制代码


即 有__getitem__() 或 __iter__() 这两个方法中的其中一个,都可以 转为 iterator对象。
你可以把 __getitem__() 部分注释掉,就会报错:TypeError: 'Person' object is not iterable

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-8 00:55:24 | 显示全部楼层    本楼为最佳答案   
还是官方文档,让我长知识:
  1. iter(object[, sentinel])
  2. 返回一个 iterator 对象。
  3. 根据是否存在第二个实参,第一个实参的解释是非常不同的。
  4. 如果没有第二个实参,object 必须是支持迭代协议(有 __iter__() 方法)的集合对象,[b]或[/b]必须支持序列协议(有 __getitem__() 方法,且数字参数从 0 开始)。
  5. 如果它不支持这些协议,会触发 TypeError。
  6. 如果有第二个实参 sentinel,那么 object 必须是可调用的对象。这种情况下……
复制代码


即 有__getitem__() 或 __iter__() 这两个方法中的其中一个,都可以 转为 iterator对象。
你可以把 __getitem__() 部分注释掉,就会报错:TypeError: 'Person' object is not iterable

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-4-10 22:56:48 | 显示全部楼层
阿奇_o 发表于 2021-4-8 00:55
还是官方文档,让我长知识:

谢谢,遇事不决先看官方文档。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-1 21:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表