首頁 >後端開發 >Python教學 >Python 函數式程式設計入門教程

Python 函數式程式設計入門教程

黄舟
黄舟原創
2017-02-04 16:42:271568瀏覽

引言

Functional Programming(函數式程式設計)的概念最早起源於LISP,由約翰·麥卡錫在1958年創立,最早提出了自動垃圾回收的理念,這一理念現在也被Python/Java/Ruby等多種語言借鑒。發展到今天,LISP已經衍生了多種方言。比起物件導向編程,函數式程式設計的一大優勢就是Immutable Data(數據不可變),就是不依賴外部的數據,而且也不改變外部數據的值,這種想法可以大大減少我們程式碼的Bug,而且函數式程式設計也支持我們像使用變數一樣使用函數。 Python作為物件導向語言,也提供了對於函數式程式設計的支持,雖然不是那麼純粹,也不支援尾遞歸最佳化。

lambda的使用

lambda即匿名函數,合理地使用lambda不僅可以減少我們的代碼量,而且也可以更好地描繪代碼邏輯,比如現在我們有下面這樣一個函數。

>>> def f(x):
...    return x + x
# 
调用这个函数
>>> f(2)
4

這個函數如果我們用lamda改寫的話,只要一行程式碼就夠了。

# 
lambda后面的x表示lambda函数要接收的参数,x + x表示lambda函数所要返回的值
>>> f = lambda x: x + x
# 
可以看到f现在也是一个函数对象
>>> f
<function __main__.<lambda>>
# 
调用lambda函数
>>> f(2)
4

map的使用

map(function, iterable)接收兩個參數,第一個參數代表的是接收一個函數,第二個參數代表的是接收一個iteralbe類型的對象,例如list。

map函數的原理是: 1.每次從iterable中取出一個參數,2.將這個參數傳遞給我們的函數,3.然後函數返回的值加入一個list(這種說法不准確,只是為了幫助大家理解,後面我會解釋) 。等所有的iterable物件遍歷完,map就把這個list回傳給我們的呼叫者。下面我們直接透過實例來了解map的用法。

example1

# 
还是用我们上面那个lambda的例子
>>> function = lambda x: x + x
# 
定义一个iterable对象list(列表)
>>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 
函数fucntion每次从iterable中取出一个参数x,然后function返回x + x的值,
# 
并将返回值加入一个新建的list,等将iterable遍历完,map就将这个新建的list返回。
>>> v = map(function, iterable)
# 
注意上面的说法并不准确,只是为了帮助大家理解,其实map返回的是一个map对象,并不是list
>>> v
<map at 0x7fcb56231588>
# 
但是我们可以调用内建的list函数将map转换成一个list来得到我们想要的结果
>>> list(v)
[2, 4, 6, 8, 10, 12, 14, 16, 18]

example2

對於map的第二個參數,我們也可以傳遞一組函數列表進去,也就是說列表中間包含多個函數物件。

>>> multiply = lambda x: x * x
>>> add = lambda x: x + x
>>> funcs = [multiply, add]
>>> list(map(lambda f: f(1), funcs))
[1, 2]

reduce的使用

與map一樣,reduce(function, iterable)也接收兩個參數,第一個參數代表的是接收一個函數,第二個參數代表的是接收一個iteralbe類型的對象,例如list。不過不同的地方在於reduce中的這個函數必須要接收兩個參數,下面我們來透過求一個list(列表)累積和的例子來了解一下reduce的用法。

from functools import reduce
# 
使用lambda定义一个函数,函数的作用是接收两个参数,然后返回两个参数之和
>>> function = lambda x, y: x+y
>>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 
函数function每次接收两个参数,除第一次外每次从iterable中取一个元素作为一个参数
# 
另外一个参数取自上一次function返回的值
>>> reduce(function,  iterable)
45

filter的使用

和map/reduce類似,filter(function, iterable)一次也接收兩個參數,一個參數是函數,另一個參數是iterable對象,從名字也可以看出,filter用來過濾iterble對象,比如說list(列表)。

它的原理是每次從iterable物件中取出一個元素作用於我們的function,如果function回傳True就保留該元素,如果回傳False就刪除該元素。下面我們透過一個實例來看一下filter的用法。

# 
定义一个函数,如果接收的字符s为空,那么返回False,如果为非空,那么返回True
>>> function = lambda s : s and s.strip()
>>> iterable = [&#39;AJ&#39;, &#39; &#39;, &#39;Stussy&#39;, &#39;&#39;, &#39;CLOT&#39;, &#39;FCB&#39;, None]
>>> filter(function, iterable)
<filter at 0x7fcb562319b0>
>>> list(filter(function, iterable))
[&#39;AJ&#39;, &#39;Stussy&#39;, &#39;CLOT&#39;, &#39;FCB&#39;]

裝飾器

裝飾器(decorator)是一種高級Python語法。裝飾器可以對一個函數、方法或類別進行加工。合理地使用裝飾器可以減少我們的程式碼量以及提高程式的可讀型,在許多Python框架中,例如Django中我們可以大量看到裝飾器的身影。

>>> def add(x, y):
...     return x + y
... 
>>> def multiply(x, y):
...     return x * y
...

現在我們有上面兩個函數,分別用來求加法和乘法,但是現在我們覺得功能不夠,想在返回結果前添加一些輸出語句,一般來說我們要重構兩個函數,就向下面這樣。

>>> def add(x, y):
...     print("input:", x, y)
...     return x + y
... 
>>> def multiply(x, y):
...     print("input:", x, y)
...     return x * y
...

如果使用裝飾器我們可以像下面這樣做,雖然現在我們這種情形看起來使用裝飾器並沒有什麼優勢,但是如果我們要添加的不止一條打印功能,以及除了add/multiply我們還有minus /divide等函數,這個時候裝飾器的威力就體現出來了,我們只用修改一處程式碼即可,這樣不僅提高了程式的可讀性而且也為以後我們重構程式碼省去了很多的工作量。

def decorator(F):
    def new_function(x, y):
        print("input:", x, y)
        return F(x, y)
    return new_function
@decorator
def add(x, y):
    return x + y
@decorator
def multiply(x, y):
    return x * y

以上就是Python 函數式程式設計入門教學 的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn