yield關鍵字的用法和用途

2022-06-27 21:51:13 字數 2357 閱讀 4442

來自:

配合 python 的contexlib模組裡的@contextmanager裝飾器,yield 也可以用於定義上下文管理器,下面是 python tricks 書中的乙個例子[3]

from contextlib import

contextmanager

@contextmanager

defmanaged_file(name):

try:

f = open(name, 'w'

)

yield

f

finally

: f.close()

上面通過裝飾器和 yield 關鍵字定義的上下文管理器和下面類的方法定義等同:

class

managedfile:

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)

print

(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)

print

(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返回的地點繼續執行...