2018-10-18
閱讀量:
972
在遍歷列表的同時(shí)又在修改這個(gè)列表?
下面這個(gè)例子中的代碼應(yīng)該比較明顯了:
odd = lambda x : bool(x % 2)
numbers = [n for n in range(10)]
for i in range(len(numbers)):
... if odd(numbers[i]):
... del numbers[i]
# 這不對(duì)的:在遍歷列表時(shí)刪掉列表的元素。
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: list index out of range
遍歷一個(gè)列表或者數(shù)組的同時(shí)又刪除里面的元素,對(duì)任何有經(jīng)驗(yàn)的軟件開發(fā)人員來說這是個(gè)很明顯的錯(cuò)誤。但是像上面的例子那樣明顯的錯(cuò)誤,即使有經(jīng)驗(yàn)的程序員也可能不經(jīng)意間在更加復(fù)雜的程序中不小心犯錯(cuò)。
所幸,Python集成了一些優(yōu)雅的編程范式,如果使用得當(dāng),可以寫出相當(dāng)簡化和精簡的代碼。一個(gè)附加的好處是更簡單的代碼更不容易遇到這種“不小心在遍歷列表時(shí)刪掉列表元素”的bug。例如列表推導(dǎo)式(list comprehensions)就提供了這樣的范式。再者,列表推導(dǎo)式在避免這樣的問題上特別有用,接下來這個(gè)對(duì)上面的代碼的重新實(shí)現(xiàn)就相當(dāng)完美:
odd =
lambda
x : bool(x %
2)
numbers =
[n for
n in
range(10)]
numbers[:] =
[n for
n in
numbers if
not
odd(n)]
# 啊,這多優(yōu)美
numbers
[0, 2, 4, 6, 8]






評(píng)論(0)


暫無數(shù)據(jù)
CDA考試動(dòng)態(tài)
CDA報(bào)考指南
推薦帖子
0條評(píng)論
0條評(píng)論
0條評(píng)論