当前位置:   article > 正文

Python __iter__ 深入理解_python iter类

python iter类

参考Python __iter__ 深入理解 - 云+社区 - 腾讯云

先看一个例子:

  1. class Fib:
  2. def __init__(self, max):
  3. self.max = max
  4. def __iter__(self):
  5. print('__iter__ called')
  6. self.a = 0
  7. self.b = 1
  8. return self
  9. def __next__(self):
  10. print('__next__ called')
  11. fib = self.a
  12. if fib > self.max:
  13. raise StopIteration
  14. self.a, self.b = self.b, self.a + self.b
  15. return fib
  16. for i in Fib(3):
  17. print(i)
  18. # 输出
  19. __iter__ called
  20. __next__ called
  21. 0
  22. __next__ called
  23. 1
  24. __next__ called
  25. 1
  26. __next__ called
  27. 2
  28. __next__ called

通过这个斐波那契数列生成器来理解 __iter__。
定义 __iter__ 表示这个类是一个迭代器(iterator)。它只在迭代开始的时候运行一次。返回的是对象本身。这里还给顺手给对象添加了 a 和 b 两个属性。接下来就是循环调用 __next__ 直到遇到 raise StopIteration 为止。调用的过程就是模拟斐波那契数列的过程。

1 1 2 3 5 7 11 18 ... 可以看出,self.a 的值就是数列的值。我们只需要每次迭代把这个值通过 fib 这个变量输出即可。当 self.a = 3 的时候,赋值给 fib,fib > self.max 为假即退出迭代。窍门在于:让数列自己不断迭代,用一个中间的变量 fib 输出。

在迭代器中,__iter__ 和 __next__ 是必须的,而 __init__ 不是。

  1. class Fib:
  2. def __iter__(self):
  3. print('__iter__ called')
  4. self.a = 0
  5. self.b = 1
  6. self.max = 3
  7. return self
  8. def __next__(self):
  9. print('__next__ called')
  10. fib = self.a
  11. if fib > self.max:
  12. raise StopIteration
  13. self.a, self.b = self.b, self.a + self.b
  14. return fib

以上代码的输出结果和第一段代码是一致的。由于 __iter__ 只允许一次,可以用于赋值给属性。但是,这样的 Fib 类就不能通过传入参数构造了。self.max 被内置了。

为了加深理解,再来一个例子。给定首项 a1, 步长 d,返回末项最接近 n 的一个等差数列。

  1. # 等差数列公式 an = a1 + (n-1) * d
  2. class Acu():
  3. def __init__(self, a1, d, n):
  4. self.a1 = a1
  5. self.d = d
  6. self.n = n
  7. def __iter__(self):
  8. return self
  9. def __next__(self):
  10. an = self.a1
  11. if an > self.n:
  12. raise StopIteration
  13. else:
  14. self.a1 += self.d
  15. return an
  16. for i in Acu(1, 2, 15):
  17. print(i)

完全是一样的道理,首先用 iter 表明这个对象是迭代器,然后调用 next,首先把首项 a1 赋值给 an并输出。在输出前,a1 增加一个步长。这样 an 的值不变,而下一次通过 a1 赋值的时候就变了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/762020
推荐阅读
相关标签
  

闽ICP备14008679号