CWYAlpha

Just another WordPress.com site

Thought this was cool: Python yield 用法

leave a comment »


http://www.pythonclub.org/python-basic/yield

yield 用法说明

yield 简单说来就是一个生成器生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。

  • 生成器 是 一个函数

函数的所有参数都会保留

  • 第二次调用 此函数 时

使用的参数是前一次保留下的.

  • 生成器还“记住”了它在流控制构造

生成器不仅“记住”了它数据状态。 生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。

yield 生成器的运行机制

当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行。 当你问他要下一个数时,它会从上次的状态开始运行,直至出现yield语句,把参数给你,之后停下。如此反复直至退出函数。

下面借助几个例子来理解yield:
例1 yield的应用:

def addlist(alist):
    
for i in alist:
       
yield i+2
alist 
= [1,2,3,4]
for x in addlist(alist):
    
#对alist的每个list数据进行i+2操作
    print x

输出结果:

3
4
5
6

例2.next的应用:

def h():
print hello
yield 5
print word

c
= h()
#执行到yield处
c.next()
print flag
#因为后面没有yield了,而导致程序出错
c.next()

输出结果:

hello
flag
word
Traceback (most recent call last):
File
test.py, line 9, in <module>
c.next()
StopIteration

例3.next和send的不同

#coding:utf8
def h():
print hello
m
= yield 5
print m
d
= yield 12
print word


c
= h()
#c.next()相当于c.send(None)
c.next()
print flag
#(yield 5)被赋值了,yield接收了send的值
c.send(!)

例4.next和send的返回值

#coding:utf8
def h():
print hello
m
= yield 5
print m
d
= yield 12
print word


m
= c.next()
print flag
d
= c.send(!)
#m,d的值为5,12可见send和next的返回值就是yield的参数
print m,d

SunRise_at 2012-12-27 12:04 发表评论

from C++博客-首页原创精华区: http://www.cppblog.com/sunrise/archive/2012/12/27/196704.html

Written by cwyalpha

十二月 28, 2012 在 3:22 下午

发表在 Uncategorized

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: