日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Python 函數(shù)式編程入門教程

 萬皇之皇 2018-02-10



引言


Functional Programming(函數(shù)式編程)的概念最早起源于LISP,由約翰·麥卡錫在1958年創(chuàng)立,最早提出了自動(dòng)垃圾回收的理念,這一理念現(xiàn)在也被Python/Java/Ruby等多種語(yǔ)言借鑒。發(fā)展到今天,LISP已經(jīng)衍生出了多種方言。相比面向?qū)ο缶幊?,函?shù)式編程的一大優(yōu)勢(shì)就是Immutable Data(數(shù)據(jù)不可變),就是不依賴于外部的數(shù)據(jù),而且也不改變外部數(shù)據(jù)的值,這種思想可以大大減少我們代碼的Bug,而且函數(shù)式編程也支持我們像使用變量一樣使用函數(shù)。Python作為面向?qū)ο笳Z(yǔ)言,也提供了對(duì)于函數(shù)式編程的支持,雖然并不是那么純粹,而且也不支持尾遞歸優(yōu)化。


lambda的使用


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


>>> def f(x):

...    return x + x

# 調(diào)用這個(gè)函數(shù)

>>> f(2)

4


這個(gè)函數(shù)如果我們用lamda改寫的話,只要一行代碼就夠了。


# lambda后面的x表示lambda函數(shù)要接收的參數(shù),x + x表示lambda函數(shù)所要返回的值

>>> f = lambda x: x + x

# 可以看到f現(xiàn)在也是一個(gè)函數(shù)對(duì)象

>>> f

function __main__.lambda>>

# 調(diào)用lambda函數(shù)

>>> f(2)

4


map的使用


map(function, iterable)接收兩個(gè)參數(shù),第一個(gè)參數(shù)代表的是接收一個(gè)函數(shù),第二個(gè)參數(shù)代表的是接收一個(gè)iteralbe類型的對(duì)象,比如list


map函數(shù)的原理是: 1.每次從iterable中取出一個(gè)參數(shù),2.將這個(gè)參數(shù)傳遞給我們的函數(shù),3.然后函數(shù)返回的值加入一個(gè)list(這種說法不準(zhǔn)確,只是為了幫助大家理解,后面我會(huì)解釋)。等所有的iterable對(duì)象遍歷完,map就把這個(gè)list返回給我們的調(diào)用者。下面我們直接通過實(shí)例來了解一下map的用法。


example1


# 還是用我們上面那個(gè)lambda的例子

>>> function = lambda x: x + x

# 定義一個(gè)iterable對(duì)象list(列表)

>>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 函數(shù)fucntion每次從iterable中取出一個(gè)參數(shù)x,然后function返回x + x的值,

# 并將返回值加入一個(gè)新建的list,等將iterable遍歷完,map就將這個(gè)新建的list返回。

>>> v = map(function, iterable)

# 注意上面的說法并不準(zhǔn)確,只是為了幫助大家理解,其實(shí)map返回的是一個(gè)map對(duì)象,并不是list

>>> v

map at 0x7fcb56231588>

# 但是我們可以調(diào)用內(nèi)建的list函數(shù)將map轉(zhuǎn)換成一個(gè)list來得到我們想要的結(jié)果

>>> list(v)

[2, 4, 6, 8, 10, 12, 14, 16, 18]


example2


對(duì)于map的第二個(gè)參數(shù),我們也可以傳遞一組函數(shù)列表進(jìn)去,也就是說列表中間包含多個(gè)函數(shù)對(duì)象。


>>> 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)也接收兩個(gè)參數(shù),第一個(gè)參數(shù)代表的是接收一個(gè)函數(shù),第二個(gè)參數(shù)代表的是接收一個(gè)iteralbe類型的對(duì)象,比如list。不過不同的地方在于reduce中的這個(gè)函數(shù)必須要接收兩個(gè)參數(shù),下面我們來通過求一個(gè)list(列表)累加和的例子來了解一下reduce的用法。


from functools import reduce

# 使用lambda定義一個(gè)函數(shù),函數(shù)的作用是接收兩個(gè)參數(shù),然后返回兩個(gè)參數(shù)之和

>>> function = lambda x, y: x+y

>>> iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 函數(shù)function每次接收兩個(gè)參數(shù),除第一次外每次從iterable中取一個(gè)元素作為一個(gè)參數(shù)

# 另外一個(gè)參數(shù)取自上一次function返回的值

>>> reduce(function,  iterable)

45


filter的使用


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


它的原理是每次從iterable對(duì)象中取出一個(gè)元素作用于我們的function,如果function返回True就保留該元素,如果返回False就刪除該元素。下面我們通過一個(gè)實(shí)例來看一下filter的用法。


# 定義一個(gè)函數(shù),如果接收的字符s為空,那么返回False,如果為非空,那么返回True

>>> function = lambda s : s and s.strip()

>>> iterable = ['AJ', ' ', 'Stussy', '', 'CLOT', 'FCB', None]

>>> filter(function, iterable)

filter at 0x7fcb562319b0>

>>> list(filter(function, iterable))

['AJ', 'Stussy', 'CLOT', 'FCB']


裝飾器


裝飾器(decorator)是一種高級(jí)Python語(yǔ)法。裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類進(jìn)行加工。合理地使用裝飾器可以減少我們的代碼量以及提高程序的可讀型,在很多Python框架中,比如Django中我們可以大量看到裝飾器的身影。


>>> def add(x, y):

...     return x + y

...

>>> def multiply(x, y):

...     return x * y

...


現(xiàn)在我們有上面兩個(gè)函數(shù),分別用來求加法和乘法,但是現(xiàn)在我們覺得功能不夠,想在返回結(jié)果前添加一些輸出語(yǔ)句,一般來說我們要重構(gòu)兩個(gè)函數(shù),就向下面這樣。


>>> def add(x, y):

...     print('input:', x, y)

...     return x + y

...

>>> def multiply(x, y):

...     print('input:', x, y)

...     return x * y

...


如果使用裝飾器我們可以像下面這樣做,雖然現(xiàn)在我們這種情形看起來使用裝飾器并沒有什么優(yōu)勢(shì),但是如果我們要添加的不止一條打印功能,以及除了add/multiply我們還有minus/divide等函數(shù),這個(gè)時(shí)候裝飾器的威力就體現(xiàn)出來了,我們只用修改一處代碼即可,這樣不僅提高了程序的可讀性而且也為以后我們重構(gòu)代碼省去了很多的工作量。


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



來源:ZiWenXie 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多