1. 程式人生 > >代替for迴圈的方法彙總(持續更新)

代替for迴圈的方法彙總(持續更新)


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