Python的yield关键字
http://blog.csdn.net/tossgoer/archive/2010/08/18/5822303.aspx
忽然得知Python有個叫yield的關鍵字,好奇之下去查了查,花了點時間基本弄明白了,故寫在此備忘,順便充充字數。
yield關鍵字用來定義生成器(Generator),其具體功能是可以當return使用,從函數里返回一個值,不同之處是用yield返回之后,可以讓函數從上回yield返回的地點繼續執行。也就是說,yield返回函數,交給調用者一個返回值,然后再“瞬移”回去,讓函數繼續運行, 直到嚇一跳yield語句再返回一個新的值。
使用yield返回后,調用者實際得到的是一個迭代器對象,迭代器的值就是返回值,而調用該迭代器的next()方法會導致該函數恢復yield語句的執行環境繼續往下跑,直到遇到下一個yield為止,如果遇不到yield,就會拋出異常表示迭代結束。
看一個例子:
>>> def test_yield():
...???? yield 1
...???? yield 2
...???? yield (1,2)
...
>>> a = test_yield()
>>> a.next()
1
>>> a.next()
2
>>> a.next()
(1, 2)
>>> a.next()
Traceback (most recent call last):
? File "<stdin>", line 1, in ?
StopIteration
每次調用a.next(),都會得到下一個yield返回的值,最后一次調用會拋出StopIteration結束異常。
暫時沒想到這個東西有什么用,也許就是可以省一些代碼。
一個有趣的例子,用來生成一個序列的全排列:
def
?perm(
items, n=None
)
:
??? if
?n is
?None
:
??????? n = len
(
items)
?
??? for
?i in
?range
(
len
(
items)
)
:
??????? v = items[
i:i+1]
?
??????? if
?n == 1:
??????????? yield
?v
??????? else
:
??????????? rest = items[
:i]
?+ items[
i+1:]
?
??????????? for
?p in
?perm(
rest, n-1)
:
??????????????? yield
?v + p
?
?
的確是方便一些,不過我還是覺得都放到一個數組里更直觀...
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/tossgoer/archive/2010/08/18/5822303.aspx
總結
以上是生活随笔為你收集整理的Python的yield关键字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python异常处理体系简介(1)
- 下一篇: Mac OS 如何连接windows 文