鱼C论坛

 找回密码
 立即注册
查看: 1927|回复: 6

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

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

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

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

x
>>> for i in 'fishc':
        print(i)

        
f
i
s
h
c

请问,在执行这段代码的时候都执行了哪些魔法方法?
我觉得首先是执行了__iter__方法,把'fishc'这个容器变成一个迭代器,然后执行__next__魔法方法,进行每一次迭代
但是我dir('fishc'),发现并没有__next__这个魔法方法,这是为什么呢?
最佳答案
2021-4-27 00:04:41
123Marchapril 发表于 2021-4-26 23:51
我想问一下
一:比如我们定义了一个迭代器的类Diedai,在类定义中是不是必须得重写_iter_和_next_方法呀 ...

如果要定义一个迭代器的类Diedai  必须得重写__next__方法  

如果定义一个类 它的实例能被for循环 只需要重写__iter__或者__getitem__方法就行

既要是迭代器的类 又要能被for循环 两个条件都满足 那就得__iter__和 __next__方法都重写
class MyCount:
    def __init__(self, a=0):
        self.a = a

    def __iter__(self):
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

c = MyCount()
i = iter(c)

print(next(i))#0
print(next(i))#1
print(next(i))#2

for n in c:
    print(n,end='')#3456789
    if n == 9: break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-26 22:56:46 | 显示全部楼层
迭代器才有__next__方法

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

使用道具 举报

 楼主| 发表于 2021-4-26 23:00:24 | 显示全部楼层
kogawananari 发表于 2021-4-26 22:56
迭代器才有__next__方法

也就是说只要有__iter__就会有__next__,在for i in ‘asdf’中,先执行了__iter__,然后执行了__next__方法,虽然__next__方法没在字符串中定义出来?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-26 23:19:30 | 显示全部楼层
123Marchapril 发表于 2021-4-26 23:00
也就是说只要有__iter__就会有__next__,在for i in ‘asdf’中,先执行了__iter__,然后执行了__next__方 ...

一般来说 有__next__方法的对象 你用for循环走一次 走不了第二次

因为第一次都让你读完了 第二次就读不到  ;你第一次不读完 第二次读的就是剩余的

比如数据库的fetch 文件的read
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-26 23:51:39 | 显示全部楼层
kogawananari 发表于 2021-4-26 23:19
一般来说 有__next__方法的对象 你用for循环走一次 走不了第二次

因为第一次都让你读完了  ...

我想问一下
一:比如我们定义了一个迭代器的类Diedai,在类定义中是不是必须得重写_iter_和_next_方法呀?这个不重写不行是吧?
二:比如我生成实例对象diedai=Diedai(),那么在for i in diedai:print(i)这个代码中,是不是要自动运行_iter_和_next_这两个魔法方法呀?_iter_可以使用object的魔法方法吗?
谢谢您!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-27 00:04:41 | 显示全部楼层    本楼为最佳答案   
123Marchapril 发表于 2021-4-26 23:51
我想问一下
一:比如我们定义了一个迭代器的类Diedai,在类定义中是不是必须得重写_iter_和_next_方法呀 ...

如果要定义一个迭代器的类Diedai  必须得重写__next__方法  

如果定义一个类 它的实例能被for循环 只需要重写__iter__或者__getitem__方法就行

既要是迭代器的类 又要能被for循环 两个条件都满足 那就得__iter__和 __next__方法都重写
class MyCount:
    def __init__(self, a=0):
        self.a = a

    def __iter__(self):
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

c = MyCount()
i = iter(c)

print(next(i))#0
print(next(i))#1
print(next(i))#2

for n in c:
    print(n,end='')#3456789
    if n == 9: break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-27 00:08:15 | 显示全部楼层
kogawananari 发表于 2021-4-27 00:04
如果要定义一个迭代器的类Diedai  必须得重写__next__方法  

如果定义一个类 它的实例能被for循环 只 ...

好的,谢谢🙏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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