1. 程式人生 > >從列表和實例來了解python叠代器

從列表和實例來了解python叠代器

name color font spl 第一次 () 圖片 IT 實現

什麽是叠代器?它是一個帶狀態的對象,在你調用next()方法的時候返回容器中的下一個值,任何實現了__iter____next__()(python2中實現next())方法的對象都是叠代器,__iter__返回叠代器自身,__next__返回容器中的下一個值,如果容器中沒有更多元素了,則拋出StopIteration異常。

可叠代對象實現了__iter__方法,該方法返回一個叠代器對象

技術分享圖片

例1:

技術分享圖片

例2:

已知列表namelist = [‘王源‘,‘賈玲‘,‘沈騰‘,‘歐陽娜娜‘,‘鄧超‘,‘陳赫‘,‘鹿晗‘,‘鄭凱‘,‘王祖藍‘,‘Angelababy‘,‘李晨‘],刪除列表removelist = [‘王源‘,‘賈玲‘,‘沈騰‘,‘歐陽娜娜‘,

‘宋小寶‘],要求將removelist列表中的每個元素從namelist中移除(屬於removelist,但不屬於namelist的忽略即可)

錯誤解答

#!/usr/bin/env python
namelist = [‘王源‘,‘賈玲‘,‘沈騰‘,‘歐陽娜娜‘,‘鄧超‘,‘陳赫‘,‘鹿晗‘,‘鄭凱‘,‘王祖藍‘,‘Angelababy‘,‘李晨‘]
removelist = [‘王源‘,‘賈玲‘,‘沈騰‘,‘歐陽娜娜‘,‘宋小寶‘]

for name in namelist:
    if name in removelist:
        namelist.remove(name)
print(namelist)

執行結果:

技術分享圖片

以上並不是我們想要的結果,編輯代碼,測試查看代碼執行過程:

#!/usr/bin/env python
namelist = [‘王源‘,‘賈玲‘,‘沈騰‘,‘歐陽娜娜‘,‘鄧超‘,‘陳赫‘,‘鹿晗‘,‘鄭凱‘,‘王祖藍‘,‘Angelababy‘,‘李晨‘]
removelist = [‘王源‘,‘賈玲‘,‘沈騰‘,‘歐陽娜娜‘,‘宋小寶‘]

for name in namelist:
    print(name)
    if name in removelist:
        print(name)
        namelist.remove(name)
        print(namelist)

執行結果:

技術分享圖片

從以上執行過程我們看到,for序列循環只匹配到了’王源‘、’沈騰‘,這個是為什麽呢。

其實上述結果是由於序列namelist是可叠代對象,執行for循環是按列表順序依次匹配。題中列表第一個元素’王源‘第一次就匹配,然後執行代碼塊remove操作,從原列表namelist刪除元素’王源‘。

註:此時列表更新為

[‘賈玲‘, ‘沈騰‘, ‘歐陽娜娜‘, ‘鄧超‘, ‘陳赫‘, ‘鹿晗‘, ‘鄭凱‘, ‘王祖藍‘, ‘Angelababy‘, ‘李晨‘] ,此時進入第二次for循環,執行__next__返回的是列表中的下一個值‘沈騰‘,列表首個元素‘賈玲‘被忽略了。如此循環直到容器中沒有更多元素,則Stop,不會再循環。

正確解答:

技術分享圖片
1 #!/usr/bin/env python
2 namelist = [王源,賈玲,沈騰,歐陽娜娜,鄧超,陳赫,鹿晗,鄭凱,王祖藍,Angelababy,李晨]
3 removelist = [王源,賈玲,沈騰,歐陽娜娜,宋小寶]
4 
5 for name in removelist:
6     print(name)
7     if name in namelist:
8         namelist.remove(name)
9 print(namelist)
View Code

執行結果:

技術分享圖片

從列表和實例來了解python叠代器