the5fire

关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


python中的yield的简单练习

作者:the5fire | 标签:     | 发布:2011-12-06 11:05 p.m. | 阅读量: 11624, 11429

前一段时间对python的实践并不太多,主要做一些页面的效果,还有关于pdf的打印。前面的工作算是告一段落了,后面需要拿起来python干活了。有空就写写代码实践一下。

关于这个yield函数(确切的说是表达式),认真的看了网上几篇关于yield的文章,自己照着研究下代码,基本上能理解怎么来用,但是yield的执行原理,还有待研究。

先说我对这个表达式的理解,然后再给出几个例子,细致的说明一下。 如果一个函数中存在着yield表达式,那么这个函数必将不是一个普通的函数(可能是文艺函数或者是2……你懂的),它就变成了生成器 (这个词最直观的概念就是生成某一事物的机器,也就是自动生成某一事物)。个人认为yield在函数中的作用就是保持函数当前的状态,并返回一个值。貌似说的不是太清楚,因为我理解的也不是很清楚,那么来看几个例子。

1、yield1.py

.. code:: python

def test():
    print 'the5fire'
    yield 'the'

建议你在python shell中实验这段代码,执行函数test之后,终端会输出:,这个提示很明显:这个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
----EOF-----

微信公众号:Python程序员杂谈


其他分类: