for循环 底层工作原理

for 循环是对容器进行迭代的过程。

  • 什么是迭代?

  迭代就是从某个容器对象中逐个地读取元素,直到容器中没有更多元素为止。

  • for 循环的步骤是什么?

  1. 先判断对象是否为可迭代对象,不是的话直接报错,抛出TypeError异常,是的话,调用 __iter__方法,返回一个迭代器
  2. 不断地调用迭代器的__next__方法,每次按序返回迭代器中的一个值
  3. 迭代到最后,没有更多元素了,就抛出异常 StopIteration,这个异常 python 自己会处理,不会暴露给开发者
  • 那么,哪些对象支持迭代操作?任何对象都可以吗?

  for 循环本质是不断地调用迭代器的__next__方法,直到有 StopIteration 异常为止,

  所以任何可迭代对象都可以作用在for循环中。

 

弄明白了 for 的执行原理之后,我们就可以实现自己的迭代器用在 for 循环中:

 1 class MyRange:
 2     def __init__(self, num):
 3         self.i = 0
 4         self.num = num
 5 
 6     def __iter__(self): 7 return self 8 9 def __next__(self): 10 if self.i < self.num: 11 i = self.i 12 self.i += 1 13 return i 14 else: 15 # 达到某个条件时必须抛出此异常,否则会无止境地迭代下去 16 raise StopIteration() 

因为它实现了__next__方法,所以 MyRange 本身已经是一个迭代器了,所以 __iter__返回的就是对象本身 self。

 

现在用在 for 循环中试试:

1 for i in MyRange(3):
2     print(i)
3 # 输出
4  0
5  1
6  2

 

有没有发现,自定义的 MyRange 功能和内建函数 range很相似。

 

综上所述:

for 循环本质是不断地调用迭代器的__next__方法,直到有 StopIteration 异常为止,所以任何可迭代对象都可以作用在for循环中。

 

转载于:https://www.cnblogs.com/liangmingshen/p/9405875.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值