您已經擁有了解釋更好或更現代的方式來表達這個答案,但我想準確地展示了lambda和map在更多基本特性方面所做的工作。首先,這裏是你的例子:
inverted_list = map(lambda i: (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
,range(0, (len(numbers) - 2)/3))
爲了使事情更清楚一點,我將分開的地圖參數。這相當於;所有我已經改變是計算每個參數在一個單獨的聲明映射:
func = lambda i:(int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)
lambda
僅僅是爲了表達一種表達式中的簡單功能的方式。我們可以在不改變的效果與普通函數替換它:
def func(i):
return (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = map(func, sequence)
map
是所謂的「高階函數」,即取另一個函數作爲參數的函數。通過sequence
每個項目map
將循環,調用func
與該項目作爲參數,採取任何函數返回,並將其添加到一個新的列表。*
如果你想要做同樣的事情,沒有高階函數或發電機表達式,你可以寫這個了很長的路要走:
def func(i):
return (int(numbers[2 + 3*i]),
float(numbers[3 + 3*i]),
float(numbers[4 + 3*i]))
sequence = range(0, (len(numbers) - 2)/3)
inverted_list = []
for item in sequence:
inverted_list.append(func(item))
拉姆達的好處是,你可以在一個表達的東西,否則將需要你想點之前引入臨時變量,可能在聲明函數某種方式表達使用它。 map的好處是相似的,你可以在一個表達式中寫一些否則會需要臨時變量和循環的東西。
(*)從Python 3開始,map實際上會返回一個迭代器,而不是一個列表。
因爲前2個數字不是序列的一部分。我認爲它有效地運行一個循環,從系列的第三個元素開始。我只是困惑,無論是地圖/ lambda在這裏執行任何其他操作。 – 2012-02-09 09:18:56