亚洲香蕉成人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ā)表
天堂中文在线www| 国产一区视频网站| 免费黄色一级大片| 精品日韩一区二区三区| www.黄色国产| 98精品国产高清在线xxxx天堂| 男人午夜视频| 香蕉视频免费在线| 欧美97人人模人人爽人人喊视频| 黄漫在线播放| 好紧好硬好湿我太爽了| 亚洲乱码视频| 国内精品偷拍视频| 亚洲一区在线视频| 日韩午夜精品视频| 中文字幕一区二区三区在线播放| 日韩电影在线观看网站| 91在线视频观看免费| 亚洲欧美国产77777| 欧美视频在线免费看| 成人美女在线观看| 色网站在线看| av在线国产精品| 在线 丝袜 欧美 日韩 制服| 亚洲网站在线免费观看| 天堂网视频在线观看| 国产999精品久久久久久| 视频精品国内| japanese在线播放| av在线不卡观看免费观看| 99久久国产综合精品色伊| 亚州欧美一区三区三区在线| 伊人男人综合视频网| 国产网站在线免费观看| 亚洲www在线观看| 国产成人一二三区| 看全色黄大色大片免费久久久| 欧美一级黄色片视频| 综合国产视频| 17c丨国产丨精品视频| 国产一级片子| 精品乱色一区二区中文字幕| 轻点好疼好大好爽视频| 日本91av在线播放| 日韩一级毛片| 伊人夜夜躁av伊人久久| 精品亚洲porn| 日韩avvvv在线播放| 中文字幕日韩一区二区三区| 97国产真实伦对白精彩视频8| 91精选在线观看| 亚洲中文字幕无码不卡电影| 久久久精品在线视频| 俺去啦俺在线观看| 国产女人aaa级久久久级| 黄色片免费网址| 亚洲xxx在线| 国产高清第一页| 日本高清视频在线| 国产小视频免费在线观看| 色播久久人人爽人人爽人人片视av| 黑粗硬长欧美在线视频免费的| 欧美色图免费看| 91日韩免费| 久久久国产综合精品女国产盗摄| 污黄色在线观看| 天堂中文av| 亚洲妇女av| 国产精品字幕| 日韩www在线| 欧美一区自拍| 成人动漫视频在线观看| 欧美xxxbbb| 都市激情在线视频| 伦理av在线| 亚洲黄色一区二区三区| 四虎地址8848精品| www红色一片_亚洲成a人片在线观看_| 99久久亚洲精品蜜臀| 影音先锋男人每日资源站| 狠狠操狠狠色综合网| 日本一区二区三区四区五区六区| 日本黄色中文字幕| 热门国产精品亚洲第一区在线| 国模无码视频一区| 国产精品欧美久久久久一区二区| 成人婷婷网色偷偷亚洲男人的天堂| 九色视频在线观看| 91九色精品视频| 精品xxxxxbbbb欧美中文| 高清孕妇孕交╳╳交| 精品视频一区 二区 三区| 欧美中文字幕| 四虎最新地址发布| 丁香视频五月| 亚洲宅男天堂在线观看无病毒| 久久久精品区| 日本桃色视频| 清纯唯美亚洲激情| 成人欧美一区二区三区在线湿哒哒| 亚洲一二三在线| 国产婷婷色一区二区三区在线| 国产免费麻豆视频| 热这里只有精品| 久久五月天色综合| 久久久亚洲成人| 女生裸体视频一区二区三区| 亚洲国产精品午夜在线观看| 精品一区二区三区免费毛片爱| 中文字幕免费高清在线| 亚洲色图第三页| 日韩精品123区| 国产日韩欧美自拍| 亚洲一二三四2021不卡| 久久久久se| 色综合久久六月婷婷中文字幕| 欧美一级片在线播放| av久久网站| 欧美一区二区三区色| 亚洲欧美另类小说视频| va天堂va亚洲va影视| 免费成人在线观看av| 亚洲三级在线观看| 粉嫩高清一区二区三区精品视频| 日本a在线播放| 中文字幕日韩一区| 疯狂揉花蒂控制高潮h| 欧美v亚洲v综合ⅴ国产v| 国产精品视频内| 91免费版看片| 欧美日韩国内自拍| 人妻视频一区二区| 国产精品久久久久久久久久新婚| 亚洲一区二区在线播放| 精品视频一区二区三区在线观看| 精品国产伦一区二区三| 日本aⅴ中文| 欧洲亚洲成人| 日韩国产综合| 日本少妇xxxxx| 奇米亚洲午夜久久精品| 日韩美一区二区| 日韩国产欧美| 极品粉嫩饱满一线天在线| 一区二区三区四区视频精品免费| 国产91对白在线观看九色| 日韩精品99| 欧美中文字幕视频| 国产精品中文字幕欧美| 国产美女无遮挡永久免费| 一本高清dvd不卡在线观看| 国产一区二区不卡老阿姨| 伊人色综合久久天天五月婷| 国产成人精品18| 丝袜足控免费网站xx网站| 日产精品一线二线三线芒果| 成人免费观看网站| 亚洲国产精品久久久久秋霞不卡| 久久国产精品亚洲人一区二区三区| 中文字幕第17页| 888av在线| 亚洲第一天堂网| 国产传媒日韩欧美成人| 欧美视频久久| 亚洲搞黄视频| 在线观看日韩| 成人国产在线观看| 91网站在线看| 欧美一级二级三级蜜桃| 国产精品无圣光一区二区| 波多野结衣在线aⅴ中文字幕不卡| 欧美插天视频在线播放| 亚洲精品久久久久久动漫器材一区| 日本福利视频| 青青成人在线| 我要看一级黄色录像| 亚洲欧洲三级电影| 91精品国产视频| 日韩精品极品在线观看播放免费视频| 日韩精品一区二区三区老鸭窝| sihu影院永久在线影院| 日本人视频jizz页码69| 福利视频在线播放| 日本三级一区二区三区| 亚洲精品中文字幕av| 亚洲第一第二区| 婷婷六月天在线| 国产精品一区视频网站| 欧美日韩系列| 久久人人爽人人爽人人片亚洲| 残酷重口调教一区二区| 色的视频在线免费看| cao在线视频| 在线精品自拍| 免费一级特黄特色毛片久久看| 97一区二区国产好的精华液| 色婷婷久久久亚洲一区二区三区| 国产女呦网站| 国产欧美日韩精品丝袜高跟鞋| 亚洲欧美日韩中文字幕一区二区三区| 色大师av一区二区三区| 亚洲欧美日韩国产yyy| 亚洲欧美精品一区| 色域天天综合网| 天天爽天天爽夜夜爽| 成人小视频免费看| 欧美日韩导航| jizz蜜桃视频在线观看| 国外成人免费在线播放| 五月婷婷综合在线观看| 男人的天堂av高清在线| 久久久久久久少妇| 日本激情免费| 国产成人免费av在线| 成人疯狂猛交xxx| 国产三级精品在线观看| 91色国产在线| 欧美日韩中文在线| a级免费在线观看| 久久精品免费看| 91视频最新网址| 亚洲免费观看高清完整版在线| 久久久久亚洲AV成人无在| 色哟哟在线观看一区二区三区| 亚洲精品五月天| 妺妺窝人体色www聚色窝仙踪| 91香蕉国产在线观看软件| 色网站免费观看| 久久久久久久久久久久久久久久久久久| 精品视频—区二区三区免费| 在线观看日韩中文字幕| 国产3p在线播放| 成人一区二区三区在线观看| 麻豆精品在线| 国产精品精品国产| 精品一区二区三区在线播放| 日本高清一二三区| 欧美大胆人体bbbb| 国产视频不卡在线| 亚洲成人a级片| 91制片厂毛片| 欧洲一区二区三区精品| 精品无人区卡一卡二卡三乱码免费卡| 电影午夜精品一区二区三区| 日韩国产一区二区| 日韩人妻无码精品综合区| 男人的天堂在线免费视频| 成人av在线播放| 欧美一级理论性理论a| 国产一区国产精品| 国产精品欧美日韩| 丰满人妻熟女aⅴ一区| 亚洲精品在线91| 在线亚洲天堂| 国产三级在线播放| 国产激情视频一区二区三区| 九九久久免费视频| 法国空姐电影在线观看| √…a在线天堂一区| 极品少妇xxxx精品少妇| 精品av一区二区| 日韩精品一区二区三区国语自制| 欧在线一二三四区| 91精品福利在线一区二区三区| 国产精品午夜在线观看| 欧美午夜欧美| 青草视频在线免费直播| 久久久亚洲精品无码| 九九热视频在线| 国产中文日韩欧美| 日韩中文字幕在线播放| 色欲av永久无码精品无码蜜桃| 在线观看视频网站你懂得| 青青草视频在线观看免费| 翔田千里一区二区| 97超碰人人模人人人爽人人爱| 高清精品久久| 久久免费偷拍视频| 污污的网站在线免费观看| 主播福利视频一区| 国产精品成人a在线观看| 女同互忝互慰dv毛片观看| 熟女俱乐部一区二区| 欧美人动与zoxxxx乱| 国产视色精品亚洲一区二区| 国产精品久久久久aaaa九色| 久久久免费精品视频| 天堂精品久久久久| 刘亦菲久久免费一区二区| av大大超碰在线| 久久亚洲影院| 欧美精品亚洲一区二区在线播放| 久久久久无码国产精品| k8久久久一区二区三区| av麻豆国产| 粉嫩av一区二区三区天美传媒| 国产日韩欧美一区二区三区乱码| 欧美成人在线影院| 精品国产亚洲一区二区在线观看| 国产精品私人影院| 久久久久久久久久久久国产| 里番精品3d一二三区| 欧美日韩天天操| 丁香五月网久久综合| 亚洲小说春色综合另类电影| 丝袜美腿亚洲综合| 国产一区二区三区在线观看视频| 精品国产免费一区二区三区香蕉| 日韩av综合| 男女免费观看在线爽爽爽视频| 作爱视频免费观看视频在线播放激情网| 国产免费观看高清视频| 国产精品美女久久久久aⅴ国产馆| 99免费精品| 欧美电影三区| 香蕉视频免费看| 久草免费在线播放| 乱色精品无码一区二区国产盗| 香蕉视频在线观看免费| 无码精品国产一区二区三区免费| 一广人看www在线观看免费视频| 亚洲精品欧美日韩| 国产日韩欧美综合在线| 538任你躁在线精品视频网站| 国产精品视频中文字幕91| 亚洲欧美日本一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整| 日日天天久久|