亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > Python > 正文

Python中關(guān)鍵字yield有什么作用?

2019-11-11 07:48:14
字體:
供稿:網(wǎng)友

yield有什么用?

例如下面這段代碼:

def node._get_child_candidates(self, distance, min_dist, max_dist): if self._leftchild and distance - max_dist < self._median: yield self._leftchild if self._rightchild and distance + max_dist >= self._median: yield self._rightchild

下面是調(diào)用它:

result, candidates = list(), [self]while candidates: node = candidates.pop() distance = node._get_dist(obj) if distance <= max_dist and distance >= min_dist: result.extend(node._values) candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))return result

當(dāng)_get_child_candidates方法被調(diào)用的時(shí)候發(fā)生了什么?是返回一個(gè)列表?還是一個(gè)元祖?它還能第二次調(diào)用嗎?后面的調(diào)用什么時(shí)候結(jié)束?

為了理解yield有什么用,首先得理解generators,而理解generators前還要理解iterables

Iterables

當(dāng)你創(chuàng)建了一個(gè)列表,你可以一個(gè)一個(gè)的讀取它的每一項(xiàng),這叫做iteration:

>>> mylist = [1, 2, 3]>>> for i in mylist:... PRint(i)123

Mylist是可迭代的.當(dāng)你用列表推導(dǎo)式的時(shí)候,你就創(chuàng)建了一個(gè)列表,而這個(gè)列表也是可迭代的:

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

所有你可以用在for…in…語(yǔ)句中的都是可迭代的:比如lists,strings,files…因?yàn)檫@些可迭代的對(duì)象你可以隨意的讀取所以非常方便易用,但是你必須把它們的值放到內(nèi)存里,當(dāng)它們有很多值時(shí)就會(huì)消耗太多的內(nèi)存.

Generators

生成器也是迭代器的一種,但是你只能迭代它們一次.原因很簡(jiǎn)單,因?yàn)樗鼈儾皇侨看嬖趦?nèi)存里,它們只在要調(diào)用的時(shí)候在內(nèi)存里生成:

>>> mygenerator = (x*x for x in range(3))>>> for i in mygenerator:... print(i)014

生成器和迭代器的區(qū)別就是用()代替[],還有你不能用for i in mygenerator第二次調(diào)用生成器:首先計(jì)算0,然后會(huì)在內(nèi)存里丟掉0去計(jì)算1,直到計(jì)算完4.

Yield

Yield的用法和關(guān)鍵字return差不多,下面的函數(shù)將會(huì)返回一個(gè)生成器:

>>> def createGenerator():... mylist = range(3)... for i in mylist:... yield i*i...>>> mygenerator = createGenerator() # 創(chuàng)建生成器>>> print(mygenerator) # mygenerator is an object!<generator object createGenerator at 0xb7555c34>>>> for i in mygenerator:... print(i)014

在這里這個(gè)例子好像沒什么用,不過當(dāng)你的函數(shù)要返回一個(gè)非常大的集合并且你希望只讀一次的話,那么它就非常的方便了.

要理解Yield你必須先理解當(dāng)你調(diào)用函數(shù)的時(shí)候,函數(shù)里的代碼并沒有運(yùn)行.函數(shù)僅僅返回生成器對(duì)象,這就是它最微妙的地方:-)

然后呢,每當(dāng)for語(yǔ)句迭代生成器的時(shí)候你的代碼才會(huì)運(yùn)轉(zhuǎn).

現(xiàn)在,到了最難的部分:

當(dāng)for語(yǔ)句第一次調(diào)用函數(shù)里返回的生成器對(duì)象,函數(shù)里的代碼就開始運(yùn)作,直到碰到y(tǒng)ield,然后會(huì)返回本次循環(huán)的第一個(gè)返回值.所以下一次調(diào)用也將運(yùn)行一次循環(huán)然后返回下一個(gè)值,直到?jīng)]有值可以返回.

一旦函數(shù)運(yùn)行并沒有碰到y(tǒng)eild語(yǔ)句就認(rèn)為生成器已經(jīng)為空了.原因有可能是循環(huán)結(jié)束或者沒有滿足if/else之類的.

對(duì)于你的代碼的解釋

生成器:

# 這里你創(chuàng)建node方法的對(duì)象將會(huì)返回一個(gè)生成器def node._get_child_candidates(self, distance, min_dist, max_dist): # 這里的代碼你每次使用生成器對(duì)象的時(shí)候?qū)?huì)調(diào)用 if self._leftchild and distance - max_dist < self._median: yield self._leftchild if self._rightchild and distance + max_dist >= self._median: yield self._rightchild # 如果代碼運(yùn)行到這里,生成器就被認(rèn)為變成了空的調(diào)用:# 創(chuàng)建空列表和一個(gè)當(dāng)前對(duì)象索引的列表result, candidates = list(), [self]# 在candidates上進(jìn)行循環(huán)(在開始只保含一個(gè)元素)while candidates: # 獲得最后一個(gè)condidate然后從列表里刪除 node = candidates.pop() # 獲取obj和candidate的distance distance = node._get_dist(obj) # 如果distance何時(shí)將會(huì)填入result if distance <= max_dist and distance >= min_dist: result.extend(node._values) candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))return result

這段代碼有幾個(gè)有意思的地方:

一般的時(shí)候我們會(huì)在循環(huán)迭代一個(gè)列表的同時(shí)在列表中添加元素:-)盡管在有限循環(huán)里結(jié)束多少有一些危險(xiǎn),但也不失為一個(gè)簡(jiǎn)單的方法去遍歷嵌套的數(shù)據(jù).在這里candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))將遍歷生成器的每一個(gè)值,但是while循環(huán)中的condidates將不再保存已經(jīng)遍歷過的生成器對(duì)象,也就是說添加進(jìn)condidates的生成器對(duì)象只會(huì)遍歷一遍。

extend()是一個(gè)列表對(duì)象的方法,它可以把一個(gè)迭代對(duì)象添加進(jìn)列表.

我們經(jīng)常這么用:

>>> a = [1, 2]>>> b = [3, 4]>>> a.extend(b)>>> print(a)[1, 2, 3, 4]

但是在你給的代碼里得到的是生成器,這樣做的好處:

你不需要讀這個(gè)值兩次 你能得到許多孩子節(jié)點(diǎn)但是你不希望他們?nèi)看嫒雰?nèi)存. 這種方法之所以能很好的運(yùn)行是因?yàn)镻ython不關(guān)心方法的參數(shù)是不是一個(gè)列表.它只希望接受一個(gè)迭代器,所以不管是strings,lists,tuples或者generators都可以!這種方法叫做duck typing,這也是Python看起來特別cool的原因之一.但是這又是另外一個(gè)傳說了,另一個(gè)問題~~

好了,看到這里可以打住了,下面讓我們看看生成器的高級(jí)用法:

控制迭代器的窮盡

>>> class Bank(): # 讓我們建個(gè)銀行,生產(chǎn)許多ATM... crisis = False... def create_atm(self):... while not self.crisis:... yield "$100">>> hsbc = Bank() # 當(dāng)一切就緒了你想要多少ATM就給你多少>>> corner_street_atm = hsbc.create_atm()>>> print(corner_street_atm.next())$100>>> print(corner_street_atm.next())$100>>> print([corner_street_atm.next() for cash in range(5)])['$100', '$100', '$100', '$100', '$100']>>> hsbc.crisis = True # cao,經(jīng)濟(jì)危機(jī)來了沒有錢了!>>> print(corner_street_atm.next())<type 'exceptions.StopIteration'>>>> wall_street_atm = hsbc.create_atm() # 對(duì)于其他ATM,它還是True>>> print(wall_street_atm.next())<type 'exceptions.StopIteration'>>>> hsbc.crisis = False # 麻煩的是,盡管危機(jī)過去了,ATM還是空的>>> print(corner_street_atm.next())<type 'exceptions.StopIteration'>>>> brand_new_atm = hsbc.create_atm() # 只能重新新建一個(gè)bank了>>> for cash in brand_new_atm:... print cash$100$100$100$100$100$100$100$100$100...

它對(duì)于一些不斷變化的值很有用,像控制你資源的訪問.

Itertools,你的好基友

itertools模塊包含了一些特殊的函數(shù)可以操作可迭代對(duì)象.有沒有想過復(fù)制一個(gè)生成器?鏈接兩個(gè)生成器?把嵌套列表里的值組織成一個(gè)列表?Map/Zip還不用創(chuàng)建另一個(gè)列表?

來吧import itertools

來一個(gè)例子?讓我們看看4匹馬比賽有多少個(gè)排名結(jié)果:

>>> horses = [1, 2, 3, 4]>>> races = itertools.permutations(horses)>>> print(races)<itertools.permutations object at 0xb754f1dc>>>> print(list(itertools.permutations(horses)))[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]

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

迭代是可迭代對(duì)象(對(duì)應(yīng)iter()方法)和迭代器(對(duì)應(yīng)next()方法)的一個(gè)過程.可迭代對(duì)象就是任何你可以迭代的對(duì)象(廢話啊).迭代器就是可以讓你迭代可迭代對(duì)象的對(duì)象(有點(diǎn)繞口,意思就是這個(gè)意思)


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
九九久久国产| 黄色a级片免费看| www久久日com| 51漫画成人app入口| 免费电影网站在线观看| 永久免费看片直接| 99欧美视频| 成人av动漫在线| 妺妺窝人体色www看人体| 黑人巨大精品欧美一区二区一视频| 不卡av在线免费观看| 在线观看的黄色网址| 久久资源中文字幕| 成r视频免费观看在线播放| 四虎5151久久欧美毛片| 黄色av电影网站| 国产成人精品一区二区三区网站观看| 亚洲乱码免费伦视频| 黄色免费网站在线| 久久午夜剧场| 日韩三级中文字幕| 天然素人一区二区视频| 色偷偷亚洲男人天堂| 亚洲日韩中文字幕在线播放| 成人看片爽爽爽| 日本aa在线观看| 波多野结衣爱爱视频| 豆国产97在线|亚洲| 久久综合久久久久88| 北条麻妃在线视频| 综合亚洲色图| 中文字幕佐山爱一区二区免费| 亚洲精品影视在线观看| 欧洲亚洲精品在线| 欧美aa在线观看| 色视频免费版高清在线观看| 久久久久久久久丰满| 日韩国产欧美在线播放| 女生裸体视频网站免费观看| 午夜影院在线免费观看| 欧美伊人亚洲伊人色综合动图| 啪啪av大全导航福利综合导航| 欧美一区二区激情视频| 久久亚洲春色中文字幕| 日韩欧美精品在线观看视频| 精品一区二区三区在线视频| 99精品视频在线看| 色噜噜狠狠狠综合曰曰曰88av| 99久热re在线精品996热视频| 精品人伦一区二区三区蜜桃网站| 亚洲自拍小视频免费观看| 懂色av一区二区三区免费看| 日本特黄久久久高潮| 91精品国产一区二区三区动漫| 日本不卡视频一二三区| 日韩精品免费| 亚洲第一综合网| 欧美精品99久久| 欧美a级在线| 国产偷窥老熟盗摄视频| 1024手机在线视频| 欧美成人午夜视频| 亚洲成人手机在线观看| 国产精品永久久久久久久久久| 石原莉奈一区二区三区在线观看| 麻豆一区二区三区精品视频| 欧美一区二区三区小说| 美女网站免费看| 亚洲波多野结衣| 岛国av免费在线| 欧美熟妇激情一区二区三区| 在哪里可以看毛片| 石原莉奈在线亚洲三区| 国产精品国产自产拍高清av王其| 欧美国产日韩精品| www.操操| 国产主播色在线| 老司机午夜免费精品视频| 国产视频第一页| 另类av一区二区| 农村妇女精品一二区| 亚洲人精选亚洲人成在线| 激情成人综合网| 国产51自产区| 9191在线观看| 亚洲国产精彩中文乱码av| 午夜婷婷在线观看| 中文在线字幕av| 动漫美女无遮挡免费| 日本中文字幕伦在线观看| 欧美成人午夜激情视频| 国产深夜精品| 一区在线视频| 99sesese| 亚洲国产午夜伦理片大全在线观看网站| 黄网站在线观看永久免费| 成人午夜电影免费在线观看| 黄色在线网站噜噜噜| 麻豆视频在线观看免费网站| 成人一区二区三区四区| 亚洲综合成人网| 午夜视频在线观看韩国| 欧美日韩夫妻久久| 国产精品无码粉嫩小泬| 亚洲人成无码网站久久99热国产| 91精品综合久久久久久| 国内久久视频| 亚洲国产成人91精品| 欧美一级一级性生活免费录像| 毛片网站免费观看| 国产videos久久| 国内精品中文字幕| 久久免费的精品国产v∧| 青娱乐国产盛宴| 97香蕉久久超级碰碰高清版| 国产精品影视天天线| 中文字幕人妻一区二区在线视频| 黄色综合网址| 亚洲国产高清自拍| 亚洲福利精品| 国产丝袜一区二区三区免费视频| 国产女主播在线一区二区| 四虎影视免费看电影| 欧美精品情趣视频| av大大超碰在线| 国产特级aaaaaa大片| 亚洲中文字幕无码一区二区三区| 在线免费观看污视频| yw193.com尤物在线| 特级西西人体高清大胆| 日韩激情文学| 亚洲大全视频| 久久激情五月激情| 亚洲影视一区二区| 在线观看男女av免费网址| 国产内射老熟女aaaa∵| 男女午夜视频在线观看| 亚洲精品资源美女情侣酒店| 国产主播喷水一区二区| 一区福利视频| 午夜久久中文| 亚洲v国产v| 久久综合色天天久久综合图片| 影音先锋在线亚洲| 国产精品永久久久久久久久久| 日本在线中文字幕一区| 亚洲精品在线网站| 日本最新不卡在线| 黄网动漫久久久| 亚洲一区二区免费看| 成人av动漫在线| 99久久国产综合精品色伊| 一区视频在线看| 日韩欧美大片在线观看| 无码精品在线观看| 2020国产精品小视频| 日本三级电影免费观看| 韩国女同性做爰三级| 欧美四级剧情无删版影片| 国产精品无码人妻一区二区在线| 伊人久久免费视频| 国产成人a v| 做爰无遮挡三级| 91免费国产视频| 日韩欧美专区在线| eeuss在线播放| 国产一区视频在线| 亚洲日本中文字幕免费在线不卡| 国产自产2019最新不卡| 一本色道久久综合亚洲精品小说| 欧美做爰性生交视频| 女厕嘘嘘一区二区在线播放| 小舞被吸乳羞羞网站视频| 免费在线国产视频| 国产美女高潮一区二区三区| 亚洲视频在线观看网站| 九七电影韩国女主播在线观看| 日韩理论视频| 精品日韩美女的视频高清| 中文字幕影音在线| 欧美 激情 在线| 国产精品无码专区av免费播放| 欧美xxxx黑人又粗又长密月| 农村妇女精品一二区| 亚洲综合免费观看高清完整版| 欧美日韩国产丝袜美女| 日韩精品免费视频一区二区三区| 在线观看免费视频污| 国产亚洲欧美中文| 日本激情综合网| av资源站久久亚洲| 热门国产精品亚洲第一区在线| 国产欧美亚洲日本| 婷婷久久国产对白刺激五月99| 天堂国产一区二区三区| 亚洲性猛交xxxxwww| 欧美电影免费提供在线观看| 中文字幕第69页| 岛国视频午夜一区免费在线观看| fc2成人免费人成在线观看播放| 在线免费看黄色片| 亚洲精品av在线播放| 欧美特黄不卡| 热99久久精品| 国产一区 在线播放| 亚洲免费成人在线| 高潮无码精品色欲av午夜福利| 日韩在线xxx| 国产一级黄色av| 奇米精品一区二区三区| 国产污视频在线观看| 国产男女免费视频| 疯狂蹂躏欧美一区二区精品| 亚洲成国产人片在线观看| 欧美sm极限捆绑bd| 蜜桃精品视频在线观看| 一区二区网站| av资源网站在线观看| 欧美日韩激情在线| 欧美成人一区二区三区片免费| 日本少妇高潮喷水xxxxxxx| 草民午夜欧美限制a级福利片| 午夜在线电影亚洲一区| 亚洲av人人澡人人爽人人夜夜| 欧美日韩中文字幕一区二区| 国产成人免费av在线| 国产成人高清激情视频在线观看| 久久精品视频国产| 国产日产精品久久久久久婷婷| 日本欧美一区二区三区不卡视频| 午夜久久中文| 国产精品黄色av| 欧美精品成人久久| 午夜免费福利在线| 亚洲图片欧美日产| 蜜桃视频在线观看免费视频| 91高清免费观看| 中文字幕永久在线视频| 午夜久久福利视频| 欧美一区国产| 亚洲黄色一区| 伊人久久噜噜噜躁狠狠躁| 国产亚av手机在线观看| 一个人看的www免费观看视频| 欧美在线免费视频| 伊人久久综合97精品| 欧美videos极品另类| www.av天天| 欧洲vodafonewi精品| 精品久久久三级丝袜| 99国产精品欲| 久久亚洲私人国产精品va媚药| 日韩丝袜情趣美女图片| 亚洲国产精品av| 蜜桃视频在线观看视频| 亚洲精品tv久久久久久久久| 91精品在线看| 99在线精品免费视频九九视| 首页亚洲中字| 亚洲狼人综合网| 久久久久99精品成人片三人毛片| 国内免费久久久久久久久久久| 亚洲色成人一区二区三区小说| 中文字幕人妻色偷偷久久| 久久久精品一品道一区| 五月天视频在线观看| 99精品女人在线观看免费视频| 在线看的你懂得| 国产成人精品久久一区二区小说| 欧美午夜www高清视频| 亚洲精品永久免费| 亚洲国产欧美一区| 欧美色手机在线观看| 女人十八岁毛片| 国产成人一区二区在线观看| 中文字幕视频在线播放| 91国产精品一区| 亚洲第一视频网| 亚洲AV无码一区二区三区性| 日韩美女黄色片| 免费视频网站在线观看入口| 久久av免费观看| 四季av中文字幕| 亚洲免费在线视频一区 二区| 国产一级做a爰片在线看免费| 亚洲欧洲一区二区三区在线观看| 91视频-88av| 国产乱视频在线观看播放| 999av小视频在线| 日韩一区二区电影在线观看| 国产视频在线观看一区| 亚洲淫性视频| 色婷婷在线视频观看| 中日韩免视频上线全都免费| 久久av导航| 欧美日韩一区二区在线播放| 人妖精品videosex性欧美| 国产精品狼人久久影院观看方式| 国产精彩视频在线观看免费蜜芽| 伦伦影院午夜日韩欧美限制| 麻豆九一精品爱看视频在线观看免费| 免费永久在线观看黄网| 久久久久久久久久久久网站| 久久爱av电影| 国产精品久久久久av福利动漫| 亚洲一二av| 日韩精品一区二区三区免费视频| 国产 日韩 欧美在线| 亚洲成人xxx| 亚洲国产高清在线观看| 亚洲一区自拍偷拍| 国产成人三级在线播放| 一本一道综合狠狠老| 日本不卡一区二区三区| 波多野结衣在线高清| 无码 制服 丝袜 国产 另类| 欧美一区二区三区图| 成人一区二区三区中文字幕| 精品久久香蕉国产线看观看亚洲| 亚洲日本无吗高清不卡| 欧美mv日韩mv国产| 精品白丝av| 亚洲福利视频免费观看| 色一情一交一乱一区二区三区| 亚洲色图20p| 深夜视频在线观看| 免费超碰在线| 99精品久久99久久久久|