最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python學(xué)習(xí)筆記之迭代器和生成器用法實(shí)例詳解

 更新時(shí)間:2019年08月08日 11:03:25   作者:Johnny丶me  
這篇文章主要介紹了Python學(xué)習(xí)筆記之迭代器和生成器用法,結(jié)合實(shí)例形式詳細(xì)分析了Python迭代器與生成器的功能、原理、定義及使用方法,需要的朋友可以參考下

本文實(shí)例講述了Python學(xué)習(xí)筆記之迭代器和生成器用法。分享給大家供大家參考,具體如下:

迭代器和生成器

迭代器

  • 每次可以返回一個(gè)對(duì)象元素的對(duì)象,例如返回一個(gè)列表。我們到目前為止使用的很多內(nèi)置函數(shù)(例如 enumerate)都會(huì)返回一個(gè)迭代器。
  • 是一種表示數(shù)據(jù)流的對(duì)象。這與列表不同,列表是可迭代對(duì)象,但不是迭代器,因?yàn)樗皇菙?shù)據(jù)流。

生成器

  • 是使用函數(shù)創(chuàng)建迭代器的簡(jiǎn)單方式。也可以使用類定義迭代器

下面是一個(gè)叫做 my_range 的生成器函數(shù),它會(huì)生成一個(gè)從 0 到 (x - 1) 的數(shù)字流:

def my_range(x):
  i = 0
  while i < x:
    yield i
    i += 1

該函數(shù)使用了 yield 而不是關(guān)鍵字 return。這樣使函數(shù)能夠一次返回一個(gè)值,并且每次被調(diào)用時(shí)都從停下的位置繼續(xù)。關(guān)鍵字 yield 是將生成器與普通函數(shù)區(qū)分開(kāi)來(lái)的依據(jù)。

因?yàn)樯鲜龃a會(huì)返回一個(gè)迭代器,因此我們可以將其轉(zhuǎn)換為列表或用 for 循環(huán)遍歷它,以查看其內(nèi)容。例如,下面的代碼:

for x in my_range(5):
  print(x)

輸出如下:

0
1
2
3
4

為何要使用生成器?

  • 生成器是構(gòu)建迭代器的 “懶惰” 方式。當(dāng)內(nèi)存不夠存儲(chǔ)完整實(shí)現(xiàn)的列表時(shí),或者計(jì)算每個(gè)列表元素的代價(jià)很高,你希望盡量推遲計(jì)算時(shí),就可以使用生成器。但是這些元素只能遍歷一次。
  • 由于使用生成器是一次處理一個(gè)數(shù)據(jù),在內(nèi)存和存儲(chǔ)的需求上會(huì)比使用list方式直接全部生成再存儲(chǔ)節(jié)省很多資源。由此區(qū)別,在處理大量數(shù)據(jù)時(shí),經(jīng)常使用生成器初步處理數(shù)據(jù)后,再進(jìn)行長(zhǎng)期存儲(chǔ),而不是使用 list。
  • 因?yàn)闊o(wú)論使用生成器還是 list,都是使用過(guò)就要丟棄的臨時(shí)數(shù)據(jù)。既然功能和結(jié)果一樣,那就不如用生成器。
  • 但是生成器也有自己的局限,它產(chǎn)生的數(shù)據(jù)不能回溯,不像list可以任意選擇。

迭代器和生成器[相關(guān)練習(xí)]

請(qǐng)自己寫(xiě)一個(gè)效果和內(nèi)置函數(shù) enumerate 一樣的生成器函數(shù)。如下所示地調(diào)用該函數(shù):

lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"]
for i, lesson in my_enumerate(lessons, 1):
  print("Lesson {}: {}".format(i, lesson))

應(yīng)該會(huì)輸出:

Lesson 1: Why Python Programming
Lesson 2: Data Types and Operators
Lesson 3: Control Flow
Lesson 4: Functions
Lesson 5: Scripting

解決方案:

lessons = ["Why Python Programming", "Data Types and Operators", "Control Flow", "Functions", "Scripting"]
def my_enumerate(iterable, start=0):
  # Implement your generator function here
  i = start
  for element in iterable:
    yield i, element
    i += 1
for i, lesson in my_enumerate(lessons, 1):
  print("Lesson {}: {}".format(i, lesson))

如果可迭代對(duì)象太大,無(wú)法完整地存儲(chǔ)在內(nèi)存中(例如處理大型文件時(shí)),每次能夠使用一部分很有用。實(shí)現(xiàn)一個(gè)生成器函數(shù) chunker,接受一個(gè)可迭代對(duì)象并每次生成指定大小的部分?jǐn)?shù)據(jù)。如下所示地調(diào)用該函數(shù):

for chunk in chunker(range(25), 4):
  print(list(chunk))

應(yīng)該會(huì)輸出:

  [0, 1, 2, 3]
  [4, 5, 6, 7]
  [8, 9, 10, 11]
  [12, 13, 14, 15]
  [16, 17, 18, 19]
  [20, 21, 22, 23]
  [24]

解決方案:

def chunker(iterable, size):
  for i in range(0, len(iterable), size):
    yield iterable[i:i + size]
for chunk in chunker(range(25), 4):
  print(list(chunk))

學(xué)習(xí)參考:

https://www.python.org/dev/peps/pep-0257/

https://docs.python.org/3/tutorial/classes.html#iterators

https://softwareengineering.stackexchange.com/questions/290231/when-should-i-use-a-generator-and-when-a-list-in-python/290235

https://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python?time時(shí)間格式化和設(shè)置時(shí)區(qū)實(shí)現(xiàn)代碼詳解

    Python?time時(shí)間格式化和設(shè)置時(shí)區(qū)實(shí)現(xiàn)代碼詳解

    這篇文章主要介紹了Python?time時(shí)間格式化和設(shè)置時(shí)區(qū)實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值
    2023-02-02
  • Python實(shí)現(xiàn)統(tǒng)計(jì)文本中的字符數(shù)量

    Python實(shí)現(xiàn)統(tǒng)計(jì)文本中的字符數(shù)量

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)統(tǒng)計(jì)文本中的字符數(shù)量,包括中/英文字符、數(shù)字、特殊字符等,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Pandas中如何對(duì)DataFrame列名進(jìn)行重命名

    Pandas中如何對(duì)DataFrame列名進(jìn)行重命名

    在做數(shù)據(jù)挖掘的時(shí)候,想改一個(gè)DataFrame的column名稱,所以就查了一下,下面這篇文章主要給大家介紹了關(guān)于Pandas中如何對(duì)DataFrame列名進(jìn)行重命名的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Python實(shí)現(xiàn)接口自動(dòng)化測(cè)試的方法詳解

    Python實(shí)現(xiàn)接口自動(dòng)化測(cè)試的方法詳解

    Python接口自動(dòng)化測(cè)試是一種高效、可重復(fù)的軟件質(zhì)量驗(yàn)證方法,尤其在現(xiàn)代軟件開(kāi)發(fā)中,它已經(jīng)成為不可或缺的一部分,本文將深入探討如何使用Python進(jìn)行接口自動(dòng)化測(cè)試,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Matplotlab顯示OpenCV讀取到的圖像

    Matplotlab顯示OpenCV讀取到的圖像

    本文介紹了如何使用OpenCV和Matplotlib處理圖像,本文通過(guò)實(shí)例講解的非常詳細(xì),對(duì)Matplotlab?OpenCV圖像相關(guān)處理方法感興趣的朋友一起看看吧
    2025-02-02
  • Python中PDF解析利器pdfplumber的使用詳細(xì)教程

    Python中PDF解析利器pdfplumber的使用詳細(xì)教程

    pdfplumber是一個(gè)Python庫(kù),專門用于從PDF文件中提取文本、表格和其他信息,本文將為大家詳細(xì)介紹一下pdfplumber的安裝與詳細(xì)使用,有需要的小伙伴可以參考下
    2025-04-04
  • 將不規(guī)則的Python多維數(shù)組拉平到一維的方法實(shí)現(xiàn)

    將不規(guī)則的Python多維數(shù)組拉平到一維的方法實(shí)現(xiàn)

    這篇文章主要介紹了將不規(guī)則的Python多維數(shù)組拉平到一維的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • python如何以表格形式打印輸出的方法示例

    python如何以表格形式打印輸出的方法示例

    這篇文章主要介紹了python如何以表格形式打印輸出的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 詳解使用python crontab設(shè)置linux定時(shí)任務(wù)

    詳解使用python crontab設(shè)置linux定時(shí)任務(wù)

    本篇文章主要介紹了使用python crontab設(shè)置linux定時(shí)任務(wù),具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • 如何在ubuntu中切換使用不同版本的python

    如何在ubuntu中切換使用不同版本的python

    在ubuntu環(huán)境下進(jìn)行嵌入式開(kāi)發(fā),我們?cè)谶M(jìn)行不同的項(xiàng)目開(kāi)發(fā)時(shí),可能會(huì)遇到python環(huán)境不統(tǒng)一的情況,下面這篇文章主要給大家介紹了關(guān)于如何在ubuntu中切換使用不同版本的python的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

门源| 义马市| 昌乐县| 红桥区| 胶州市| 石嘴山市| 休宁县| 宁安市| 尼勒克县| 石城县| 车险| 丹凤县| 清水河县| 呼伦贝尔市| 西乌珠穆沁旗| 宜兰县| 惠安县| 广元市| 富蕴县| 河西区| 社旗县| 观塘区| 荃湾区| 南投县| 泸水县| 越西县| 四川省| 沾益县| 深圳市| 驻马店市| 嘉黎县| 县级市| 富平县| 昭通市| 阆中市| 珠海市| 拜泉县| 布尔津县| 安化县| 衢州市| 蒙山县|