欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python編程functools模塊創(chuàng)建修改的高階函數(shù)解析

 更新時間:2021年09月13日 15:59:36   作者:夢想橡皮擦  
本篇文章主要為大家介紹functools模塊中用于創(chuàng)建、修改函數(shù)的高階函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

partial 函數(shù)

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

由于偏函數(shù)的可變參數(shù)少,因此函數(shù)調(diào)用的難度低。

直接展示代碼:

from functools import partial
# 原函數(shù)聲明
def show(name, level):
    print("name:", name, "level:", level)
# 定義偏函數(shù),封裝 show() 函數(shù),并為 name 參數(shù)設(shè)置了默認參數(shù)
show_level = partial(show, name='橡皮擦')
# 由于 name 參數(shù)已經(jīng)有默認值,調(diào)用偏函數(shù)時,name 可以不指定
show_level(level="9級")

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

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

# 代碼寫成下述內(nèi)容
show_level("9級")
# 異常如下
TypeError: show() got multiple values for argument 'name'

偏函數(shù)也可以通過匿名函數(shù)實現(xiàn),例如下述代碼:

# 代碼寫成下述內(nèi)容
show_level("9級")
# 異常如下
TypeError: show() got multiple values for argument 'name'

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

裝飾器 @lru_cache

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

該裝飾器的原型如下:

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

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

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

接下來通過菲波那切數(shù)列的遞歸展示有無 lru_cache 的區(qū)別。

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

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

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

reduce 函數(shù)

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

reduce 函數(shù)的定義:

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

function參數(shù):是一個有兩個參數(shù)的函數(shù),reduce 依次從 sequence 中取一個元素,和上一次調(diào)用 function 的結(jié)果做參數(shù)再次調(diào)用 function

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

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

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

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

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

下面為大家展示如何使用 reduce 實現(xiàn) sum,len 等函數(shù)。

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 函數(shù)與 partical 函數(shù)實現(xiàn) sum 函數(shù),代碼如下:

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模塊中創(chuàng)建修改函數(shù)的高階函數(shù)解析的詳細內(nèi)容,更多關(guān)于Python編程functools模塊創(chuàng)建修改的高階函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python解析html開發(fā)庫pyquery使用方法

    python解析html開發(fā)庫pyquery使用方法

    PyQuery是一個類似于jQuery的Python庫,也可以說是jQuery在Python上的實現(xiàn),能夠以jQuery的語法來操作解析 HTML 文檔,易用性和解析速度都很好
    2014-02-02
  • Pandas中GroupBy具體用法詳解

    Pandas中GroupBy具體用法詳解

    pandas中的DF數(shù)據(jù)類型可以像數(shù)據(jù)庫表格一樣進行g(shù)roupby操作。通常來說groupby操作可以分為三部分:分割數(shù)據(jù),應(yīng)用變換和和合并數(shù)據(jù)。本文就詳細的來介紹一下,感興趣的可以了解一下
    2021-07-07
  • Python實現(xiàn)快速排序算法及去重的快速排序的簡單示例

    Python實現(xiàn)快速排序算法及去重的快速排序的簡單示例

    quick sort快速排序是一種再基礎(chǔ)不過的排序算法,使用Python代碼寫起來相當(dāng)簡潔,這里我們就來看一下Python實現(xiàn)快速排序算法及去重的快速排序的簡單示例:
    2016-06-06
  • Python?input輸入超時選擇默認值自動跳過問題

    Python?input輸入超時選擇默認值自動跳過問題

    這篇文章主要介紹了Python?input輸入超時選擇默認值自動跳過問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python并發(fā)之多進程的方法實例代碼

    Python并發(fā)之多進程的方法實例代碼

    這篇文章主要介紹了Python并發(fā)之多進程的方法實例代碼,文中也提到了進程與線程的共同點,需要的朋友跟隨腳本之家小編一起看看吧
    2018-08-08
  • python Pexpect 實現(xiàn)輸密碼 scp 拷貝的方法

    python Pexpect 實現(xiàn)輸密碼 scp 拷貝的方法

    今天小編就為大家分享一篇python Pexpect 實現(xiàn)輸密碼 scp 拷貝的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python Django教程之實現(xiàn)待辦事項應(yīng)用程序

    Python Django教程之實現(xiàn)待辦事項應(yīng)用程序

    Django是一個基于Python Web框架的高級Web框架,允許快速開發(fā)和干凈,務(wù)實的設(shè)計。本文將創(chuàng)建一個待辦事項應(yīng)用程序,以了解Django的基礎(chǔ)知識,感興趣的可以嘗試一下
    2022-10-10
  • python實現(xiàn)屏保計時器的示例代碼

    python實現(xiàn)屏保計時器的示例代碼

    這篇文章主要介紹了python實現(xiàn)屏保計時器的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 淺談如何重構(gòu)冗長的Python代碼

    淺談如何重構(gòu)冗長的Python代碼

    這篇文章主要介紹了淺談如何重構(gòu)冗長的Python代碼,編寫干凈的?Pythonic?代碼就是盡可能使其易于理解,但又簡潔,過長的代碼如何做到簡潔高效,需要的朋友可以參考下
    2023-04-04
  • python區(qū)塊鏈簡易版交易實現(xiàn)示例

    python區(qū)塊鏈簡易版交易實現(xiàn)示例

    這篇文章主要為大家介紹了python區(qū)塊鏈簡易版交易實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論