詳談python3中用for循環(huán)刪除列表中元素的坑
for循環(huán)語(yǔ)句的對(duì)象是可迭代對(duì)象,可迭代對(duì)象需要實(shí)現(xiàn)__iter__或iter方法,并返回一個(gè)迭代器,什么是迭代器呢?迭代器只需要實(shí)現(xiàn) __next__或next方法。
現(xiàn)在來(lái)驗(yàn)證一下列表為什么支持迭代:
x = [1,2,3] its = iter(x) # its = x.__iter__() print(type(its)) # print(its.__next__()) # print(its.__next__()) # print(its.__next__()) print(next(its)) print(next(its)) print(next(its))
結(jié)果:
<class 'list_iterator'> 1 2 3
for 語(yǔ)句如何循環(huán)的呢?步驟是:
(1)先判斷對(duì)象是否為可迭代對(duì)象,不是的話直接報(bào)錯(cuò),拋出TypeError異常,是的話,調(diào)用 __iter__或iter方法,返回一個(gè)迭代器
(2)不斷地調(diào)用迭代器的__next__或next方法,每次按序返回迭代器中的一個(gè)值
(3)迭代到最后,沒(méi)有更多元素了,就拋出異常 StopIteration,這個(gè)異常 python 自己會(huì)處理,不會(huì)暴露給開發(fā)者
list1 = [1,2,3,4,5,6] for i in list1: if i == 2: list1.remove(i) print(i) print(list1)
結(jié)果:
1 2 4 5 6 [1, 3, 4, 5, 6]
第二個(gè)print打印的結(jié)果顯然是刪除了元素2的列表,第一個(gè)print為什么沒(méi)有3呢?因?yàn)閳?zhí)行for語(yǔ)句時(shí),先生成一個(gè)迭代器,再用next方法,按序返回迭代器中的值,當(dāng)列表中刪除了元素2時(shí),元素3的索引變成了原來(lái)元素2的索引,把元素3往前推到了元素2的位置,所以next方法就沒(méi)返回值3.在python中,使用iter函數(shù)可以獲得有序聚合類型的迭代器,我個(gè)人將迭代器理解為帶有next指針的單向鏈表,獲取到的迭代器為鏈表的表頭,表頭內(nèi)容為空,next指針指向有序聚合類型的第一個(gè)元素。
在訪問(wèn)鏈表最后一個(gè)元素的next指針時(shí),python會(huì)報(bào)錯(cuò)StopIteration。
以上這篇詳談python3中用for循環(huán)刪除列表中元素的坑就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html
這篇文章主要介紹了python讀取json數(shù)據(jù)還原表格批量轉(zhuǎn)換成html,由于需要對(duì)ocr識(shí)別系統(tǒng)的表格識(shí)別結(jié)果做驗(yàn)證,通過(guò)返回的json文件結(jié)果對(duì)比比較麻煩,故需要將json文件里面的識(shí)別結(jié)果還原為表格做驗(yàn)證,下面詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-03-03Python基于遞歸算法求最小公倍數(shù)和最大公約數(shù)示例
這篇文章主要介紹了Python基于遞歸算法求最小公倍數(shù)和最大公約數(shù),結(jié)合實(shí)例形式分析了Python使用遞歸算法進(jìn)行數(shù)值計(jì)算的相關(guān)操作技巧,需要的朋友可以參考下2018-07-07pyinstaller打包可執(zhí)行文件,存放路徑包含中文無(wú)法運(yùn)行的解決方案
這篇文章主要介紹了pyinstaller打包可執(zhí)行文件,存放路徑包含中文無(wú)法運(yùn)行的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Python辦公自動(dòng)化處理的10大場(chǎng)景應(yīng)用示例
這篇文章主要為大家介紹了Python辦公自動(dòng)化處理的10大場(chǎng)景應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python?pandas中read_csv參數(shù)示例詳解
使用pandas做數(shù)據(jù)處理的第一步就是讀取數(shù)據(jù),數(shù)據(jù)源可以來(lái)自于各種地方,csv文件便是其中之一,下面這篇文章主要給大家介紹了關(guān)于Python?pandas中read_csv參數(shù)詳解的相關(guān)資料,需要的朋友可以參考下2023-01-01python實(shí)現(xiàn)自動(dòng)生成C++代碼的代碼生成器
這篇文章介紹了python實(shí)現(xiàn)C++代碼生成器的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07

Django restframework 源碼分析之認(rèn)證詳解