Python3中用for迴圈刪除列表中元素的坑

2021-08-19 16:40:01 字數 1917 閱讀 5796

"""

定義乙個學生類,例項屬性有name(姓名),age(年齡),提示使用者分別輸入3個學生資訊(姓名以及年齡),

根據使用者輸入的資訊建立3個學生物件,將這3個學生物件存入列表,

遍歷列表刪除年齡小於18歲的學生物件,最後輸出列表中剩餘的學生資訊

"""class student(object):

def __init__(self, name, age):

self.name = name

self.age = age

def __str__(self):

return "學生的姓名:%s, 學生的年齡:%d" % (self.name, self.age)

def main():

stu_list =

for i in range(3):

name = input("請輸入你的姓名:")

age = int(input("請輸入你的年齡:"))

#print(stu_list)

for student in stu_list:

if student.age < 18:

stu_list.remove(student)

print(student)

# for temp in stu_list:

# print(temp)

if __name__ == "__main__":

main()

console:

請輸入你的姓名:aa

請輸入你的年齡:11

請輸入你的姓名:bb

請輸入你的年齡:22

請輸入你的姓名:cc

請輸入你的年齡:33

輸出結果:

學生的姓名:aa, 學生的年齡:11

學生的姓名:cc, 學生的年齡:33

問題:小於18的aa沒有被刪除,反而大於18的bb,被刪除了

for 語句如何迴圈的呢?步驟是:

(1)先判斷物件是否為可迭代物件,不是的話直接報錯,丟擲typeerror異常,是的話,呼叫 __iter__或iter方法,返回乙個迭代器

(2)不斷地呼叫迭代器的__next__或next方法,每次按序返回迭代器中的乙個值

(3)迭代到最後,沒有更多元素了,就丟擲異常 stopiteration,這個異常 python 自己會處理,不會暴露給開發者

如果此時把**最後的for迴圈注釋去掉,列印結果如下:

學生的姓名:aa, 學生的年齡:11

學生的姓名:cc, 學生的年齡:33

第二個for迴圈遍歷

學生的姓名:bb, 學生的年齡:22

學生的姓名:cc, 學生的年齡:33

為什麼會是這樣的結果?

看如下案例:

list1 = [1,2,3,4,5,6]

for i in list1:

if i == 2:

list1.remove(i)

print(i)

print(list1)

結果:

124

56[1, 3, 4, 5, 6]

因為執行for語句時,先生成乙個迭代器,再用next方法,按序返回迭代器中的值,當列表中刪除了元素2時,元素3的索引變成了原來元素2的索引,把元素3往前推到了元素2的位置,所以next方法就沒返回值3.在python中,使用iter函式可以獲得有序聚合型別的迭代器,我個人將迭代器理解為帶有next指標的單向鍊錶,獲取到的迭代器為鍊錶的表頭,表頭內容為空,next指標指向有序聚合型別的第乙個元素。

在訪問鍊錶最後乙個元素的next指標時,python會報錯stopiteration。

詳談python3中用for迴圈刪除列表中元素的坑

for迴圈語句的物件是可迭代物件,可迭代物件需要實現 iter 或iter方法,並返回乙個迭代器,什麼是迭代器呢?迭代器只需要實現 next 或next方法。現在來驗證一下列表為什麼支援迭代 x 1,2,3 its iter x its x.iter print type its print its...

Python3 迴圈語句

python 中的迴圈語句有 for 和 while。python 迴圈語句的控制結構圖如下所示 python 中 while 語句的一般形式 while判斷條件 condition 執行語句 statements 我們可以通過設定條件表示式永遠不為 false 來實現無限迴圈 你可以使用ctrl ...

Python3迴圈結構(一)for迴圈

python3迴圈結構 在python中主要有兩種型別的迴圈結構 for迴圈和while迴圈。for迴圈一般用於有明顯邊界範圍的情況,例如,計算1 2 3 4 5 100等於幾的問題,就可以用for迴圈求解。while迴圈一般應用於迴圈次數難以確定的情況。下面分別介紹這兩種迴圈結構。for迴圈 通常...