> > a, b, c = 1 , 2 , 3 >> > sum_four(a=a, b=b, c = c , d= 1 ) 7 >> > sum_four(a=a, b=b, c = c , d= 2 ) 8 >> > sum_four(a=a, b=b, c = c , d= 3 ) 9 >> > sum_four(a=a, b=b, c = c , d= 4 ) 10 這樣寫(xiě)實(shí)在是太丑了,如果用 Map 函數(shù),是否能簡(jiǎn)化代碼? 答案是肯定的,但是Map函數(shù)【一般】只能接受單一元素,如" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python 簡(jiǎn)化函數(shù)調(diào)用的3種技巧

科技綠洲 ? 來(lái)源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-11-01 16:20 ? 次閱讀

假設(shè)有一個(gè)函數(shù),這個(gè)函數(shù)需要接收4個(gè)參數(shù),并返回這4個(gè)參數(shù)的和:

def sum_four(a, b, c, d):
  return a + b + c + d

如果需要固定最后前三個(gè)參數(shù),僅改變最后一個(gè)參數(shù)的值,這時(shí)候可能需要這么調(diào)用:

>> > a, b, c = 1, 2, 3

 >> > sum_four(a=a, b=b, c=c, d=1)
7

 >> > sum_four(a=a, b=b, c=c, d=2)
8

 >> > sum_four(a=a, b=b, c=c, d=3)
9

 >> > sum_four(a=a, b=b, c=c, d=4)
10

這樣寫(xiě)實(shí)在是太丑了,如果用 Map 函數(shù),是否能簡(jiǎn)化代碼?

答案是肯定的,但是Map函數(shù)【一般】只能接受單一元素,如果你強(qiáng)行使用的話,它會(huì)報(bào)這樣的錯(cuò):

> >> list(map(sum_four, [(1, 2, 3, 4)]))
Traceback (most recent call last):
  File "< stdin >", line 1, in < module >
TypeError: sum_four() missing 3 required positional arguments: 'b', 'c', and 'd'

怎么解決?

方案1: itertools.starmap

可以使用 itertools 的函數(shù) starmap 替換Map.

它與Map不同,允許接受一個(gè)元組作為傳入sum_four的參數(shù)。

>> > import itertools
 >> > list(itertools.starmap(sum_four, [(1, 2, 3, 4)]))
[10]

非常棒,這樣的話,上述問(wèn)題就可以使用starmap函數(shù)解決:

>> > import itertools

 >> > ds = [1, 2, 3, 4]

 >> > items = ((a, b, c, d) for d in ds)

 >> > list(items)
 [(1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 2, 3, 4)]

 >> > list(itertools.starmap(sum_four, items))
 [7, 8, 9, 10]

請(qǐng)注意 items 是一個(gè)生成器,這是為了避免 items 過(guò)大導(dǎo)致內(nèi)存消耗量過(guò)大。平時(shí)開(kāi)發(fā)的時(shí)候注意這些細(xì)節(jié),能夠使你和普通的開(kāi)發(fā)者拉開(kāi)差距。

方案2: functools.partial

第二種解決方案是使用 partial 函數(shù)固定前三個(gè)參數(shù)。

根據(jù)文檔,partial將“凍結(jié)”函數(shù)的參數(shù)的某些部分,從而生成簡(jiǎn)化版的函數(shù)。

因此上述問(wèn)題的解決方案就是:

>> > import functools
 >> > partial_sum_four = functools.partial(sum_four, a, b, c)
 >> > partial_sum_four(3)
9
 >> > # 這樣就可以使用map函數(shù)了:
 >> > list(map(partial_sum_four, ds))
[7, 8, 9, 10]

方案3: itertools.repeat()

事實(shí)上,Map 函數(shù)是允許傳遞可迭代參數(shù)的,但是有一個(gè)有趣的特點(diǎn),他會(huì)用每個(gè)可迭代對(duì)象里的項(xiàng)作為傳入函數(shù)的不同參數(shù)。這樣說(shuō)可能太過(guò)于抽象了,來(lái)看看實(shí)際的例子:

> >> list(map(sum_four, [1,1,1,1], [2,2,2,2], [3,3,3,3], [1,2,3,4]))
 [7, 8, 9, 10]

明顯,每次都使用了不同數(shù)組中對(duì)應(yīng)下標(biāo)的項(xiàng)傳入函數(shù)進(jìn)行計(jì)算。

這樣,我們可以使用這個(gè)特點(diǎn)進(jìn)行優(yōu)化。

itertools.repeat() 函數(shù)能夠根據(jù)參數(shù)產(chǎn)生一個(gè)迭代器,該迭代器一次又一次返回對(duì)象。不指定times參數(shù),它將無(wú)限期運(yùn)行。

而 Map 函數(shù)會(huì)在最短的可迭代對(duì)象被迭代完后,就會(huì)自動(dòng)停止運(yùn)行。

結(jié)合這兩個(gè)特點(diǎn),上述問(wèn)題的解決方案就出來(lái)了:

>> > import itertools
 >> > list(map(sum_four, itertools.repeat(a), itertools.repeat(b), itertools.repeat(c), ds))
 [7, 8, 9, 10]

這招非常巧妙,缺點(diǎn)是能讀懂的人不多。不過(guò)沒(méi)關(guān)系,計(jì)算機(jī)世界中某些東西知道就好,你并不一定需要去使用它。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1835

    瀏覽量

    32227
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4331

    瀏覽量

    62631
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84694
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    25947
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文詳解python調(diào)用函數(shù)

    函數(shù)被定義后,本身是不會(huì)自動(dòng)執(zhí)行的,只有在被調(diào)用后,函數(shù)才會(huì)被執(zhí)行,得到相應(yīng)的結(jié)果。但是在 Python 中我們要注意一個(gè)關(guān)鍵點(diǎn),就是Python
    發(fā)表于 10-01 10:45 ?686次閱讀

    快速掌握Python的遞歸函數(shù)與匿名函數(shù)調(diào)用

    函數(shù)Python技術(shù)學(xué)習(xí)中重要的一個(gè)環(huán)節(jié),深入掌握該階段的知識(shí)內(nèi)容,對(duì)于Python技術(shù)能力的提升非常有幫助,這里就針對(duì)遞歸函數(shù)與匿名函數(shù)
    發(fā)表于 07-19 16:22

    python普通函數(shù)創(chuàng)建與調(diào)用

    python普通函數(shù)創(chuàng)建與調(diào)用函數(shù)是一僅在調(diào)用時(shí)運(yùn)行的代碼塊。您可以將數(shù)據(jù)(稱(chēng)為參數(shù))傳遞到
    發(fā)表于 03-01 16:32

    Python函數(shù)裝飾器使用方法

    Python中的裝飾器是一可以裝飾其它對(duì)象的工具,簡(jiǎn)單地說(shuō),他們是修改其他函數(shù)的功能的函數(shù)。該工具本質(zhì)上是一個(gè)可調(diào)用的對(duì)象(callabl
    的頭像 發(fā)表于 01-21 11:36 ?1590次閱讀
    <b class='flag-5'>Python</b>的<b class='flag-5'>函數(shù)</b>裝飾器使用方法

    詳解python普通函數(shù)創(chuàng)建與調(diào)用

    函數(shù)是一僅在調(diào)用時(shí)運(yùn)行的代碼塊。您可以將數(shù)據(jù)(稱(chēng)為參數(shù))傳遞到函數(shù)中,然后由函數(shù)可以把數(shù)據(jù)作為結(jié)果返回。
    的頭像 發(fā)表于 03-01 16:32 ?1866次閱讀

    簡(jiǎn)述python類(lèi)實(shí)例及構(gòu)造函數(shù)基礎(chǔ)

    假設(shè),I2.w通過(guò)屬性繼承搜索:I2-C1-C2-C3-C3.w,找到C3.w。 那么,I2.w為函數(shù)時(shí),表示調(diào)用C3.w
    的頭像 發(fā)表于 02-21 11:23 ?731次閱讀

    Python入門(mén)之什么是函數(shù)

    Python函數(shù)比我們想象的更為靈活。由于Python函數(shù)是對(duì)象,所以函數(shù)對(duì)象可以賦值給其他的名字、傳遞給其他
    的頭像 發(fā)表于 02-21 14:24 ?507次閱讀

    Python支持遞歸函數(shù)

    Python支持遞歸函數(shù)——即直接或間接地調(diào)用自身以進(jìn)行循環(huán)的函數(shù)。遞歸是頗為高級(jí)的話題,并且它在Python中相對(duì)少見(jiàn)。然而,它是一項(xiàng)應(yīng)該
    的頭像 發(fā)表于 02-21 14:28 ?651次閱讀

    什么是函數(shù)調(diào)用?

    函數(shù)調(diào)用,就是使用我們已經(jīng)定義好的函數(shù),或者C語(yǔ)言自帶的庫(kù)函數(shù)。
    的頭像 發(fā)表于 04-04 17:21 ?5859次閱讀

    python定義函數(shù)調(diào)用函數(shù)的順序

    定義函數(shù)調(diào)用函數(shù)的順序 函數(shù)被定義后,本身是不會(huì)自動(dòng)執(zhí)行的,只有在被調(diào)用后,函數(shù)才會(huì)被執(zhí)行,得
    的頭像 發(fā)表于 10-04 17:17 ?1407次閱讀

    python函數(shù)函數(shù)之間的調(diào)用

    函數(shù)函數(shù)之間的調(diào)用 3.1 第一情況 程序代碼如下: def x ( f ): def y (): print ( 1 ) return y def f (): print ( 2
    的頭像 發(fā)表于 10-04 17:17 ?597次閱讀

    Python 函數(shù)參數(shù)分類(lèi)

    文章應(yīng)該對(duì)你會(huì)有不小的幫助。 接下來(lái)是正文。 1. 參數(shù)分類(lèi) 函數(shù),在定義的時(shí)候,可以有參數(shù)的,也可以沒(méi)有參數(shù)。 從函數(shù)定義的角度來(lái)看,參數(shù)可以分為兩: 必選參數(shù) :調(diào)用
    的頭像 發(fā)表于 10-21 10:45 ?804次閱讀

    Python調(diào)用JS的 4 方式

    Python 實(shí)現(xiàn) 本文將聊聊利用 Python 調(diào)用 JS 的4方式 2. 準(zhǔn)備 以一段簡(jiǎn)單的 JS 腳本為例,將代碼寫(xiě)入到文件中 //norm.js //計(jì)算兩個(gè)數(shù)的和 fu
    的頭像 發(fā)表于 10-30 09:41 ?719次閱讀

    python調(diào)用math函數(shù)的方法

    中。本文將詳細(xì)介紹math模塊中的各種數(shù)學(xué)函數(shù)調(diào)用方法,包括函數(shù)的功能、參數(shù)的使用和返回值的含義等方面,以幫助讀者更好地理解和應(yīng)用這些函數(shù)。 一、導(dǎo)入math模塊 要使用math模塊
    的頭像 發(fā)表于 11-22 11:01 ?3002次閱讀

    python調(diào)用windows命令

    Python是一強(qiáng)大的編程語(yǔ)言,可以用于開(kāi)發(fā)各種不同類(lèi)型的應(yīng)用程序。其中一個(gè)常見(jiàn)的用途是使用Python調(diào)用Windows命令來(lái)執(zhí)行特定的任務(wù)。在本文中,我們將詳細(xì)討論如何使用
    的頭像 發(fā)表于 11-29 14:34 ?1054次閱讀