123Marchapril 发表于 2021-4-26 22:48:48

关于迭代器的疑惑

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

       
f
i
s
h
c

请问,在执行这段代码的时候都执行了哪些魔法方法?
我觉得首先是执行了__iter__方法,把'fishc'这个容器变成一个迭代器,然后执行__next__魔法方法,进行每一次迭代
但是我dir('fishc'),发现并没有__next__这个魔法方法,这是为什么呢?

kogawananari 发表于 2021-4-26 22:56:46

迭代器才有__next__方法

123Marchapril 发表于 2021-4-26 23:00:24

kogawananari 发表于 2021-4-26 22:56
迭代器才有__next__方法

也就是说只要有__iter__就会有__next__,在for i in ‘asdf’中,先执行了__iter__,然后执行了__next__方法,虽然__next__方法没在字符串中定义出来?

kogawananari 发表于 2021-4-26 23:19:30

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

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

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

比如数据库的fetch 文件的read

123Marchapril 发表于 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的魔法方法吗?
谢谢您!

kogawananari 发表于 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

123Marchapril 发表于 2021-4-27 00:08:15

kogawananari 发表于 2021-4-27 00:04
如果要定义一个迭代器的类Diedai必须得重写__next__方法

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

好的,谢谢🙏
页: [1]
查看完整版本: 关于迭代器的疑惑