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

弄懂這 6 個問題,拿下 Python 生成器!

開發 后端
今天介紹生成器和yield的用法,通過如下8、9個小問題,相信大家會對它們有一點新的認識。

今天介紹生成器和yield的用法,通過如下8、9個小問題,相信大家會對它們有一點新的認識。

[[344843]]

1. 什么是可迭代對象?

可迭代對象,英文Iterable,是一個形容詞,這類對象和Java語言類似,都可看作是一類接口,抽象地描述事物具備怎樣的能力。所以,Iterable自然具備可迭代能力。

如下,常見的list,Iterator等都是Iterable對象:

  1. In [33]: from collections.abc import Iterable,Iterator                       
  2.  
  3. In [34]: issubclass(list,Iterable)                                           
  4. Out[34]: True 
  5.  
  6. In [35]: issubclass(Iterator,Iterable)  

2. 什么是一個生成器?

生成器是可迭代的(Iterable),最簡單的創建生成器方法是通過一對(),如下所示:

  1. In [37]: g = (i*i for i in [1,4,0])                                          
  2.  
  3. In [38]: g                                                                   
  4. Out[38]: <generator object <genexpr> at 0x7fe8956e96d0> 

g 是一個生成器對象,generator object

獲取生成器對象的元素,可使用next函數,如下所示,獲取第一個元素:

  1. In [39]: next(g)                                                             
  2. Out[39]: 1 

獲取第二個元素:

  1. In [40]: next(g)                                                             
  2. Out[40]: 16 

3. 創建生成器的幾種方法?

如上所見,使用一對()能夠創建一個生成器對象。

除此之外,想必大家也都知道,是使用關鍵字 yield. yield出現在一個函數中,運行到yield處,返回的對象便是生成器對象(generator object).

4. 生成器是迭代器嗎?

生成器對象(generator object)一定也是迭代器對象(Iterator object),如上面的生成器g,使用內置函數isinstance驗證,返回True:

  1. In [43]: isinstance(g,Iterator)                                              
  2. Out[43]: True 

因此,它具備一切迭代器的特性,關于迭代器我們已在上一個話題討論,簡而言之,迭代器的幾個特點:

  • 是有去無回的,
  • 迭代器無需提前知道整個列表的所有元素,
  • 無需加載所有元素到RAM中盡而它是節省內存的(memory-efficient).

生成器同樣具備這些特性。除此之外,它還有一些獨有的特性,下面跟隨yield 我們便能看出來。

5. 如何用一句話描述 yield?

yield 關鍵字的用法在stackoverflow上也是最熱的問題之一,借用一個最熱回答中的解釋:

 yield is a keyword that is used like return, except the function will return a generator.

yield 是一個特殊的return, 它返回一個生成器對象。

說實話,理解這些只是皮毛。那么,如何精通yield的用法呢?

6. 如何精通yield的用法?

要想精通yield,你必須首先搞清楚一點:

當你調用帶有yield的函數時,函數并沒有執行任何一行,只是返回一個生成器對象

為了幫助大家理解,創建一個帶有yield的函數:

  1. def gfun(): 
  2.     mylist = range(3) 
  3.     for i in mylist: 
  4.         yield i*i 
  5.  
  6. g = gfun() 
  7. print(g) 

為了加深印象,你可以自己調試驗證一遍,函數第一行打的斷點始終未被命中。

帶yield的函數和for結合使用,第一次調用上一步創建的生成器對象后,將會進入函數體直到遇到yield返回值。

然后,for循環再進入函數時,直接跑到yield的下一句。直到生成器對象變空為止。

使用下面代碼演示yield的上面過程:

  1. def createGenerator(): 
  2.     mylist = range(3) 
  3.     for i in mylist: 
  4.         yield i*i 
  5.         print(i*i) 
  6.  
  7. g = createGenerator() 
  8. print(g) 
  9. for gi  in g: 
  10.     pass 

參考錄制的gif:


7. yield 都有哪些重要價值?

Python引入yield后,便擁有具備實現協程的能力,協程的確是一種高效的編程模型,關于協程的理解,后面專題會詳細討論。包括更高級的功能如異步等,根基都是yield.

8. yield 和 itertools

yield重要性和使用廣泛性還提現在,Python單獨一個模塊專門用于管理迭代器和生成器對象,便是itertools,里面封裝的方法特性后面再討論。

9. yield 使用案例

yield實現浮點數步長的frange:

  1. def frange(start,end,step): 
  2.     i = start 
  3.     while i<end: 
  4.         yield round(i,3) 
  5.         i+=step 

調用frange:

  1. for item in frange(10,14,0.8): 
  2.     print(item) 

結果:

  1. 10 
  2. 10.8 
  3. 11.6 
  4. 12.4 
  5. 13.2 

 

責任編輯:趙寧寧 來源: Python與算法社區
相關推薦

2020-09-21 09:55:06

Python迭代器開發

2024-08-19 00:00:00

表單生成器開發開源

2019-01-24 09:46:38

PelicanPython生成器

2023-02-07 16:11:41

2022-07-25 10:27:36

背景生成器工具前端

2017-09-06 09:26:03

Python生成器協程

2021-12-04 22:07:44

Python

2012-03-30 09:31:44

WEBCSS

2011-12-23 13:42:05

JavaScript

2010-09-07 16:31:17

SQL語句insert

2021-04-22 21:15:38

Generator函數生成器

2015-08-25 11:07:58

2017-07-01 16:02:39

分布式ID生成器

2025-01-23 08:36:27

CSS開發工具

2024-11-11 06:10:00

Python生成器迭代器

2022-10-17 18:29:55

2017-06-26 16:26:15

Python迭代對象迭代器

2024-11-01 15:51:06

2023-05-17 16:02:00

CSS工具代碼生成器

2015-08-25 15:54:17

程序員代碼生成器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99re视频在线 | 日韩在线一区二区 | 99精品亚洲国产精品久久不卡 | 国产一级一级毛片 | 国产精品色 | 亚洲一区播放 | 天天操天天拍 | 国产一级一片免费播放 | 日韩精品 电影一区 亚洲 | 成人精品一区二区三区中文字幕 | 午夜视频一区二区三区 | 国产一级片 | 久久新视频 | 中文字幕av在线 | 亚洲美女网站 | 欧美一区二区三区一在线观看 | 亚洲精品自拍视频 | 欧美成人精品二区三区99精品 | 一级黄色淫片 | 大学生a级毛片免费视频 | 国产精品1区| 91精品国产综合久久精品 | 精品久久香蕉国产线看观看亚洲 | jizz在线看片 | 色站综合 | 精品一区电影 | 精品国产一区二区三区av片 | 欧美午夜精品 | 亚洲午夜在线 | 国产一区二区三区四区 | 欧美成人精品一区二区男人看 | 久久亚洲国产 | 日韩在线观看一区二区三区 | 成人国产精品久久 | 91热爆在线观看 | 丝袜毛片 | 免费视频久久 | 国产做爰 | 日韩一区二区三区在线 | 欧美黄色片 | 99久久免费精品视频 |