日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

白话 Python 的函数式编程

發(fā)布時(shí)間:2025/3/20 python 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 白话 Python 的函数式编程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天和大家聊聊 Python 的函數(shù)式編程特性。所謂函數(shù)式編程,就是指代碼中每一塊都是不可變的(immutable),都是由 pure function 的形式組成。這里的 pure function 是指函數(shù)本身相互獨(dú)立,互不影響,對(duì)于相同的輸入,總會(huì)有相同的輸出。也就是我們常說的沒有副作用。舉個(gè)很簡(jiǎn)單的例子,比如,對(duì)于一個(gè)列表,我想讓列表中的元素值都變?yōu)樵瓉淼膬杀?#xff0c;我們可以寫成下面的形式:

def multiply_2(l):for index in range(0, len(l)):l[index] *= 2return l

這就不是一個(gè) pure function,因?yàn)榱斜碇性氐闹当桓淖兞?#xff0c;如果我調(diào)用 multiply_2() 這個(gè)函數(shù)多次,那么每次得到的結(jié)果都不一樣。要想讓其成為一個(gè)pure function,就得寫成下面的形式,重新創(chuàng)建一個(gè)新的列表并返回。

''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' def multiply_2_pure(l):new_list = []for item in l:new_list.append(item * 2)return new_list

函數(shù)式編程的優(yōu)點(diǎn)主要在于其 pure function 和不可變的特性使得程序更加健壯,易于 debug 和測(cè)試,缺點(diǎn)主要在于限制多,難寫。當(dāng)然 Python 不同于其他一些語言,比如 Scala,他并不是一門純粹的函數(shù)式編程語言,但是 Python 也提供了一些函數(shù)式編程的特性,值得我們了解和學(xué)習(xí)。

Python 主要提供了這么幾個(gè)函數(shù) Map, Filter 和 Reduce,通常結(jié)合匿名函數(shù) lambda 一起使用,我逐一介紹一下:

對(duì)于 Map(function, iterable) 函數(shù),前面的例子提過,他表示對(duì) iterable 中的每個(gè)元素運(yùn)用 function 這個(gè)函數(shù),最后返回一個(gè)新的可遍歷的集合,比如上面對(duì)列表中每個(gè)元素乘2用map可以表示為

l = [1, 2, 3, 4, 5] new_list = map(lambda x: x * 2, l) # [2, 4, 6, 8, 10]

我們?cè)賮砜匆幌?Python 提供的函數(shù)式編程的接口的性能,就以 Map 為例,上述的例子還可以用 for 循環(huán)和 list comprehension 實(shí)現(xiàn),我們來比較一下他們的速度:

python3 -mtimeit -s’xs=range(1000000)' 'map(lambda x: x*2, xs)'輸出結(jié)果:2000000 loops, best of 5: 171 nsec per looppython3 -mtimeit -s’xs=range(1000000)' '[x * 2 for x in xs]'輸出結(jié)果:5 loops, best of 5: 62.9 msec per looppython3 -mtimeit -s’xs=range(1000000)’ 'l = []' 'for i in xs: l.append(i * 2)'輸出結(jié)果:5 loops, best of 5: 92.7 msec per loop

可以看到 map 是最快的,因?yàn)?map 函數(shù)是直接由 C 語言寫的,運(yùn)行時(shí)不需要通過 Python 解釋器間接調(diào)用,因此運(yùn)行速度最快。

對(duì)于 Filter(function, iterable) 函數(shù),和 map 函數(shù)類似,function 同樣表示一個(gè)函數(shù)對(duì)象,表示對(duì) iterable 中的每個(gè)元素使用 function 判斷,返回 True 或者 False,最后將返回 True 的元素組成一個(gè)新的可遍歷的集合,比如我要返回一個(gè)列表中的所有偶數(shù),可以寫成

''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' l = [1, 2, 3, 4, 5] new_list = filter(lambda x: x % 2 == 0, l) # [2, 4]

對(duì)于 Reduce(function, iterable) 函數(shù),通常用于對(duì)一個(gè)集合做一些累積操作。function 同樣是一個(gè)函數(shù)對(duì)象,規(guī)定他有兩個(gè)參數(shù),表示對(duì) iterable 中的每個(gè)元素以及上一次調(diào)用后的結(jié)果運(yùn)用 function 進(jìn)行計(jì)算,因此最后返回的是一個(gè)單獨(dú)的數(shù)值,比如,我想要計(jì)算列表元素的乘積,可以表示為:

l = [1, 2, 3, 4, 5] product = reduce(lambda x, y: x * y, l) # 1*2*3*4*5 = 120

類似的,Filter,Reduce 的功能也可以用 for 循環(huán)或者 list comprehension 來實(shí)現(xiàn),但是速度都不如 Filter 或者 Reduce。

通常來說,如果你想對(duì)一個(gè)集合中的元素進(jìn)行一些操作,如果是一些非常簡(jiǎn)單的操作,比如相加,累積,那么我們優(yōu)先考慮 Map、Filter、Reduce 或者 list comprehension 的形式。

在這兩者之中,如果數(shù)據(jù)量非常大,比如機(jī)器學(xué)習(xí)的應(yīng)用,那我們一般更傾向于函數(shù)式編程的表示,因?yàn)樾矢?#xff0c;如果數(shù)據(jù)量不多,并且你想要自己的程序更加 Pythonic(Python 化),那么運(yùn)用 list comprehension 的情況也是很常見的。如果你要對(duì)集合中的元素做一些比較復(fù)雜的操作,考慮到代碼的可讀性,這時(shí)我們通常會(huì)使用 for 循環(huán),因?yàn)楦忧逦髁恕?/p>

總結(jié)

以上是生活随笔為你收集整理的白话 Python 的函数式编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。