這裏發生了什麼?Python lambda函數
reduce(lambda x,y: x+y, [x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0])
我瞭解x被通過所有的數字迭代從1到999,取出那些被3或5整除,但「拉姆達X,Y:X + Y」的一部分被絆倒了我。
這裏發生了什麼?Python lambda函數
reduce(lambda x,y: x+y, [x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0])
我瞭解x被通過所有的數字迭代從1到999,取出那些被3或5整除,但「拉姆達X,Y:X + Y」的一部分被絆倒了我。
這是不好的Python
sum(x for x in range(1,1000) if x % 3 == 0 or x % 5 == 0)
它只是簡單地概括所有的數字範圍1..999被3整除或5
reduce()
應用給定功能的前兩項可迭代的,然後到結果和迭代的下一個項目,等等。在本例中,函數
lambda x, y: x + y
只是簡單地添加它的操作數。
A lambda
指定一個匿名函數。語法lambda x,y: x+y
可以用英語「通過這種操作的結果將宣佈一個匿名函數取名叫x
和y
兩個參數。進行操作x+y
。這個匿名函數的返回值」可以表述爲
reduce
應用一些功能依次到提供的列表的前兩個元素,然後到該函數的結果和第三個元素,依此類推。因此,在所提供的代碼拉姆達用於通過降低以添加所提供的列表中的元素一起,其中將包含所有的3的倍數和5小於1000
說
f = lambda x, y : x + y
是幾乎相同的話說
def f(x, y):
return x + y
在
lambda
返回給定參數的
:
標誌的左邊將返回在它右邊的表達式的值的函數換句話說
。
但是對於一個函數來說是相當有限的,例如只允許一個表達式而不允許任何語句。這不是一個嚴重的問題,因爲在Python中,你可以定義一個完整的函數,即使在另一個函數的中間,也可以通過它。
你顯示的用法是非常糟糕的,因爲lambda沒有意義...... Python將允許直接計算該總和,而不是使用reduce
。
另外,順便說一下,計算的結果是一個簡單的封閉形式的解決方案,根本不需要任何迭代...(提示:從1到n的所有數字之和是n*(n+1)/2
並且從5到n的5的所有倍數的總和是5 *(從1到n/5的所有數的總和)...因此...)
閉合形式的解決方案實際上比建議。您需要添加3的所有倍數和5的所有倍數,然後再減去15的倍數,因爲它們被添加了兩次。 – 2011-06-05 16:06:19
是的,這正是公式,但對我來說似乎並不複雜...... – 6502 2011-06-05 16:57:25