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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
弄懂這6個(gè)問題,拿下Python生成器!

今天介紹生成器和yield的用法,通過如下8、9個(gè)小問題,相信大家會(huì)對(duì)它們有一點(diǎn)新的認(rèn)識(shí)。

成都創(chuàng)新互聯(lián)堅(jiān)信:善待客戶,將會(huì)成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨?。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。十余年網(wǎng)站建設(shè)經(jīng)驗(yàn)成都創(chuàng)新互聯(lián)是成都老牌網(wǎng)站營銷服務(wù)商,為您提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、HTML5建站、網(wǎng)站制作、品牌網(wǎng)站制作、微信小程序服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。

1. 什么是可迭代對(duì)象?

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

如下,常見的list,Iterator等都是Iterable對(duì)象:

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

2. 什么是一個(gè)生成器?

生成器是可迭代的(Iterable),最簡(jiǎn)單的創(chuàng)建生成器方法是通過一對(duì)(),如下所示:

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

g 是一個(gè)生成器對(duì)象,generator object

獲取生成器對(duì)象的元素,可使用next函數(shù),如下所示,獲取第一個(gè)元素:

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

獲取第二個(gè)元素:

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

3. 創(chuàng)建生成器的幾種方法?

如上所見,使用一對(duì)()能夠創(chuàng)建一個(gè)生成器對(duì)象。

除此之外,想必大家也都知道,是使用關(guān)鍵字 yield. yield出現(xiàn)在一個(gè)函數(shù)中,運(yùn)行到y(tǒng)ield處,返回的對(duì)象便是生成器對(duì)象(generator object).

4. 生成器是迭代器嗎?

生成器對(duì)象(generator object)一定也是迭代器對(duì)象(Iterator object),如上面的生成器g,使用內(nèi)置函數(shù)isinstance驗(yàn)證,返回True:

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

因此,它具備一切迭代器的特性,關(guān)于迭代器我們已在上一個(gè)話題討論,簡(jiǎn)而言之,迭代器的幾個(gè)特點(diǎn):

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

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

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

yield 關(guān)鍵字的用法在stackoverflow上也是最熱的問題之一,借用一個(gè)最熱回答中的解釋:

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

yield 是一個(gè)特殊的return, 它返回一個(gè)生成器對(duì)象。

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

6. 如何精通yield的用法?

要想精通yield,你必須首先搞清楚一點(diǎn):

當(dāng)你調(diào)用帶有yield的函數(shù)時(shí),函數(shù)并沒有執(zhí)行任何一行,只是返回一個(gè)生成器對(duì)象

為了幫助大家理解,創(chuàng)建一個(gè)帶有yield的函數(shù):

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

為了加深印象,你可以自己調(diào)試驗(yàn)證一遍,函數(shù)第一行打的斷點(diǎn)始終未被命中。

帶yield的函數(shù)和for結(jié)合使用,第一次調(diào)用上一步創(chuàng)建的生成器對(duì)象后,將會(huì)進(jìn)入函數(shù)體直到遇到y(tǒng)ield返回值。

然后,for循環(huán)再進(jìn)入函數(shù)時(shí),直接跑到y(tǒng)ield的下一句。直到生成器對(duì)象變空為止。

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

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

參考錄制的gif:

7. yield 都有哪些重要價(jià)值?

Python引入yield后,便擁有具備實(shí)現(xiàn)協(xié)程的能力,協(xié)程的確是一種高效的編程模型,關(guān)于協(xié)程的理解,后面專題會(huì)詳細(xì)討論。包括更高級(jí)的功能如異步等,根基都是yield.

8. yield 和 itertools

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

9. yield 使用案例

yield實(shí)現(xiàn)浮點(diǎn)數(shù)步長的frange:

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

調(diào)用frange:

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

結(jié)果:

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

分享標(biāo)題:弄懂這6個(gè)問題,拿下Python生成器!
標(biāo)題URL:http://m.5511xx.com/article/djhcdpe.html