您好,登錄后才能下訂單哦!
Python yield語法的使用分析,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
# 例一開始: --------------------------------------------------------------------------------------------------------------------- def test_yield1(): print 'I am make test_yield1 function as a iterator...' yield
#直接調(diào)用test_yield1() test_yield1() #沒有輸出結(jié)果,原因是執(zhí)行test_yield1()函數(shù)只是構(gòu)造了一個(gè)迭代器, # 相當(dāng)于只寫了個(gè)for循環(huán),沒有寫for循環(huán)的代碼邏輯 # 迭代方法1: for i in test_yield1(): pass #發(fā)現(xiàn)有輸出了,這是因?yàn)閠est_yield1函數(shù)中有yield字段,因此test_yield1函數(shù)變成了一個(gè) # 可迭代的生成器constructor,所以用迭代的方法能使之輸出結(jié)果。 # 迭代方法2: it = test_yield1() it.next() 迭代方法1、迭代方法2的執(zhí)行結(jié)果都一樣:
#但是使用下面方式則會報(bào)錯(cuò) it = test_yield1() it.next() it.next()
#報(bào)錯(cuò)StopIteration,這是因此yield只構(gòu)造了一次迭代對象,所以執(zhí)行第二次時(shí)候,已經(jīng)沒有可迭代的元素了,所以報(bào)錯(cuò) # 例一結(jié)束:--------------------------------------------------------------------------------------------------------------------- |
# 例二開始:--------------------------------------------------------------------------------------------------------------------- #接上面例一,制造一個(gè)二次迭代的函數(shù)對象: def test_yield2(): print 'I am test_yield2 and execute once yiled...' yield print 'I am test_yield2 and execute twice yiled...' yield #直接執(zhí)行一樣沒有輸出 test_yield2() # 迭代方法1: for i in test_yield2(): pass # 迭代方法2: t = test_yield2() t.next() t.next()
迭代方法1、迭代方法2的執(zhí)行結(jié)果都一樣:
# 例二結(jié)束:--------------------------------------------------------------------------------------------------------------------- |
從上述例一、例二可以知道,函數(shù)中若有yield則該函數(shù)會被特地編譯成生成器、函數(shù)就是一個(gè)可以供迭代使用的對象。
下面來看一個(gè)openstack中使用的實(shí)例編程的例子:
初看不是很好理解,接下來,模擬一個(gè)demo:
#coding=utf-8 # 例三開始:--------------------------------------------------------------------------------------------------------------------- def test_yield3(num_list): for num in num_list: if num%2 == 0: yield num
num_list = [1,2,3,4,5,6] t = test_yield3(num_list)
print t
for i in t: print i
結(jié)果:
# 例三結(jié)束:--------------------------------------------------------------------------------------------------------------------- |
例三通過yield語法,返回了一個(gè)只包含偶數(shù)的可迭代生成器對象。因此關(guān)于openstack中的例子也很容易理解,
就是將self._filter_one(obj, filter_properties)值為true的obj加入到迭代對象中。這樣就完成了對hosts的過濾。
看完上述內(nèi)容,你們掌握 Python yield語法的使用分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。