首先,lambda 函式的格式是這樣的:
1
lambda
parameters: expression
parameters是填寫函式引數的地方,而expression是填寫函式表示式的部分。
並且因為parameters是複數,所以函式的引數就可以是多個,並且支援預設引數。
而expression部分則規定了只能寫一行的表示式。
至於函式的返回值,那自然就是表示式的運算結果了。
簡而言之,lambda 函式就是乙個沒有函式名稱,且只支援一行表示式的簡易函式。
沒錯,lambda 函式就是一種語法糖,但是這種語法糖的存在讓後面的幾種例子的實現表現得不像以往那麼累贅並且醜陋了。
我們再來回顧一下,既然lambda 函式謂之函式,那麼就應該有函式所具有的特性。也就是說,它可以被賦值於乙個變數,然後使用變數來呼叫函式並實現功能。
所以下面的例子在語法上完全沒有問題。
1
2
3
>>> g
=
lambda
x: x
*
2
>>> g(
3
)
6
當然也可以不通過變數來呼叫lambda 函式
1
2
>>> (
lambda
x: x
*
x)(
3
)
9
通過以上的例子,我們可以使用lambda 函式來動態配置函式中常量。類似:
1
2
3
4
5
6
7
8
>>>
def
make_incrementor(n):
...
return
lambda
x: x
+
n
...
>>> f
=
make_incrementor(
42
)
>>> f(
0
)
42
>>> f(
1
)
43
這個例子裡首先定義了make_incrementor 函式,它接受引數n 並賦予內部的lambda 函式。
最後make_incrementor 函式返回內部被定製的lambda 函式。
在例子中變數f 被定義成定製了數字42的lambda 函式。
而呼叫f 指向的函式,並賦予引數時,就執行定製好了的lambda 函式內部的x + 42的表示式。
通過把lambda 函式賦值給變數的操作,不光可以實現定製函式,還能根據某個布林型變數動態選擇想要執行的函式,就好似乙個十分簡單的狀態機。
1
2
3
4
5
>>> condition
=
true
>>> objectstring
=
"my_email_address gmail.com"
>>> processfunc
=
condition
and
(
lambda
s:
"@"
.join(s.split()))
or
(
lambda
s: s)
>>> processfunc(objectstring)
布林型別變數condition 的值直接影響到processfunc 指向的函式。
要注意,一旦決定了processfunc 的指向,在這之後即使改變condition 的值而不再對processfunc 進行重新指向的話,processfunc 的指向時不會發生變化的。
在接近終點之前,讓我們結合functional programming 的另一代表filter 來看看lambda 函式在其中扮演的角色吧。
1
2
3
4
5
6
7
>>> alist
=
range
(
1
,
10
)
>>> alist
[
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
]
>>> low
=
3
>>> high
=
7
>>>
filter
((
lambda
x, l
=
low, h
=
high: h > x > l), alist)
[
4
,
5
,
6
]
通過filter 對alist的遍歷,把從alist中取出的每乙個值賦予x並參與到指定lambda 函式的運算中,得到新的list。
以上的例子其實可以用list comprehensions 更簡單的實現:
1
2
>>> [d
for
d
in
alist
if
7
> d >
3
]
[
4
,
5
,
6
]
類似的替代還有很多,正如許多文章中說的,lambda 函式確實是一種語法糖。
但是通過這種語法糖,有時候可以把很多需要簡單函式的地方簡化,省卻了建立函式的步驟,甚至不用費力去想函式的命名。
在另一方面, lambda 函式結合functional programming 的三大利器filter, map, reduce 對常量進行的操作確實可以實現一種新的思維方式。
以上的例子都直接取自或者修改於dive into python, python tutorial 和python quick reference。
XML XML粗淺理解
xml 作為乙個應用比較廣泛的標記語言,xml是乙個龐大的家族。絕大多數的xml檔案都是從宣告開始的。xml的宣告由版本號和字元編碼方案組成 xml在檔案結構上採用單根樹狀結構。所有的屬性都是從根開始,逐步擴充套件到葉子。在xml中,所有的內容必須在乙個單一元素的子集中,這個單一元素被稱為根元素。需...
UNITY 畫布的粗淺理解
畫布 當畫布是screen space overlay時,這個好理解,畫布可以控制如解析度,層次等。但當畫布是 world space時,這個嚴格來說就不算是乙個畫布了,螢幕空間或相機空間的畫布是先繪製到一張貼圖上,然後將貼圖帖到視口上,而世界空間畫布就不是這樣了,因為世界空間畫布中的元素需要與世界...
關於VCS hvp planner的粗淺理解
筆者剛開始接觸hvp的時候,是用verdi介面建立的,對裡面有很多概念,feature,measure,metric,attribute,annotation一知半解,尤其是metric比較難理解,後來看了user guide之後發現,如果把hvp當成乙個synopsys自定義的一種程式設計 標記 ...