亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

大家都知道Python中的循環(huán)結(jié)構(gòu),那么我們分析下python中while和for循環(huán)的本質(zhì)是如何實(shí)現(xiàn)的。

 

循環(huán)的本質(zhì):

看以下代碼:

lst = [10, 20, 30]
# for i in lst:   這個(gè)i的指向其實(shí)指向了 iter(lst)這個(gè)迭代器的__next__
my_iterator = iter(lst)
while True:
 try:
 i = next(my_iterator)
 except StopIteration:
 break
 else:
 print(i)

原來循環(huán)結(jié)構(gòu)主要應(yīng)用了迭代器功能,而迭代器的實(shí)現(xiàn)主要使用yield函數(shù)。

如何理解python當(dāng)中的yield函數(shù)?若要理解python當(dāng)中的yield函數(shù),首先必須理解什么是生成器(generators),在理解生成器之前必須先理解迭代器(iterators).1、迭代器:

當(dāng)你創(chuàng)建一個(gè)列表list,可以一個(gè)元素一個(gè)元素逐個(gè)讀他,這樣的操作稱為迭代 interation :

lst = [10, 20, 30]
for i in lst:
 print(i)
10
20
30

這里lst就稱之為一個(gè)可迭代對(duì)象,當(dāng)你使用列表推導(dǎo)時(shí)(list comprehension),可以生成一個(gè)列表,列表推導(dǎo)的方法如下所示:

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

所有可以用for ... in ... 操作的對(duì)象稱之為可迭代對(duì)象,例如字符,列表文件,集合等等。列表這類可迭代對(duì)象還比較方便,但缺點(diǎn)就是需要存儲(chǔ)在內(nèi)存中的對(duì)象非常多,在值非常多的時(shí)候如果都使用這種方式,就非常占用內(nèi)存。

2、生成器

生成器也是迭代器的一種,是一種只能遍歷一次的可迭代對(duì)象。生成器不需要在內(nèi)存當(dāng)中存儲(chǔ)所有的值,他們是即時(shí)生成值,性能更快,關(guān)鍵是不像列表那樣占用太多內(nèi)存。例如:

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

可以看到,除了使用[]替代()之外,其它都是一樣的。

實(shí)際上他們先生成0,然后忘掉0,再生成1,丟棄1,一直往下,一個(gè)接一個(gè)進(jìn)行處理。

3、Yield函數(shù)yield 函數(shù)有點(diǎn)像Return,區(qū)別在于這個(gè)函數(shù)返回的是迭代器.例如:

def creGenerator():
 mylist = range(3)
 print("創(chuàng)建生成器")
 for i in mylist:
 yield i*i
mygenerator = creGenerator()
for i in mygenerator:
 print(i)

可以看出來,當(dāng)你知道你的函數(shù)會(huì)返回?cái)?shù)量非常大的元素供遍歷時(shí),并且只需讀一次的時(shí)候,使用yield函數(shù)是非常合適的。

若要掌握yield函數(shù),你必須理解當(dāng)你調(diào)用這個(gè)函數(shù)時(shí),函數(shù)內(nèi)部的代碼實(shí)際是沒有執(zhí)行的.這個(gè)函數(shù)只是返回一個(gè)生成器的對(duì)象,當(dāng)實(shí)際遍歷時(shí)(for ... in ... ) yield語句才會(huì)執(zhí)行。

這里是比較有意思的地方:第一次使用for訪問這個(gè)生產(chǎn)器對(duì)象的時(shí)候,
" print("創(chuàng)建生成器")

"這句話才被打印出來,并且打印在"test"之后,說明yield之前的函數(shù)體會(huì)在for第一次循環(huán)時(shí)被調(diào)用一次有且只有調(diào)用一次。但是,如果是這樣情況結(jié)果就不同了:

def createGenerator():
 mylist = range(3)
 print("創(chuàng)建生成器")
 for i in mylist:
 print 'test3'
 yield i*i
 print('test2')
mygenerator = createGenerator()
print('test')
for i in mygenerator:
 print(i)

可見如果在yield語句同級(jí)的代碼塊中的語句,其實(shí)外層for進(jìn)行迭代時(shí),每次都會(huì)執(zhí)行。

分享到:
標(biāo)簽:函數(shù) python yield
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定