【python】理解迭代器及yield

    虽然很早之前就接触yield这个词了,却一直是一知半解。趁现在有时间,把它研究一通再说。

    含有yield的函数说明它是一个生成器,而不是普通的函数。当程序运行到yield这一行时,该函数会返回值,并保存当前域的所有变量状态;等到该函数下一次被调用时,会从上一次中断的地方开始执行,一直遇到下一个yield, 程序返回值, 并在此保存当前状态; 如此反复,直到函数正常执行完成。

    我一开始还想不明白调用者与生成器之间的函数堆栈是怎么做到的,后来才大悟原来是用到了'协程'这个原理。协程可视为微线程,下面会结合例子来说明一下yield及协程的运行过程。假设定义了test方法:

def test(len):
    i = 0
    while i < len :
	    yield i
	    i += 1
我们来调用它看看输出:

>>> for i in test(5):
print i


输出: 
0
1
2
3
4
    这场景是不是很类似 for i in xrange(len); 是的, xrange就是这么干的。 for .. in 的操作实际上是调用了生成器的next()方法,以上的调用过程可以等价为:

f = test(5)
print f.next()
print f.next()
print f.next()
print f.next()
print f.next()
    输出结果与上次输出一致。
   另外,在这次调用过程中,协程被创建了一次, 被唤醒了5次(通过next),被挂起了5次(通过yield), 最后协程退出并销毁。 大概就这些点了,有更深的理解再做补充。

   


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值