日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python基础(part15)--迭代

發布時間:2023/12/19 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python基础(part15)--迭代 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鄙人學習筆記
開發工具:Spyder


文章目錄

    • 迭代
        • 舉個例子1
        • 舉個例子2
        • for循環原理
      • 可迭代對象iterable
        • 舉個例子1
        • 舉個例子2
        • 舉個例子3
      • 迭代器對象iterator
        • yield關鍵字迭代原理
        • 舉個例子(我們將之前的MyRange類進行改寫)


迭代

每一次對過程的重復為一次”迭代”,而每一次迭代得到的結果,會作為下一次迭代的初始值。例如:循環獲取容器中的元素。

舉個例子1

創建一個列表:

再輸入以下代碼:


結果:

可以看出,我們得到的結果和for循環遍歷這個列表,得到的結果相同。

如果我們多寫一個iterator.__next__(),會怎樣呢?


結果:

會報錯 python警告我們,要 Stop Iteration, 停止迭代!

舉個例子2

還是創建原來的列表:

我們再利用以下方法迭代:


第39行代碼這樣寫,其實相當于在except之后寫了個異常基類:

結果:

我們發現,我們沒有用for循環,也拿到了可迭代對象(列表)內元素。以上兩個例子演示了for循環原理。

for循環原理

現在,我們對上面例子中的代碼進行解釋,進而闡述一下for循環原理

①獲取迭代器對象


我們說,可迭代對象,是具有__iter__()方法,可以返回迭代器的對象。所以以后我們評判一個對象是不是可迭代對象時,就可以看一看,這個對象有沒有__iter__()方法,如果有這個方法,則說明,這個對象是可以被迭代的。

②獲取下一個元素(迭代)


有迭代器之后,我們就可以迭代了,__next__()的過程就是在迭代的過程,有__next__()我們就可以拿到下一個元素。

③停止迭代(StopIteration錯誤)

最后,我們總結一下for循環原理:

①獲取迭代器對象
②循環迭代(調用迭代器的__next__()方法)
③捕獲StopIteration異常

  • 小問題

問:能夠被for循環的條件是什么?
答:具有__iter__()方法的對象。

  • 例子1

使用while + 迭代器,獲取元祖(“小白”, “小黃”, “大白”)中所有元素。

代碼:

t01 = ("小白", "小黃", "大白") iterator = t01.__iter__()while True:try:item = iterator.__next__()print(item)except:break

結果:

  • 例子2

不使用for循環,獲取字典{“小白”:0, “小黃”:6, “大白”:7}中的key和value.

代碼:

d01 = {"小白":0, "小黃":6, "大白":7}iterator = d01.__iter__()while True:try:key = iterator.__next__()print(key, d01[key])except:break

結果:

備注:使用迭代器迭代字典,拿到的是字典的key

可迭代對象iterable

  • 定義

具有__iter__()函數的對象,可以返回迭代器對象.

  • 語法

創建可迭代對象:

class 可迭代對象名稱:def __iter__(self):return 迭代器

使用可迭代對象:

for 變量名 in 可迭代對象:語句
  • 原理
迭代器 = 可迭代對象.__iter__()while True:try:print(迭代器.__next__())except StopIteration:break

舉個例子1

首先創建兩個類:

再創建SkillManager對象,并試著迭代此對象的成員變量skills:

得到結果:

結果得到了列表內的各個Skill對象。

但是,如果我們只迭代SkillManager對象會怎樣呢?我們看看下面這個例子。

舉個例子2

利用例子1,創建的兩個類:

再創建SkillManager對象,并試著迭代此對象:

運行:

報錯!且python提示我們SkillManager對象是個不可迭代的對象。

接下來,我們就要讓SkillManager可迭代!

我們先要在SkillManager類里增加一個__iter__()方法,使他變為可迭代對象。 這個__iter__()被調用后,應該返回一個迭代器類對象SkillIterator。這個迭代器類對象里應該有一個__next__()方法,用于返回下一個元素。在__next__()方法里應該拋出一個索引越界異常,當被迭代對象全部迭代完后,再獲取下一個元素,則會拋出異常。具體情況,我們看看下面的代碼。

現在我們看一下SkillManager類:

再看一下SkillIterator類:

創建對象,并開始利用for循環原理,進行迭代:


我們再運行一下,看一下運行結果:

不錯!可迭代對象內元素全部拿到了。

備注1:由上面的過程我們也可以看出,可迭代對象不會直接return它的元素,而是由迭代器return了可迭代對象內的元素。

備注2:若我們用for循環,則它也會先獲取迭代器對象,獲取完迭代器對象后,再用迭代器對象不斷的調用__next__()方法,直到迭代器對象拋出異常,for再進行異常處理。

舉個例子3

參照下例代碼,定義MyRange類,實現相同效果:


代碼:

class MyRangeIterator:def __init__(self, stop):self.stop = stopself.start = 0def __next__(self):if self.start + 1 > self.stop:raise StopIteration()temp = self.startself.start += 1return tempclass MyRange:def __init__(self, stop):self.stop = stopdef __iter__(self):# 創建迭代器對象return MyRangeIterator(self.stop)iterator = MyRange(5) for item in iterator:print(item)

結果:

備注:誰要被for,誰要就有__iter__()方法,這個方法可以獲取迭代器,迭代器內部具體怎么寫?看需求!迭代器中有__next__(),可以返回下一個元素。

迭代器對象iterator

  • 定義

可以調用__next__()函數,并返回下一個值得對象。

  • 語法
class 迭代器類名::def __init__(self, 聚合對象):self.聚合對象 = 聚合對象def __next__(self):if 沒有元素:raise StopIterationreturn 聚合對象內元素
  • 說明

聚合對象通常是容器對象。

  • 作用

使用者只通過一種方式(for循環),便可以簡潔明了獲取聚合對象中的各個元素,而又無需了解可迭代對象的內部存儲結構。

==備注!==若我們在__iter__()方法內不返回自己創建的迭代器對象,而用yield關鍵字自動生成迭代器對象,會怎樣呢?

請看以下案例

代碼:


結果:

執行過程:

①客戶端調用__iter__()方法,__iter__()方法不執行, 進入while循環.
②客戶端調用__next__()方法,__iter__()方法執行,先執行print("準備返回第一個元素"), 執行到yield語句, 將yield后的數據作為__next__()方法的返回值return給item, 并且暫時離開__iter__()方法, 繼續執行while循環中的print(item).
③當再次調用__next__()方法時,從上次離開的代碼開始執行,再運行到下一個yield語句,return數據之后,并再次暫時離開.
④待執行完__iter__()方法體,若再次調用__next__()方法,會自動拋出StopIteration異常.

yield關鍵字迭代原理

  • 原理

如果方法體中包含yield關鍵字,那么會自動生成迭代器對象.

生成迭代器代碼的大致規則:
①將yield關鍵字前的代碼,放到__next__()方法中.
②將yield關鍵字后的數據,作為__next__()方法的返回值.

舉個例子(我們將之前的MyRange類進行改寫)

代碼:

結果:

若我們不定義類,而只定義包含yield的方法,來滿足我們迭代的需求,該怎么做呢?

代碼:

結果:

我們說這項技術,就叫做生成器generator函數.

總結

以上是生活随笔為你收集整理的python基础(part15)--迭代的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲另类av | 亚洲最大视频网站 | 亚洲情区| 国产精品毛片一区视频播 | 午夜性生活片 | 久久伊人一区 | 九九久久国产 | 精品在线视频一区二区三区 | 色播五月激情 | 日皮在线观看 | 久久久久中文字幕 | 在线播放国产精品 | 亚洲激情文学 | 制服丝袜亚洲色图 | 日本三级理论片 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 亚色综合| 中文资源在线播放 | 巨乳美女被爆操 | 尹人成人网 | 涩涩爱影院 | 殴美黄色大片 | 狠狠人妻久久久久久 | 深夜在线网站 | 日韩av看片 | 亚洲天堂影院 | 爆乳2把你榨干哦ova在线观看 | 美女的诞生免费观看在线高清 | 国产美女自慰在线观看 | 男女啪啪免费 | 色狠狠av| 国产精彩视频在线 | 亚洲熟女乱综合一区二区三区 | 成人在线午夜 | 中国精品久久 | 日韩精品亚洲一区 | 冲田杏梨 在线 | a极毛片 | 国产在线欧美在线 | 蜜桃免费在线视频 | 亚洲第一看片 | 熟睡人妻被讨厌的公侵犯 | 欧美一区二区三区久久 | 一级黄色免费大片 | 黄色aaa | 国产主播第一页 | www国产精品内射老熟女 | 99国产精品人妻噜啊噜 | 东南亚毛片 | 十大污网站 | 日韩在线观看免费高清 | 欧美久久久久久久久久久久 | 老头巨大又粗又长xxxxx | 色窝窝综合色窝窝久久 | 求欧美精品网址 | 天堂网站 | 天天人人 | x88av在线| 国产精品久久久久久妇女 | 黄色美女av | 亚洲国产三区 | 日出白浆视频 | 日韩第1页 | 极品人妻一区二区三区 | 日韩一区二区三区高清 | 亚洲图区综合 | 欧美浓毛大泬视频 | 婷婷开心激情网 | 香蕉视频在线视频 | 精品不卡一区二区 | 人人妻人人澡人人爽人人欧美一区 | 99久久久无码国产精品性色戒 | 日韩深夜在线 | 青久草视频 | 自拍亚洲综合 | 日韩免费不卡视频 | 嫩模被强到高潮呻吟不断 | 97在线免费 | 欧美高潮视频 | 激情小说五月天 | 国内老熟妇对白hdxxxx | 色资源在线 | 香蕉视频黄色在线观看 | 色91精品久久久久久久久 | 偷偷操视频| 国产二区视频 | 国产日韩欧美专区 | 99视频在线观看免费 | 精品福利片 | 欧美偷拍一区二区三区 | av av在线 | 成人国产在线视频 | 国产精品婷婷午夜在线观看 | 日韩av无码一区二区三区不卡 | 亚洲第一色网站 | 91久久久久久久久久久久久 | 成年人性视频 | 美女av网站| 色www国产亚洲阿娇 自拍一区在线 |