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

Python中的迭代器你了解嗎

 更新時(shí)間:2023年05月24日 09:54:13   作者:答案永恒  
迭代器是一種特殊的對象,它實(shí)現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個訪問元素,本文就來帶大家深入了解一下Python中迭代器的使用,需要的可以參考下

for loop和迭代器

在Python中,for循環(huán)是一種常用的迭代結(jié)構(gòu),用于遍歷可迭代對象中的元素。迭代器是一種特殊的對象,它實(shí)現(xiàn)了迭代協(xié)議,允許按照一定的順序逐個訪問元素。

for循環(huán)和迭代器之間存在密切的關(guān)系,實(shí)際上,for循環(huán)是基于迭代器工作的。當(dāng)使用for循環(huán)遍歷可迭代對象時(shí),Python會在內(nèi)部自動創(chuàng)建一個迭代器對象,并使用該迭代器來逐個獲取元素,直到所有元素都被訪問完畢。

for loop里面in后面那個東西必須是一個iterable, 也就是必須是一個可迭代對象。

下面是一個示例,演示了for循環(huán)和迭代器之間的關(guān)系:

fruits?=?['apple',?'banana',?'orange']

#?使用for循環(huán)遍歷列表元素
for?fruit?in?fruits:
????print(fruit)

#?上述代碼等價(jià)于下面的迭代器方式
iterator?=?iter(fruits)??#?創(chuàng)建迭代器對象
while?True:
????try:
????????fruit?=?next(iterator)??#?獲取下一個元素
????????print(fruit)
????except?StopIteration:
????????break

在上面的示例中,我們首先使用for循環(huán)遍歷了列表fruits中的元素,打印出每個水果的名稱。然后,我們手動創(chuàng)建了一個迭代器對象iterator,并使用next()函數(shù)逐個獲取元素,直到遇到StopIteration異常,表示所有元素都被訪問完畢。

可以看到,使用for循環(huán)可以簡化迭代過程,不需要顯式地創(chuàng)建迭代器對象和處理StopIteration異常。Python的許多內(nèi)置對象(如列表、元組、字典等)都是可迭代的,因此可以直接在for循環(huán)中使用它們。

列表

lst?=?[1,?2,?3]
for?i?in?lst:
????print(i)

字典

d?=?{"a":?1,?"b":?2}
for?i?in?d:
????print(i)

文件操作

with?open(my.txt,?"r")?as?f:
????for?i?in?f:
????????print(i)

除了內(nèi)置的可迭代對象,你還可以自定義迭代器類,實(shí)現(xiàn)自己的迭代邏輯。這樣,你就可以在for循環(huán)中使用自定義的迭代器來遍歷特定的數(shù)據(jù)結(jié)構(gòu)或?qū)崿F(xiàn)特定的迭代行為。

for loop的背后核心是迭代器可迭代對象。

迭代器和可迭代對象

https://docs.python.org/3/glossary.html

在Python中,可迭代對象和迭代器是兩個相關(guān)但不同的概念。

可迭代對象(Iterable)是指實(shí)現(xiàn)了__iter__()方法的對象,或者實(shí)現(xiàn)了__getitem__()方法且可按照順序訪問的對象。這兩者都是為了保證它可以在iter這個函數(shù)的作用下返回一個iterator。可迭代對象可以被迭代,也就是可以在for循環(huán)中使用。常見的可迭代對象包括列表、元組、字符串、字典、集合等。

迭代器(Iterator)是一種特殊的對象,它實(shí)現(xiàn)了迭代協(xié)議,具有__iter__()__next__()方法。迭代器用于逐個返回可迭代對象中的元素,每次調(diào)用__next__()方法都會返回下一個元素,如果沒有更多元素,則引發(fā)StopIteration異常。迭代器對象還可以在迭代過程中記錄迭代狀態(tài)。

每當(dāng)使用for循環(huán)來遍歷一個可迭代對象時(shí),Python會在內(nèi)部自動創(chuàng)建一個迭代器對象,并調(diào)用其__next__()方法來逐個獲取元素。因此,可以說for循環(huán)是基于迭代器工作的。

下面是一個示例,演示了可迭代對象和迭代器的概念:

fruits?=?['apple',?'banana',?'orange']

#?fruits是可迭代對象,可以在for循環(huán)中使用
for?fruit?in?fruits:
????print(fruit)

#?創(chuàng)建迭代器對象
iterator?=?iter(fruits)

#?調(diào)用迭代器的__next__()方法獲取下一個元素
print(next(iterator))??#?輸出:'apple'
print(next(iterator))??#?輸出:'banana'
print(next(iterator))??#?輸出:'orange'
print(next(iterator))??#?引發(fā)StopIteration異常

在上面的示例中,fruits是一個可迭代對象,我們可以直接在for循環(huán)中使用它來遍歷元素。同時(shí),我們也可以使用iter()函數(shù)手動將可迭代對象轉(zhuǎn)換為迭代器對象,并使用next()函數(shù)來逐個獲取元素。當(dāng)所有元素都被訪問完畢時(shí),繼續(xù)調(diào)用next()函數(shù)會引發(fā)StopIteration異常。

需要注意的是,迭代器是一種一次性的對象,即在迭代過程中,一旦迭代器返回了所有元素,它就會耗盡,無法再次使用。如果想重新遍歷可迭代對象,需要重新創(chuàng)建迭代器對象。

  • 一個iterable更像是一個數(shù)據(jù)的保存者,一個container,它是可以沒有狀態(tài)的,它可以完全不知道你這個iterator數(shù)到哪了,它需要有能力產(chǎn)生一個iterator。
  • iterator一定是有狀態(tài)的,但是它并不需要實(shí)現(xiàn)一個container,它當(dāng)然內(nèi)部肯定知道它代表這個iterable里面是什么數(shù)據(jù)。iterator必須要有__next__這個method。這個method保證它在被next作用的時(shí)候可以返回下一個iterable。

自定義一個可迭代對象和對應(yīng)的迭代器-鏈表

#!?-*-conding=:?UTF-8?-*-
#?2023/5/22?18:43

class?NodeIter:
????def?__init__(self,?node):
????????self.curr_node?=?node

????def?__next__(self):
????????if?self.curr_node?is?None:
????????????raise?StopIteration
????????node,?self.curr_node?=?self.curr_node,?self.curr_node.next

????????return?node


class?Node:
????def?__init__(self,?name):
????????self.name?=?name
????????self.next?=?None

????def?__iter__(self):
????????return?NodeIter(self)


node1?=?Node("node1")
node2?=?Node("node2")
node3?=?Node("node3")

node1.next?=?node2
node2.next?=?node3


if?__name__?==?'__main__':
????for?node?in?node1:
????????print(node.name)

如果我們想在for loop里面使用鏈表的話,那我們就要自己把鏈表變成一個iterable。

這段代碼演示了如何自定義一個可迭代對象和對應(yīng)的迭代器。

首先,我們定義了一個Node類,表示一個節(jié)點(diǎn),每個節(jié)點(diǎn)具有一個名稱和一個指向下一個節(jié)點(diǎn)的引用。Node類實(shí)現(xiàn)了__iter__()方法,該方法返回一個迭代器對象。

然后,我們定義了一個NodeIter類作為迭代器,它接收一個節(jié)點(diǎn)對象作為參數(shù),并在__init__()方法中初始化當(dāng)前節(jié)點(diǎn)。NodeIter類實(shí)現(xiàn)了__next__()方法,用于返回下一個節(jié)點(diǎn)。在每次調(diào)用__next__()方法時(shí),它會將當(dāng)前節(jié)點(diǎn)作為結(jié)果返回,并將當(dāng)前節(jié)點(diǎn)更新為下一個節(jié)點(diǎn)。當(dāng)沒有更多節(jié)點(diǎn)時(shí),拋出StopIteration異常。

最后,在if __name__ == '__main__':條件下,我們使用自定義的可迭代對象和迭代器進(jìn)行遍歷。通過for node in node1:的語法,會自動調(diào)用node1對象的__iter__()方法獲取迭代器,并通過迭代器逐個獲取節(jié)點(diǎn),并打印節(jié)點(diǎn)的名稱。

運(yùn)行以上代碼,輸出結(jié)果為:

node1
node2
node3

這個示例展示了如何自定義可迭代對象和迭代器,并在for循環(huán)中使用它們實(shí)現(xiàn)自定義的迭代邏輯。

到此這篇關(guān)于Python中的迭代器你了解嗎的文章就介紹到這了,更多相關(guān)Python迭代器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python制作釘釘加密/解密工具

    Python制作釘釘加密/解密工具

    本文給大家介紹的是使用Python實(shí)現(xiàn)釘釘?shù)募用芙饷芄ぞ叩暮诵拇a,非常的實(shí)用,對于大家學(xué)習(xí)Python加密解密非常有幫助,希望大家能夠喜歡
    2016-12-12
  • python視頻轉(zhuǎn)化字節(jié)問題的完整實(shí)現(xiàn)

    python視頻轉(zhuǎn)化字節(jié)問題的完整實(shí)現(xiàn)

    在Python中可以將視頻和字節(jié)進(jìn)行轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于python視頻轉(zhuǎn)化字節(jié)問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析

    Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析

    這篇文章主要介紹了Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 在Django中創(chuàng)建動態(tài)視圖的教程

    在Django中創(chuàng)建動態(tài)視圖的教程

    這篇文章主要介紹了在Django中創(chuàng)建動態(tài)視圖的教程,Django是Python重多人氣框架中最為著名的一個,需要的朋友可以參考下
    2015-07-07
  • Python日期操作學(xué)習(xí)筆記

    Python日期操作學(xué)習(xí)筆記

    字符串是使用靜態(tài)的方式進(jìn)行存儲,只能讀而不能直接修改字符內(nèi)容。特別將一堆對字符串并在一起的時(shí)候,雖然可以直接相加,聽說這樣的速度奇慢,只有用其它函數(shù)的方式進(jìn)行,好在也不太麻煩。
    2008-10-10
  • Django 設(shè)置admin后臺表和App(應(yīng)用)為中文名的操作方法

    Django 設(shè)置admin后臺表和App(應(yīng)用)為中文名的操作方法

    這篇文章主要介紹了Django 設(shè)置admin后臺表和App(應(yīng)用)為中文名的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python實(shí)現(xiàn)MQTT通信的示例代碼

    Python實(shí)現(xiàn)MQTT通信的示例代碼

    本文主要介紹了Python實(shí)現(xiàn)MQTT通信的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • 如何用python寫個模板引擎

    如何用python寫個模板引擎

    這篇文章主要介紹了如何用python寫個模板引擎,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • Python基礎(chǔ)練習(xí)之用戶登錄實(shí)現(xiàn)代碼分享

    Python基礎(chǔ)練習(xí)之用戶登錄實(shí)現(xiàn)代碼分享

    這篇文章主要介紹了Python基礎(chǔ)練習(xí)之用戶登錄實(shí)現(xiàn)代碼分享,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • Python tkinter進(jìn)度條控件(Progressbar)的使用

    Python tkinter進(jìn)度條控件(Progressbar)的使用

    這篇文章主要介紹了Python tkinter進(jìn)度條控件(Progressbar)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

扶绥县| 石嘴山市| 宁南县| 东海县| 沽源县| 东乌珠穆沁旗| 东方市| 扎囊县| 贞丰县| 旌德县| 宝应县| 克山县| 无锡市| 岳池县| 襄樊市| 阳山县| 应城市| 灵山县| 咸宁市| 南皮县| 柯坪县| 安化县| 仙桃市| 介休市| 霍林郭勒市| 新泰市| 无锡市| 曲水县| 抚远县| 安溪县| 宜良县| 武义县| 恩平市| 桂东县| 镇康县| 原阳县| 青浦区| 济阳县| 广宁县| 通化县| 南溪县|