鱼C论坛

 找回密码
 立即注册
查看: 1167|回复: 4

魔法函数实现迭代器

[复制链接]
发表于 2020-4-1 16:37:20 | 显示全部楼层 |阅读模式

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

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

x
  1. class Fibs:
  2.        def __init__(self, n=20):
  3.              self.a = 0
  4.              self.b = 1
  5.        def __iter__(self):
  6.              return self 
  7.        def __next__(self):
  8.              self.a, self.b = self.b, self.a + self.b
  9.              return self.a
复制代码
__next__中的语句是什么意思了?这个next内部具体是如何运行的,


  1. fibs = Fibs()
  2. for each in fibs:
  3.                print(each)
复制代码
为什么print能够自动打印出所有的元素了,内部__next__做了设么操作


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 16:39:50 | 显示全部楼层
本帖最后由 十月故里 于 2020-4-1 16:43 编辑

首先第二个你用for语句对这个迭代器进行了遍历,自然就把所有元素都打印了一边
你可以用 next(fibs)来测试一下next的功能,就是自动到fibs的下一个元素
注意next到没有元素的时候会返回一个StopIteration
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 16:41:02 | 显示全部楼层
差不多是酱紫的:
  1. >>> # 假设这里有一个myGen
  2. >>> a = myGen(50)
  3. >>> next(a) # __next__ 就是执行这样的操作
  4. 1
  5. >>> next(a)
  6. 2
  7. >>> # 直接遍历
  8. >>> for i in a:
  9.         print(i, end = " ")

  10.        
  11. 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 17:10:28 | 显示全部楼层
__iter__()和__next__()都是重载了python原有的同名函数。
__iter__()是迭代器函数,
__next__()就是返回迭代的下一个元素。
你写的__next__()函数中少了终止条件,程序会无限循环下去
帮你修改了一下。
同时帮你添加了一下next 的用法
  1. class Fibs:
  2.         def __init__(self, n=20):
  3.                 self.a = 0
  4.                 self.b = 1
  5.                 self.n=n
  6.         def __iter__(self):
  7.                 return self
  8.         def __next__(self):
  9.                 if self.n==0:
  10.                         raise StopIteration
  11.                 self.n-=1
  12.                 self.a, self.b = self.b, self.a + self.b
  13.                 return self.a
  14. fibs = Fibs()
  15. for each in fibs:
  16.         print(each)
  17. fib2 = Fibs(10)
  18. for i in range(10):
  19.         print(next(fib2))
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 17:25:39 | 显示全部楼层
对 fibs 进行一次迭代就是获取 fibs.__next__() 的返回值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-19 12:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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