关于迭代器的疑惑
>>> for i in 'fishc':print(i)
f
i
s
h
c
请问,在执行这段代码的时候都执行了哪些魔法方法?
我觉得首先是执行了__iter__方法,把'fishc'这个容器变成一个迭代器,然后执行__next__魔法方法,进行每一次迭代
但是我dir('fishc'),发现并没有__next__这个魔法方法,这是为什么呢? 迭代器才有__next__方法
kogawananari 发表于 2021-4-26 22:56
迭代器才有__next__方法
也就是说只要有__iter__就会有__next__,在for i in ‘asdf’中,先执行了__iter__,然后执行了__next__方法,虽然__next__方法没在字符串中定义出来? 123Marchapril 发表于 2021-4-26 23:00
也就是说只要有__iter__就会有__next__,在for i in ‘asdf’中,先执行了__iter__,然后执行了__next__方 ...
{:10_327:}一般来说 有__next__方法的对象 你用for循环走一次 走不了第二次
因为第一次都让你读完了 第二次就读不到;你第一次不读完 第二次读的就是剩余的
比如数据库的fetch 文件的read kogawananari 发表于 2021-4-26 23:19
一般来说 有__next__方法的对象 你用for循环走一次 走不了第二次
因为第一次都让你读完了...
我想问一下
一:比如我们定义了一个迭代器的类Diedai,在类定义中是不是必须得重写_iter_和_next_方法呀?这个不重写不行是吧?
二:比如我生成实例对象diedai=Diedai(),那么在for i in diedai:print(i)这个代码中,是不是要自动运行_iter_和_next_这两个魔法方法呀?_iter_可以使用object的魔法方法吗?
谢谢您! 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 kogawananari 发表于 2021-4-27 00:04
如果要定义一个迭代器的类Diedai必须得重写__next__方法
如果定义一个类 它的实例能被for循环 只 ...
好的,谢谢🙏
页:
[1]