代替for迴圈的方法彙總(持續更新)
阿新 • • 發佈:2018-12-13
1. 列表解析
舉個栗子,建立一個列表:
squares = []
for value in range(1, 11):
squares.append(value**2)
可用如下程式碼代替:
squares = [value**2 for value in range(1,11)]
2. 利用map函式,操作列表中的每一個元素
map函式基本語法如下:
map(function, iterable, ...)
其中function為函式;iterable為一個或多個list;py3返回一個迭代器
舉個栗子,上面列表解析的語句就可以寫成這樣:
squares = list( map(lambda x: x ** 2, range(1,11)))
特別地,如果map函式的第一個引數為None,效果相當於zip函式:
map(None, [1,2,3], [4,5,6], [7,8,9])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
zip([1,2,3], [4,5,6], [7,8,9])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
但當序列長度不對應時,兩個函式的處理方法不同:
map(None, [1,2,3], [4,5,6], [7,8,9,10])
[(1, 4, 7), (2, 5 , 8), (3, 6, 9), (None, None, 10)]
zip([1,2,3], [4,5,6], [7,8,9,10])
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
3. 利用filter函式,過濾列表中所有元素
filter函式基本語法如下:
filter(function, iterable)
注意這裡只能有一個迭代物件
類似地,filter的返回值也為迭代器,而非list,故需要強制型別轉換
filter函式的本質為,依次判斷迭代物件中每個元素對於function是否為True
因此,function為None時,返回的是迭代物件中每個True的元素
#一個栗子
def is_odd(n):
return n % 2 == 1
newlist = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
#另一個栗子
filter(lambda x:1<x<10, [-10, 0, 1, 2, 8, 10, 11]) #lambda匿名函式
[2, 8]
4. 利用reduce函式
reduce函式的基本語法如下:
reduce(function, iterable[, initializer])
其中function為函式,有兩個引數;iterable為迭代物件;initializer為初始引數,可選。
reduce函式的本質為,將function應用於迭代物件的前兩個元素,得到的結果再與下一個元素進行function運算,以此類推
(注意,元素的前後順序即為其在function中對應的引數順序)
如果存在初始引數,則function的第一次運算中,第一個函式引數為初始引數initializer,第二個函式引數為迭代物件的第一個元素。之後的運算方式與沒有初始引數時相同。
一個求和的栗子:
reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
15