#1.函式式程式設計:
例如:乙個整數列表,要求按照列表中元素的絕對值大小公升序排列
>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]
排序函式sorted支援接收乙個函式作為引數,該引數作為 sorted的排序依據,這裡按照列表元素的絕對值進行排序。
當然,我也可以用普通函式來實現:
>>> def foo(x):
... return abs(x)
...>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]
只不過是這種方式**看起來不夠 pythonic 而已。
lambda:這是python支援一種有趣的語法,它允許你快速定義單行的最小函式,可以用在任何需要函式的地方:
>>> add = lambda x,y : x+y
>>> add(5,6)
>>> (lambda x,y:x+y)(5,6)
#2.python中最常見的filter篩選、map小刷子、reduce合併,都可以用lambda表示式來生成!
對於序列來講,有三個函式式程式設計工具: filter()、map()和reduce()。
map(function,sequence):把sequence中的值當引數逐個傳給function,返回乙個包含函式執行結果的list。如果function有兩個引數,即map(function,sequence1,sequence2)。
#求1~20的平方
>>> list(map(lambda x:x*x,range(1,21))) #python2.x使用map(lambda x:x*x,range(1,21))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]
filter(function,sequence):對sequence中的item依次執行function(item),將執行結果為true的item組成乙個list/string/tuple(取決於sequence的型別)返回。
#求1~20之間的偶數
>>> list(filter(lambda x:x%2 == 0,range(1,21))) #python2.x使用filter(lambda x:x%2 == 0,range(1,21))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
reduce(function,sequence):function接收的引數個數只能為2,先把sequence中第乙個值和第二個值當引數傳給function,再把function的返回值和第三個值當引數傳給function,然後只返回乙個結果。
#求1~100之和
>>> from functools import reduce #python3.x之後需要匯入reduce模組
>>> reduce(lambda x,y:x+y,range(1,101))
#求1~100之和,再加上10000
>>> reduce(lambda x,y:x+y,range(1,101),10000)
#3.閉包
閉包:乙個定義在函式內部的函式,閉包使得變數即使脫離了該函式的作用域範圍也依然能被訪問到。
來看乙個用lambda函式作為閉包的例子。
>>> def add(n):
... return lambda x:x+n
...>>> add2 = add(5)
>>> add2(15)
這裡的lambda函式就是乙個閉包,在全域性作用域範圍中,add2(15)可以正常執行且返回值為20。之所以返回20是因為在add區域性作用域中,變數n的值在閉包的作用使得它在全域性作用域也可以被訪問到。
深入理解Lambda函式及其用法
lambda函式又稱匿名函式,匿名函式就是沒有名字的函式,函式沒有名字也行?當然可以啦。有些函式如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。先來看個簡單lambda函式 lambda x,y x y lambda at 0x102bc1c80 x和y是函式的兩個引數,冒...
深入理解lambda
lambda 表示式 lambda expression 是乙個匿名函式,lambda表示式基於數學中的 演算得名,直接對應於其中的lambda抽象 lambda abstraction 是乙個匿名函式,即沒有函式名的函式。語法lambda 函式的語法只包含乙個語句,如下 lambda arg1 a...
深入理解Lambda
lambda是乙個表示式,也可以說它是乙個匿名函式。然而在使用它或是閱讀lambda 的時候,卻顯得並不那麼容易。因為它匿名,因為它刪減了一些必要的說明資訊 比如方法名 下面就來說說lambda是如何進行轉換和工作的吧。變數作用域說明 lambda評價 reflambda arg1 arg2,arg...