成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python關鍵字yield詳解

開發 后端
此文由伯樂在線 –劉志軍編譯自stackoverflow Python標簽中投票率最高的一個問題《The Python yield keyword explained》,e-satis 詳細回答了關于yield 以及 generator、iterable、iterator、iteration之間的關系。

迭代器(Iterator)

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

  1. mylist = [123]   
  2.  for i in mylist :   
  3.  print(i)   
  4. 1 
  5. 2 
  6. 3 

Mylist就是一個迭代器,不管是使用復雜的表達式列表,還是直接創建一個列表,都是可迭代的對象。

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

你可以使用“for··· in ···”來操作可迭代對象,如:list,string,files,這些迭代對象非常方便我們使用,因為你可以按照你的意愿進行重復的讀取。但是你不得不預先存儲所有的元素在內存中,那些對象里有很多元素時,并不是每一項都對你有用。

生成器(Generators)

生成器同樣是可迭代對象,但是你只能讀取一次,因為它并沒有把所有值存放內存中,它動態的生成值:

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

使用()和[]結果是一樣的,但是,第二次執行“ for in mygenerator”不會有任何結果返回,因為它只能使用一次。首先計算0,然后計算1,之后計算4,依次類推。

Yield

Yield是關鍵字, 用起來像return,yield在告訴程序,要求函數返回一個生成器。

  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. <generator object createGenerator at 0xb7555c34>   
  9. for i in mygenerator:   
  10. print(i)   
  11. 0 
  12. 1 
  13. 4 

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

函數***次運行時,它會從函數開始處直到碰到yield時,就返回循環的***個值,然后,交互的運行、返回,直到沒有值返回為止。如果函數在運行但是并沒有遇到yield,就認為該生成器是空,原因可能是循環終止,或者沒有滿足任何”if/else”。

接下來讀一小段代碼來理解生成器的優點:

控制生成器窮舉

  1. >>> class Bank(): # 創建銀行,構造ATM機   
  2. ...    crisis = False 
  3. ...    def create_atm(self) :   
  4. ...        while not self.crisis :   
  5. ...            yield "$100" 
  6. >>> hsbc = Bank() # 沒有危機時,你想要多少,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 # 危機來臨,銀行沒錢了   
  15. >>> print(corner_street_atm.next())   
  16. <type 'exceptions.StopIteration'>   
  17. >>> wall_street_atm = hsbc.ceate_atm() # 新建ATM,銀行仍然沒錢   
  18. >>> print(wall_street_atm.next())   
  19. <type 'exceptions.StopIteration'>   
  20. >>> hsbc.crisis = False # 麻煩就是,即使危機過后銀行還是空的   
  21. >>> print(corner_street_atm.next())   
  22. <type 'exceptions.StopIteration'>   
  23. >>> brand_new_atm = hsbc.create_atm() # 構造新的ATM,恢復業務   
  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 

對于訪問控制資源,生成器顯得非常有用。

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

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

四匹馬賽跑到達終點排名的所有可能性:

  1. >>> horses = [1234]   
  2. >>> races = itertools.permutations(horses)   
  3. >>> print(races)   
  4. <itertools.permutations object at 0xb754f1dc>   
  5. >>> print(list(itertools.permutations(horses)))   
  6. [(1234),   
  7.  (1243),   
  8.  (1324),   
  9.  (1342),   
  10.  (1423),   
  11.  (1432),   
  12.  (2134),   
  13.  (2143),   
  14.  (2314),   
  15.  (2341),   
  16.  (2413),   
  17.  (2431),   
  18.  (3124),   
  19.  (3142),   
  20.  (3214),   
  21.  (3241),   
  22.  (3412),   
  23.  (3421),   
  24.  (4123),   
  25.  (4132),   
  26.  (4213),   
  27.  (4231),   
  28.  (4312),   
  29.  (4321)] 

理解迭代的內部機制:

迭代(iteration)就是對可迭代對象(iterables,實現了__iter__()方法)和迭代器(iterators,實現了__next__()方法)的一個操作過程。可迭代對象是任何可返回一個迭代器的對象,迭代器是應用在迭代對象中迭代的對象,換一種方式說的話就是:iterable對象的__iter__()方法可以返回iterator對象,iterator通過調用next()方法獲取其中的每一個值(譯者注),讀者可以結合Java API中的 Iterable接口和Iterator接口進行類比。

英文原文:The Python yield keyword explained

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

責任編輯:張偉 來源: 伯樂在線
相關推薦

2009-12-18 11:37:54

Ruby關鍵字yiel

2023-12-11 13:59:00

YieldPython生成器函數

2009-09-02 09:24:03

C# this關鍵字

2019-08-29 09:11:38

Pythonyield語法

2011-06-14 13:26:27

volatile

2022-11-12 18:32:50

Golangomitemptyjson

2021-02-01 13:10:07

Staticc語言UNIX系統

2025-01-22 08:06:38

C#yield數據迭代

2021-07-27 07:31:16

單例模式關鍵字

2018-04-20 15:56:09

Pythonglobal關鍵字

2009-09-28 11:34:49

Javascript

2025-06-13 08:00:00

Java并發編程volatile

2017-05-27 20:59:30

Java多線程synchronize

2010-02-05 15:51:06

C++ explici

2023-03-09 07:38:58

static關鍵字狀態

2023-11-10 09:29:30

MySQLExplain

2024-03-15 11:52:03

C++關鍵字編程

2009-08-26 09:58:22

C#關鍵字

2022-05-06 08:32:40

Pythonwith代碼

2020-08-23 11:03:24

Python開發void
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品视频在线观看 | 人人精品| 欧美精品一区二区三区在线播放 | 91精品在线播放 | 国产成人在线视频 | 日韩亚洲一区二区 | 欧美视频一区二区三区 | 国内毛片毛片毛片毛片 | 夜夜夜夜草 | 国产成人精品区一区二区不卡 | 精品久久亚洲 | 成人免费小视频 | 91爱爱·com | 国产成人免费视频网站高清观看视频 | 香蕉久久a毛片 | 久草色播| 亚洲成人在线免费 | 黄免费在线 | 欧美久久久久久久久中文字幕 | 久久精品99国产精品 | www久久| 日韩中文字幕在线 | 狠狠操婷婷 | 亚洲 精品 综合 精品 自拍 | 国产一区二区三区四区三区四 | 欧美综合一区 | 成人在线视频免费看 | 91精品国产自产精品男人的天堂 | 中文字幕一区二区三区四区不卡 | 久久aⅴ乱码一区二区三区 91综合网 | 欧美精品在欧美一区二区 | 黄色毛片在线观看 | 日韩在线观看网站 | 亚洲视频二区 | 欧美精品一区二区三区四区 在线 | 嫩草视频在线 | 一级看片免费视频囗交动图 | 九九精品在线 | 国产激情视频在线观看 | 亚洲成人av| 成人午夜影院 |