日韩性视频-久久久蜜桃-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)--迭代的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 中文字幕有码在线观看 | 色爽视频 | 操你啦在线视频 | 日韩欧美亚洲一区二区 | 美女扒开尿口给男人看 | 老司机在线免费视频 | 一本在线 | 美女的诞生免费观看在线高清 | 国产黄色自拍视频 | 亚洲性在线 | 热播之家 | 日韩二三区| 成人在线免费视频播放 | 国产日韩欧美在线播放 | 久青草视频在线观看 | 国产美女精品视频国产 | 国产美女精品在线 | 右手影院亚洲欧美 | 国产人妻久久精品一区二区三区 | 在线观看黄色片网站 | 黄色资源网 | 亚洲欧美日韩在线 | 后入内射无码人妻一区 | 亚洲一区视频在线 | 人日人视频 | 国产丝袜网站 | 成年人国产视频 | 一级在线免费观看 | 欧美午夜精品久久久久久孕妇 | 日少妇视频 | 国产东北真实交换多p免视频 | 日韩精品电影一区 | 三度诱惑免费版电影在线观看 | 亚洲图片二区 | 在线观看日韩一区二区 | 国产精品久久久久久亚洲伦 | 午夜av在线播放 | 亚洲无人区码一码二码三码的含义 | 国产视频在线免费观看 | 婷婷激情五月综合 | 久久久久久国产精品三区 | 久久99精品波多结衣一区 | 午夜小福利 | 88av在线播放 | 成年人国产视频 | 久久人人爽人人人人片 | 艹久久 | 国产欧美日韩中文字幕 | 亚洲免费观看在线 | www.国产一区二区 | 欧美国产视频 | 精品人妻一区二区三区四区不卡 | 国产一区二区在线视频观看 | 中文一区视频 | 香蕉视频在线观看www | 四季av一区二区夜夜嗨 | 国产精品久久久久久久av福利 | 亚洲自拍偷拍一区二区 | 亚洲综合网址 | 成熟了的熟妇毛茸茸 | 五月天国产精品 | 国产午夜精品在线观看 | 男人天堂一区 | 国产成人精品一区二区三区四区 | 免费观看在线播放 | 狠狠干2017| 国产三级aaa | 美女扒开屁股让男人桶 | 教练含着她的乳奶揉搓揉捏动态图 | 中国大陆毛片 | 精品久久久视频 | 国产一区二区三区黄 | 国产午夜精品在线观看 | 性生活毛片 | 欧洲亚洲国产精品 | 最新的黄色网址 | 国产精品国产三级国产专播精品人 | 艳母日本动漫在线观看 | 久久99精品国产麻豆91樱花 | 99国产精品白浆在线观看免费 | 91一二区 | 色网在线视频 | 国产乱强伦一区二区三区 | www.日本色 | 福利社区一区二区 | 麻豆影片| 国产黄色激情视频 | 婷婷视频在线观看 | 国产男人搡女人免费视频 | 大地资源中文第三页 | 在线视频中文字幕 | 国产日韩一区二区三区 | 一本久久久久 | 天天国产视频 | 激情久久婷婷 | 激情五月色综合国产精品 | 激情网站免费 | 男生女生操操操 | 一级黄色大全 |