前一段时间对python的实践并不太多,主要做一些页面的效果,还有关于pdf的打印。前面的工作算是告一段落了,后面需要拿起来python干活了。有空就写写代码实践一下。
关于这个yield函数(确切的说是表达式),认真的看了网上几篇关于yield的文章,自己照着研究下代码,基本上能理解怎么来用,但是yield的执行原理,还有待研究。
先说我对这个表达式的理解,然后再给出几个例子,细致的说明一下。 如果一个函数中存在着yield表达式,那么这个函数必将不是一个普通的函数(可能是文艺函数或者是2……你懂的),它就变成了生成器 (这个词最直观的概念就是生成某一事物的机器,也就是自动生成某一事物)。个人认为yield在函数中的作用就是保持函数当前的状态,并返回一个值。貌似说的不是太清楚,因为我理解的也不是很清楚,那么来看几个例子。
1、yield1.py
.. code:: python
def test():
print 'the5fire'
yield 'the'
建议你在python shell中实验这段代码,执行函数test之后,终端会输出:
是不是有点疑惑,别急,再来看第二个例子
2、yield2.py
.. code:: python
def test():
print 'the5fire'
yield 'the'
然后你在终端上输入:
.. code:: python
t = test()
t.next()
是不是输出了: the5fire the
看到上面的那个next()是不是觉得眼熟呢,如果你使用过迭代器的话,你会知道,这个next的作用就是取下一个值。 关于迭代器,最常用的应该就是 for...in 这个结构了,有兴趣的不妨自己去研究一番,相信你会有所收获。 再来看第三个例子,是一个Fibonacci函数 3、yield3.py
.. code:: python
def fib(max):
a,b = 0,1
while a < max:
yield a
a, b = b, a + b
for n in fib(1000):
print n
这样执行一下就得到了斐波纳契的数列。自己在fib函数中的yield上下写上print随便输出点东西,就会发现,其实在函数执行到yield a这句话的时候像是被暂停了,转而执行了外面for...in循环里面的东西。
看完上面的三个例子是不是对yield的使用清楚了一些呢,如果还是不清楚,那就在多练习几遍。 关于这个表达式的使用更多的内容可以参考这里: http://blog.donews.com/limodou/archive/2006/09/04/1028747.aspx http://www.builder.com.cn/2007/0720/427920.shtml
PS:又翻看了一下《python基础教程》,yield在双层循环中用的也很多,如:
.. code:: python
def getItem(aItems):
for sublist in aItems:
for item in sublist:
yield item
aItems = [[1,2],[3,4],[5]]
for item in getItem(aItems):
print item
- from the5fire.com微信公众号:Python程序员杂谈