日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Python關(guān)鍵字yield詳解

迭代器(Iterator)

啟東網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),啟東網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為啟東成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的啟東做網(wǎng)站的公司定做!

為了理解yield是什么,首先要明白生成器(generator)是什么,在講生成器之前先說(shuō)說(shuō)迭代器(iterator),當(dāng)創(chuàng)建一個(gè)列表(list)時(shí),你可以逐個(gè)的讀取每一項(xiàng),這就叫做迭代(iteration)。

 
 
 
  1. mylist = [1, 2, 3]   
  2.  for i in mylist :   
  3.  print(i)   

Mylist就是一個(gè)迭代器,不管是使用復(fù)雜的表達(dá)式列表,還是直接創(chuàng)建一個(gè)列表,都是可迭代的對(duì)象。

 
 
 
  1. mylist = [x*x for x in range(3)]   
  2. for i in mylist :   
  3. print(i)   

你可以使用“for··· in ···”來(lái)操作可迭代對(duì)象,如:list,string,files,這些迭代對(duì)象非常方便我們使用,因?yàn)槟憧梢园凑漳愕囊庠高M(jìn)行重復(fù)的讀取。但是你不得不預(yù)先存儲(chǔ)所有的元素在內(nèi)存中,那些對(duì)象里有很多元素時(shí),并不是每一項(xiàng)都對(duì)你有用。

生成器(Generators)

生成器同樣是可迭代對(duì)象,但是你只能讀取一次,因?yàn)樗](méi)有把所有值存放內(nèi)存中,它動(dòng)態(tài)的生成值:

 
 
 
  1. mygenerator = (x*x for x in range(3))   
  2. for i in mygenerator :   
  3. print(i)   

使用()和[]結(jié)果是一樣的,但是,第二次執(zhí)行“ for in mygenerator”不會(huì)有任何結(jié)果返回,因?yàn)樗荒苁褂靡淮?。首先?jì)算0,然后計(jì)算1,之后計(jì)算4,依次類推。

Yield

Yield是關(guān)鍵字, 用起來(lái)像return,yield在告訴程序,要求函數(shù)返回一個(gè)生成器。

  
 
 
  1. def createGenerator() :   
  2. mylist = range(3)   
  3. for i in mylist :   
  4. yield i*i   
  5.     
  6. mygenerator = createGenerator() # create a generator   
  7. print(mygenerator) # mygenerator is an object!   
  8.    
  9. for i in mygenerator:   
  10. print(i)   

這個(gè)示例本身沒(méi)什么意義,但是它很清晰地說(shuō)明函數(shù)將返回一組僅能讀一次的值,要想掌握yield,首先必須理解的是:當(dāng)你調(diào)用生成器函數(shù)的時(shí)候,如上例中的createGenerator(),程序并不會(huì)執(zhí)行函數(shù)體內(nèi)的代碼,它僅僅只是返回生成器對(duì)象,這種方式頗為微妙。函數(shù)體內(nèi)的代碼只有直到每次循環(huán)迭代(for)生成器的時(shí)候才會(huì)運(yùn)行。

函數(shù)***次運(yùn)行時(shí),它會(huì)從函數(shù)開(kāi)始處直到碰到y(tǒng)ield時(shí),就返回循環(huán)的***個(gè)值,然后,交互的運(yùn)行、返回,直到?jīng)]有值返回為止。如果函數(shù)在運(yùn)行但是并沒(méi)有遇到y(tǒng)ield,就認(rèn)為該生成器是空,原因可能是循環(huán)終止,或者沒(méi)有滿足任何”if/else”。

接下來(lái)讀一小段代碼來(lái)理解生成器的優(yōu)點(diǎn):

控制生成器窮舉

  
 
 
  1. >>> class Bank(): # 創(chuàng)建銀行,構(gòu)造ATM機(jī)   
  2. ...    crisis = False 
  3. ...    def create_atm(self) :   
  4. ...        while not self.crisis :   
  5. ...            yield "$100" 
  6. >>> hsbc = Bank() # 沒(méi)有危機(jī)時(shí),你想要多少,ATM就可以吐多少   
  7. >>> corner_street_atm = hsbc.create_atm()   
  8. >>> print(corner_street_atm.next())   
  9. $100 
  10. >>> print(corner_street_atm.next())   
  11. $100 
  12. >>> print([corner_street_atm.next() for cash in range(5)])   
  13. ['$100', '$100', '$100', '$100', '$100']   
  14. >>> hsbc.crisis = True # 危機(jī)來(lái)臨,銀行沒(méi)錢(qián)了   
  15. >>> print(corner_street_atm.next())   
  16.    
  17. >>> wall_street_atm = hsbc.ceate_atm() # 新建ATM,銀行仍然沒(méi)錢(qián)   
  18. >>> print(wall_street_atm.next())   
  19.    
  20. >>> hsbc.crisis = False # 麻煩就是,即使危機(jī)過(guò)后銀行還是空的   
  21. >>> print(corner_street_atm.next())   
  22.    
  23. >>> brand_new_atm = hsbc.create_atm() # 構(gòu)造新的ATM,恢復(fù)業(yè)務(wù)   
  24. >>> for cash in brand_new_atm :   
  25. ...    print cash   
  26. $100 
  27. $100 
  28. $100 
  29. $100 
  30. $100 
  31. $100 
  32. $100 
  33. $100 
  34. $100 

對(duì)于訪問(wèn)控制資源,生成器顯得非常有用。

迭代工具,你***的朋友

迭代工具模塊包含了操做指定的函數(shù)用于操作迭代器。想復(fù)制一個(gè)迭代器出來(lái)?鏈接兩個(gè)迭代器?以one liner(這里的one-liner只需一行代碼能搞定的任務(wù))用內(nèi)嵌的列表組合一組值?不使用list創(chuàng)建Map/Zip?···,你要做的就是 import itertools,舉個(gè)例子吧:

四匹馬賽跑到達(dá)終點(diǎn)排名的所有可能性:

 
 
 
  1. >>> horses = [1, 2, 3, 4]   
  2. >>> races = itertools.permutations(horses)   
  3. >>> print(races)   
  4.    
  5. >>> print(list(itertools.permutations(horses)))   
  6. [(1, 2, 3, 4),   
  7.  (1, 2, 4, 3),   
  8.  (1, 3, 2, 4),   
  9.  (1, 3, 4, 2),   
  10.  (1, 4, 2, 3),   
  11.  (1, 4, 3, 2),   
  12.  (2, 1, 3, 4),   
  13.  (2, 1, 4, 3),   
  14.  (2, 3, 1, 4),   
  15.  (2, 3, 4, 1),   
  16.  (2, 4, 1, 3),   
  17.  (2, 4, 3, 1),   
  18.  (3, 1, 2, 4),   
  19.  (3, 1, 4, 2),   
  20.  (3, 2, 1, 4),   
  21.  (3, 2, 4, 1),   
  22.  (3, 4, 1, 2),   
  23.  (3, 4, 2, 1),   
  24.  (4, 1, 2, 3),   
  25.  (4, 1, 3, 2),   
  26.  (4, 2, 1, 3),   
  27.  (4, 2, 3, 1),   
  28.  (4, 3, 1, 2),   
  29.  (4, 3, 2, 1)] 

理解迭代的內(nèi)部機(jī)制:

迭代(iteration)就是對(duì)可迭代對(duì)象(iterables,實(shí)現(xiàn)了__iter__()方法)和迭代器(iterators,實(shí)現(xiàn)了__next__()方法)的一個(gè)操作過(guò)程??傻鷮?duì)象是任何可返回一個(gè)迭代器的對(duì)象,迭代器是應(yīng)用在迭代對(duì)象中迭代的對(duì)象,換一種方式說(shuō)的話就是:iterable對(duì)象的__iter__()方法可以返回iterator對(duì)象,iterator通過(guò)調(diào)用next()方法獲取其中的每一個(gè)值(譯者注),讀者可以結(jié)合Java API中的 Iterable接口和Iterator接口進(jìn)行類比。

英文原文:The Python yield keyword explained

原文鏈接:http://blog.jobbole.com/32748/


文章名稱:Python關(guān)鍵字yield詳解
文章源于:http://www.5511xx.com/article/dpppjss.html