您的位置:首页 > 编程语言 > Python开发

python的yield语法基础

2012-05-09 11:30 956 查看
生成器总结:

最普通的例子:

>>> def h():
... yield 1
... yield 2
... yield 3
...
>>> c = h()
>>> c.next()
1
>>> c.next()
2
>>> c.next()
3
>>> c.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration


每次调用next都会返回yield后面表达式的值,直到遇到下一个yield语句为止。

复杂一点的例子:

>>> def h():
... print '111'
... yield '+111'
... print '222'
... yield '+222'
... print '333'
... yield '+333'
...
# c是生成器
>>> c = h()

# 111是print出来的,而+111是yield返回的,这时yield执行完了第一个yield并暂停。
# 直到接受到下一个next()
>>> c.next()
111
'+111'

>>> c.next()
222
'+222'
>>> c.next()
333
'+333'
# 因为h()已经是一个生成器函数,当所有yield都执行完毕之后,再调用next()就会引发StopIteration错误。
>>> c.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

>>>
>>> c = h()
# 111是print的返回值,而x是yield的返回值
>>> x = c.next()
111
>>> x
'+111'
>>> y = c.next()
222
>>> y
'+222'
>>> z = c.next()
333
>>> z
'+333'


更复杂的例子:

>>> def h():
... print 'enter yield!'     #1
... m = yield 123          #2
... print m             #3
... d = yield 456          #4
... print d             #5
... print 'leave yield!'    #6
...
>>> c = h()        # c是一个生成器,因为python认为h()则是一个生成器函数,不是一个普通函数。
>>> a = c.next()    # 往下执行代码,直到遇到yield为止,会返回yield的值
enter yield!       # 这里的'enter yield!'是执行#1打印的,因为要运行到#2,所以必须要打印这一行
>>> a           # 而#3返回了yield后面表达式的值
123
>>> b = c.next()    # 再次调用next()执行到了#4,返回了yield的值。 但是yield的总的返回值总是None,所以返回了None.
None
>>> b     # 但是b的值是yield返回的,是456
456
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: