本博文總結自廖雪峰老師python教程:
1.在python中,函式名其實是乙個變數,它指向了函式,所以自然的,也可以用其他變數來指向函式。例如
f=abs
後,就直接能呼叫f(-10)
進行計算了。既然函式名是變數,那麼也就可以被傳入另乙個函式了,def add(a,b,f):
,然後return f(a)+f(b)
。所謂的高階函式,就是讓函式的引數能夠接收別的函式。
2.在python裡函式也可以作為返回值。可以在乙個函式內部繼續定義函式,並返回這個函式,返回這個函式時,這個函式並沒有被執行,當呼叫外部函式時,才會被執行。 例如def lazy_sum(*args):
下再定義個def sum():
,在這個sum函式下實現累加**,最後整體返回sum函式。那麼,當呼叫時f=lazy_sum([1,2,3,4])
,f接收到的實際上是乙個函式,及sum函式,當呼叫f即f()
時,才會真正計算求和的結果。
在以上例子中,內部sum函式可以引用外部函式的區域性變數以及傳入的引數,當sum函式被返回時,相關引數和變數都儲存在被返回的函式裡,這種結構被稱為「閉包」。
3.閉包。要牢記乙個準則:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。例如:
def count():
def f(j):
def g():
return j*j
return g
fs =
for i in range(1, 4):
return fs
f1,f2,f3=count()
呼叫f1() , f2() , f3()
才能得到正確結果1,4,9。
4.匿名函式,即lambda表示式,其只能是乙個表示式,不用寫return,返回值就是該表示式的結果。匿名函式也可以賦給乙個變數,例如f=lambda x:x*x
,呼叫時直接f(5)
就行。
5.裝飾器。在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator),即在不改變原函式的情況下,給函式增加功能。
乙個完整的decorator的寫法如下:
import functools
def log(func):
@functools.wraps(func)
print('call %s():' % func.__name__)
return func(*args, **kw)
或者針對帶引數的decorator:
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return decorator
裝飾器還可參考博文
6.偏函式(partial function)。python的偏函式主要用於簡化函式操作。使用functions.partial來定義函式,它接收三個引數,分別為 函式物件、*args、**kw。例如,定義乙個字串二進位制轉換:
int2=functions.partial(int,base=2)
,然後就可以呼叫了int2('1000000`)
結果為64。
以上要注意的是,傳入引數時對於屬性定義,一定要使用命名關鍵字引數,如以上的base=2,不能直接傳入2,不然它會被歸到*args這個可變引數裡面去,這樣就會出錯。
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
Python函式式程式設計
python函式式程式設計的核心思想是 把函式當資料.所以,函式可以用作函式引數,函式返回值,元組或字典成員等 閉包閉包是實現 復用的一種途徑,與類不同的是它基於函式實現.函式與它的環境變數一起就構成了閉包,閉包只有乙個返回值,那就是閉包中的函式 def line conf a,b def line...
python函式式程式設計
一 lambda 主要用來自定義行內函式 二 map 首先定義乙個函式,再用map 命令將函式逐一應用到map列表中的每個元素,最後返回乙個陣列 例如 map lambda x,y x y,a,b 表明將a,b兩個列表的元素對應相乘,把結果返回到新列表。三 reduce 用於遞迴運算 例如 redu...