一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python編程functools模塊創建修改的高階函數解析

Python編程functools模塊創建修改的高階函數解析

2022-01-05 00:28夢想橡皮擦 Python

本篇文章主要為大家介紹functools模塊中用于創建、修改函數的高階函數,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

partial 函數

partial 為偏函數(有的地方也叫做部分應用函數),它是對函數的二次封裝,將現有函數的部分參數提前綁定為指定值,然后再進行計算。

由于偏函數的可變參數少,因此函數調用的難度低。

直接展示代碼:

?
1
2
3
4
5
6
7
8
from functools import partial
# 原函數聲明
def show(name, level):
    print("name:", name, "level:", level)
# 定義偏函數,封裝 show() 函數,并為 name 參數設置了默認參數
show_level = partial(show, name='橡皮擦')
# 由于 name 參數已經有默認值,調用偏函數時,name 可以不指定
show_level(level="9級")

上述代碼就是使用 partial 函數,將一個函數的某些參數(案例中是 name)進行了固定(相當于提供了默認值),然后再返回一個新的函數,新函數參數也進行了減少。

還有一點是上述代碼在調用 show_level 函數時,必須使用關鍵字參數形式給 level 進行傳值,否則會出現 TypeError 錯誤,如下所示:

?
1
2
3
4
# 代碼寫成下述內容
show_level("9級")
# 異常如下
TypeError: show() got multiple values for argument 'name'

偏函數也可以通過匿名函數實現,例如下述代碼:

?
1
2
3
4
# 代碼寫成下述內容
show_level("9級")
# 異常如下
TypeError: show() got multiple values for argument 'name'

使用 timeit 運行 10 萬次,測試一下二者的時間基本沒有太大差異,所以可以互通使用,不過匿名函數還是實現一些相對簡單的函數。

裝飾器 @lru_cache

給函數添加 @lru_cache 裝飾器,可以加快函數的運行,lru 指最近使用的計算結果會保留在緩存中。

該裝飾器的原型如下:

?
1
@functools.lru_cache(maxsize=None, typed=False)

maxsize:最多緩存的次數,如果為 None,則無限制,設置為 2n 時,性能最佳;

typed:如果設置為 True(注意,在 functools32 中沒有此參數),則不同參數類型的調用將分別緩存,例如 f(3) 和 f(3.0)。

接下來通過菲波那切數列的遞歸展示有無 lru_cache 的區別。

?
1
2
3
4
5
6
7
from functools import lru_cache
import timeit
@lru_cache()
def factorial(n):
    return 1 if n <= 1 else n * factorial(n - 1)
a = timeit.timeit(stmt="factorial(20)", setup='from __main__ import factorial', number=100000)
print(a)
  • 不帶 lru_cache 耗時:0.2;
  • 帶 耗時:0.06

差異明顯,這是因為每次執行 factorial 時,都會檢查由裝飾器維護的緩存池,如果值存在,直接獲取對應的結果,避免重復計算。

一般的結論是,對于需要重復計算同一組值的應用,使用裝飾器 @lru_cache 可以大幅度提升性能。

reduce 函數

reduce 函數也是高階函數,它可以將可迭代對象中相鄰的兩個值通過指定函數結合在一起,因此 sum,len,max,min 都可以看做是 reduce 函數的特殊形式。

reduce 函數的定義:

reduce(function, sequence [, initial] ) -> value

function參數:是一個有兩個參數的函數,reduce 依次從 sequence 中取一個元素,和上一次調用 function 的結果做參數再次調用 function

如果第一次沒有指定 initial,則默認使用 sequence 的第一個元素與下一個元素一同傳入二元 function 函數中去執行。

讀起來有點繞,直接看案例即可。

?
1
2
3
4
5
from functools import reduce
def add(x, y):
    return x + y
a = reduce(add, [1, 2, 3, 4])
print(a)

initial 參數表示初始值,默認情況下是使用序列的第一個值。

?
1
2
3
from functools import reduce
a = reduce(lambda x, y: x + y, [1, 2, 3, 4], 2)
print(a)

下面為大家展示如何使用 reduce 實現 sumlen 等函數。

?
1
2
3
4
5
6
7
8
9
from functools import reduce
data = [1, 2, 3, 4]
sum = lambda data: reduce(lambda x, y: x + y, data, 0)
count = lambda data: reduce(lambda x, y: x + 1, data, 0)
min = lambda data: reduce(lambda x, y: x if x < y else y, data)
a = sum(data)
b = count(data)
c = min(data)
print(a, b, c)

還可以使用 reduce 函數與 partical 函數實現 sum 函數,代碼如下:

?
1
2
3
4
5
from functools import reduce, partial
data = [1, 2, 3, 4]
sum = partial(reduce, lambda x, y: x + y)
a = sum(data)
print(a)

以上就是Python編程functools模塊中創建修改函數的高階函數解析的詳細內容,更多關于Python編程functools模塊創建修改的高階函數的資料請關注服務器之家其它相關文章!

原文鏈接:https://dream.blog.csdn.net/article/details/120204099

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 无限好资源第一片免费韩国 | 欧美亚洲国产一区二区三区 | 亚洲高清国产品国语在线观看 | 妇女澡堂淋浴性 | 肉搏潘金莲三级18春 | 美女脱了内裤张开腿亲吻男生 | 香蕉成人国产精品免费看网站 | videos护士有奶水 | 香蕉久久高清国产精品免费 | 91免费播放人人爽人人快乐 | 久久全国免费观看视频 | 34看网片午夜理 | 歪歪视频在线播放无遮挡 | 2019理论韩国理论中文 | 色先锋av资源中文字幕 | 调教处男 | 垫底辣妹免费观看完整版 | 99热久久这里只有精品23 | 四虎影院永久在线 | 国产大片视频免费观看 | 亚洲欧美视频在线播放 | 免费被靠视频动漫 | 日本精品久久久久中文字幕 1 | 99re热这里只有精品视频 | 欧美添下面视频免费观看 | 久久伊人精品青青草原2021 | 日韩欧美三级视频 | 亚洲成年网站在线观看 | 免费观看日本视频 | 亚洲第一区欧美日韩精品 | 性做久久久久久久久老女人 | 四虎tv在线观看884aa | 国产精品1区2区 | 亚洲 激情| 操熟美女又肥又嫩的骚屁股 | 爽爽窝窝午夜精品一区二区 | 咪咪爱小说 | ak福利影院 | 日本人黄色| 99久久精彩视频 | 奇米影视99|