欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python迭代器和生成器介紹

系統 2113 0

迭代器

迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。

Python迭代器和生成器介紹_第1張圖片

在for循環中,Python將自動調用工廠函數iter()獲得迭代器,自動調用next()獲取元素,還完成了檢查StopIteration異常的工作。

Python迭代器和生成器介紹_第2張圖片

常用的幾個內建數據結構tuple、list、set、dict都支持迭代器,字符串也可以使用迭代操作。

你也可以自己實現一個迭代器,如上所述,只需要在類的__iter__方法中返回一個對象,這個對象擁有一個next()方法,這個方法能在恰當的時候拋出StopIteration異常即可。但是需要自己實現迭代器的時候不多,即使需要,使用生成器會更輕松。

復制代碼 代碼如下:

#!/usr/bin/env python
# coding=utf-8

class test:
??? def __init__(self, input_list):
??????? self.list = input_list
??????? self.i = 0

??? def __iter__(self):
??????? return self
???
??? def next(self):
??????? if self.i == len(self.list):
??????????? self.i = 0
??????????? raise StopIteration
??????? self.i += 1
??????? return? self.list[self.i - 1]

Python迭代器和生成器介紹_第3張圖片

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

例如:

復制代碼 代碼如下:

/* 把文件一次加載到內存中,然后逐行打印。當文件很大時,這個方法的內存開銷就很大了 */
for line in open("test.txt").readlines():
??? print line

/* 這是最簡單也是運行速度最快的寫法,他并沒顯式的讀取文件,而是利用迭代器每次讀取下一行 */
for line in open("test.txt"):?? #use file iterators
??? print line

生成器

生成器的編寫方法和函數定義類似,只是在return的地方改為yield。

生成器中可以有多個yield。當生成器遇到一個yield時,會暫停運行生成器,返回yield后面的值。當再次調用生成器的時候,會從剛才暫停的地方繼續運行,直到下一個yield。

生成器自身又構成一個迭代器,每次迭代時使用一個yield返回的值。

Python迭代器和生成器介紹_第4張圖片

需要注意的是,生成器中不需要return語句,不需要指定返回值,在生成器中已經存在默認的返回語句

生成器表達式

復制代碼 代碼如下:

(i for i in range(5))
// 返回迭代器
at 0x7ff3e8f0d960>

列表解析,返回list
復制代碼 代碼如下:

[i for i in range(5)]
// 返回list
[0, 1, 2, 3, 4]

?在這里存在一個問題,那就是range(5)會返回一個長度為5的數據,如果是range(1000)那么就會占用一個1000大小的數組空間;如果我們采用`生成器`,在需要的時候產生一個數字,那么空間的占用情況就會降低,這里我們可以使用xrange()函數來實現。
?

復制代碼 代碼如下:

?'''
xrange
??? 函數說明:用法與range完全相同,所不同的是生成的不是一個數組,而是一個生成器。
xrange示例:
'''
>>> xrange(5)
xrange(5)
>>> list(xrange(5))
[0, 1, 2, 3, 4]
>>> xrange(1,5)
xrange(1, 5)
>>> list(xrange(1,5))
[1, 2, 3, 4]
>>> xrange(0,6,2)
xrange(0, 6, 2)
>>> list(xrange(0,6,2))
[0, 2, 4]

所以xrange做循環的性能比range好,尤其是返回很大的時候,盡量用xrange吧,除非你是要返回一個列表。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美精品18videosex性俄罗斯 | 中文视频在线 | 欧美一级在线观看视频 | 五月婷婷丁香 | 欧美色综合| 99久久精品日本一区二区免费 | 牛牛a级毛片在线播放 | 97精品国产高清久久久久蜜芽 | 国产日韩精品一区二区 | 国产精品久久久久久久久久日本 | 中文字幕一区二区三区四区五区 | 免费av一区二区三区 | 欧美成人免费午夜全 | 老人与老人免费a级毛片 | 久久夜色精品国产亚洲 | 五月天婷五月天综合网站 | 无码观看AAAAAAAA片 | 九九热精品在线视频 | www.com黄| 久久9999久久 | 久久久不卡网国产精品一区 | 色先锋av资源中文字幕 | 日本韩国三级在线 | 天堂一区 | 欧洲午夜视频 | 欧美在线观看视频网站 | 国产成人黄网在线免 | 精品在线播放 | 亚洲视频一区在线观看 | 日韩欧美中文字幕在线播放 | 午夜视频在线网站 | 日韩欧美国产一区二区 | www.99re| 亚洲欧美日韩中文不卡 | 欧美a级成人淫片免费看 | 欧美另类综合 | 日韩精品视频在线免费观看 | 毛片免费在线视频 | 精品视频一区二区三区免费 | 日韩有码一区二区三区 | 伊人a.v在线 |