來自:
配合 python 的contexlib
模組裡的@contextmanager
裝飾器,yield 也可以用於定義上下文管理器,下面是 python tricks 書中的乙個例子[3]
:
from contextlib importcontextmanager
@contextmanager
defmanaged_file(name):
try:
f = open(name, 'w'
)
yield
f
finally
: f.close()
上面通過裝飾器和 yield 關鍵字定義的上下文管理器和下面類的方法定義等同:
classmanagedfile:
def__init__
(self, name):
self.name =name
def__enter__
(self):
self.file = open(self.name, 'w'
)
return
self.file
def__exit__
(self, exc_type, exc_val, exc_tb):
ifself.file:
self.file.close()
可以利用下面的方法分別進行呼叫:
with managedfile('hello.txt
') as f:
f.write(
'hello, world!')
f.write(
'bye now')
with managed_file(
'hello.txt
') as f:
f.write(
'hello, world!')
f.write(
'bye now
')
協程的概念充滿了美感,非常符合人的辦事模式,想要完全掌握卻還是需要花費一些功夫。不過這些功夫是值得的,因為有時多執行緒所帶來的麻煩會遠遠比協程多。下面是 python cookbook 中的乙個只用yield
表示式編寫的協程例項[4]
:yield from
是在python3.3才出現的語法。所以這個特性在python2中是沒有的。
yield from
後面需要加的是可迭代物件,它可以是普通的可迭代物件,也可以是迭代器,甚至是生成器。
簡單應用:拼接可迭代物件#
我們可以用乙個使用yield
和乙個使用yield from
的例子來對比看下。
使用yield
#字串astr='
abc'#列表
alist=[1,2,3]#字典
adict=
#生成器
agen=(i for i in range(4,8))
def gen(*args, **kw):
for item in
args:
for i in
item:
yield
inew_list=gen(astr, alist, adict, agen)
(list(new_list))
#['a', 'b', 'c', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]
使用yield from
#字串astr='
abc'#列表
alist=[1,2,3]#字典
adict=
#生成器
agen=(i for i in range(4,8))
def gen(*args, **kw):
for item in
args:
yield
from
item
new_list=gen(astr, alist, adict, agen)
(list(new_list))
#['a', 'b', 'c', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]
由上面兩種方式對比,可以看出,yield from後面加上可迭代物件,他可以把可迭代物件裡的每個元素乙個乙個的yield出來,對比yield來說**更加簡潔,結構更加清晰。
python 基礎 yield 關鍵字用法
python 基礎 yield 關鍵字用法 usr bin env python3 coding utf 8 通過斐波那契數列生成,了解下 yield 關鍵字的使用 yield 可返回乙個迭代器 如果在for 迴圈中調動的方法中遇到 yield 關鍵字,則每次迴圈返回 yield 後面的結果,直至結...
學習yield關鍵字
當使用yield關鍵字時,這就意味著該函式返回的是乙個迭代器 iterator 不用自己維護乙個迭代器內部的狀態管理 比如c 中的itereator,或實現c 中實現的介面iemuerator 其使用模式如下 yield return yield break 其中第二種用於for迴圈終止。這樣的模式...
Python的yield關鍵字
忽然得知python有個叫yield的關鍵字,好奇之下去查了查,花了點時間基本弄明白了,故寫在此備忘,順便充充字數。yield關鍵字用來定義生成器 generator 其具體功能是可以當return使用,從函式裡返回乙個值,不同之處是用yield返回之後,可以讓函式從上回yield返回的地點繼續執行...