标签为“functional programming”的页面如下
Post
關於Python Lambda那些可能不知道的三兩事
lambda本質和function無異
def f():
pass
type(lambda : None) # => <type 'function'>
type(f) # => <type 'function'>
lambda :None # => <function <lambda> at 0x7ffa6d343650>
f # => <function f at 0x7ffa6d349dd0>
lambda和function的型態都是function
,並沒有區分開來。
一個是語句、一個是表達式
差別在於def
是關鍵字形成的語句(statement),lambda
是表達式(expression)。他們差別在於,能出現在程式碼的不同位置。
※ Note: 表達是(expression)也是一種語句(statement)。為了簡單來看,接下來都會區分開來。
內建有多個函式可以接受函式參數
因為lambda和function本質差無異,所以不會有函式只可以接受lambda,不可以接受function。
filter(lambda parameter: expression, iterable)
filter(function, iterable) # more correct
比起使用lambda描述filter,用function更正確。reduce等也是這樣。
lambda多行的寫法
通常看到lambda
都只有一行,正常情況下也都是這樣。不過先來看看文件怎麼描述lambda的語法:
lambda_expr ::= "lambda" [parameter_list] ":" expression
lambda_expr_nocond ::= "lambda" [parameter_list] ":" expression_nocond
相當於:
def <lambda>(parameters):
return expression
Post
用Python實現Callable Class,FP更好寫
This Article has English Version, please goto here to read.
前言
最近,和朋友們在解LeetCode的題目。看著不同人寫出來的程式,也讓我對於一個題目的解法,有更寬廣的視野。
938. Range Sum of BST
URL: https://leetcode.com/problems/range-sum-of-bst/
這篇文章與這個想法,也是受到朋友寫的一個Ruby寫法的啟發。我用同樣的邏輯去寫Python,如下圖:
當然,這題目有更好更快的寫法,但這樣寫更為有趣有意思。
但是,內部隱含的block
函數,從函數型語言的設計原則來看,他是危險、骯髒的。這是因為每次他的執行,都會修改到外部變數s
的的值。(這辦法不夠 純函數 )
因此,我修改成以下方式:
如此,你還可以改寫成一行: