最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

partial 函數(shù)

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

由于偏函數(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è)置了默認(rèn)參數(shù)
show_level = partial(show, name='橡皮擦')
# 由于 name 參數(shù)已經(jīng)有默認(rèn)值,調(diào)用偏函數(shù)時(shí),name 可以不指定
show_level(level="9級(jí)")

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

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

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

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

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

使用 timeit 運(yùn)行 10 萬(wàn)次,測(cè)試一下二者的時(shí)間基本沒(méi)有太大差異,所以可以互通使用,不過(guò)匿名函數(shù)還是實(shí)現(xiàn)一些相對(duì)簡(jiǎn)單的函數(shù)。

裝飾器 @lru_cache

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

該裝飾器的原型如下:

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

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

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

接下來(lái)通過(guò)菲波那切數(shù)列的遞歸展示有無(wú) 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 耗時(shí):0.2;
  • 帶 耗時(shí):0.06

差異明顯,這是因?yàn)槊看螆?zhí)行 factorial 時(shí),都會(huì)檢查由裝飾器維護(hù)的緩存池,如果值存在,直接獲取對(duì)應(yīng)的結(jié)果,避免重復(fù)計(jì)算。

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

reduce 函數(shù)

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

reduce 函數(shù)的定義:

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

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

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

讀起來(lái)有點(diǎn)繞,直接看案例即可。

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

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

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

下面為大家展示如何使用 reduce 實(shí)現(xiàn) sumlen 等函數(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ù)實(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ù)解析的詳細(xì)內(nèi)容,更多關(guān)于Python編程functools模塊創(chuàng)建修改的高階函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于Python中浮點(diǎn)數(shù)精度處理的技巧總結(jié)

    關(guān)于Python中浮點(diǎn)數(shù)精度處理的技巧總結(jié)

    雙精度浮點(diǎn)數(shù)(double)是計(jì)算機(jī)使用的一種數(shù)據(jù)類(lèi)型,使用 64 位(8字節(jié)) 來(lái)存儲(chǔ)一個(gè)浮點(diǎn)數(shù)。下面這篇文章主要給大家總結(jié)介紹了關(guān)于Python中浮點(diǎn)數(shù)精度處理的技巧,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • python批量設(shè)置多個(gè)Excel文件頁(yè)眉頁(yè)腳的腳本

    python批量設(shè)置多個(gè)Excel文件頁(yè)眉頁(yè)腳的腳本

    這篇文章主要介紹了python批量設(shè)置多個(gè)Excel文件頁(yè)眉頁(yè)腳的源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python 文件與目錄操作

    python 文件與目錄操作

    可以使用簡(jiǎn)單的方法匹配某個(gè)目錄下的所有子目錄或文件,用法也很簡(jiǎn)單。
    2008-12-12
  • Python實(shí)現(xiàn)高效提取Word文檔的特定頁(yè)

    Python實(shí)現(xiàn)高效提取Word文檔的特定頁(yè)

    在日常做?Python?辦公自動(dòng)化時(shí),處理?Word?文檔往往不只是讀取文本內(nèi)容,很多時(shí)候,我們真正需要的是像處理?PDF?一樣去操作?Word?文檔,下面我們就來(lái)看看如何使用Python提取Word文檔的特定頁(yè)面吧
    2026-04-04
  • pycharm使用docker容器開(kāi)發(fā)的詳細(xì)教程

    pycharm使用docker容器開(kāi)發(fā)的詳細(xì)教程

    這篇文章主要介紹了pycharm使用docker容器開(kāi)發(fā)的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Python 支持向量機(jī)分類(lèi)器的實(shí)現(xiàn)

    Python 支持向量機(jī)分類(lèi)器的實(shí)現(xiàn)

    這篇文章主要介紹了Python 支持向量機(jī)分類(lèi)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 以Flask為例講解Python的框架的使用方法

    以Flask為例講解Python的框架的使用方法

    這篇文章主要介紹了Python的框架的使用方法,文中以Flask框架的安裝為例進(jìn)行講解,代碼基于Python2.x版本,需要的朋友可以參考下
    2015-04-04
  • Python以簡(jiǎn)單方式定義上下文管理器的實(shí)戰(zhàn)指南

    Python以簡(jiǎn)單方式定義上下文管理器的實(shí)戰(zhàn)指南

    合理使用上下文管理器可以減少40%以上的資源泄漏問(wèn)題,并顯著提高代碼的可讀性,本文將深入探討如何以簡(jiǎn)單方式定義和使用上下文管理器,從基礎(chǔ)概念到高級(jí)技巧,希望對(duì)大家有所幫助
    2025-11-11
  • 七種Python代碼審查工具推薦

    七種Python代碼審查工具推薦

    這篇文章主要介紹了七種Python代碼審查工具推薦,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Flask的url_for和request.url如何進(jìn)行URL判斷

    Flask的url_for和request.url如何進(jìn)行URL判斷

    這篇文章主要介紹了Flask的url_for和request.url如何進(jìn)行URL判斷問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

根河市| 农安县| 玉屏| 大关县| 延安市| 马边| 扎鲁特旗| 三明市| 广汉市| 洛阳市| 青海省| 大英县| 弋阳县| 沈阳市| 轮台县| 汝南县| 伊金霍洛旗| 衡阳县| 卫辉市| 固原市| 青阳县| 大港区| 新化县| 海伦市| 西宁市| 肇州县| 岳池县| 博野县| 洛宁县| 冕宁县| 新平| 安徽省| 肃宁县| 沙坪坝区| 东光县| 芜湖市| 孝昌县| 杭州市| 绩溪县| 商水县| 耒阳市|