【python】理解迭代器及yield
2014-03-30 21:10
274 查看
虽然很早之前就接触yield这个词了,却一直是一知半解。趁现在有时间,把它研究一通再说。
含有yield的函数说明它是一个生成器,而不是普通的函数。当程序运行到yield这一行时,该函数会返回值,并保存当前域的所有变量状态;等到该函数下一次被调用时,会从上一次中断的地方开始执行,一直遇到下一个yield, 程序返回值, 并在此保存当前状态; 如此反复,直到函数正常执行完成。
我一开始还想不明白调用者与生成器之间的函数堆栈是怎么做到的,后来才大悟原来是用到了'协程'这个原理。协程可视为微线程,下面会结合例子来说明一下yield及协程的运行过程。假设定义了test方法:
>>> for i in test(5):
print i
输出:
0
1
2
3
4
这场景是不是很类似 for i in xrange(len); 是的, xrange就是这么干的。 for .. in 的操作实际上是调用了生成器的next()方法,以上的调用过程可以等价为:
另外,在这次调用过程中,协程被创建了一次, 被唤醒了5次(通过next),被挂起了5次(通过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), 最后协程退出并销毁。 大概就这些点了,有更深的理解再做补充。
相关文章推荐
- python yield generator (迭代器 生成器 协程) 理解
- python的迭代器iterator和生成器generator(关键字yield)的简单理解
- Python 深入理解yield
- 完全理解 Python 迭代对象、迭代器、生成器
- python中yield关键字怎么理解?
- Python中对于yield的个人理解
- [转]Python 深入理解yield
- 深入理解 Python 迭代器
- 理解Python中的yield
- 完全理解 Python 迭代对象、迭代器、生成器
- Python yield 的理解
- Python 深入理解yield
- Python3.x - 迭代器 - yield用法
- python的迭代器理解
- 【Python注意事项】如何理解python中间generator functions和yield表情
- python 列表生成式、生成器、迭代器、yield
- Python中的迭代器iterator和yield生成器(constructor)
- Python 迭代器 和 生成器yield
- Python 深入理解yield
- python yield 实例理解要点