> > 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 這樣寫實在是太丑了,如果用 Map 函數,是否能簡化代碼? 答案是肯定的,但是Map函數【一般】只能接受單一元素,如" />

精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python 簡化函數調用的3種技巧

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-11-01 16:20 ? 次閱讀

假設有一個函數,這個函數需要接收4個參數,并返回這4個參數的和:

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

如果需要固定最后前三個參數,僅改變最后一個參數的值,這時候可能需要這么調用:

>> > 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

這樣寫實在是太丑了,如果用 Map 函數,是否能簡化代碼?

答案是肯定的,但是Map函數【一般】只能接受單一元素,如果你強行使用的話,它會報這樣的錯:

> >> 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 的函數 starmap 替換Map.

它與Map不同,允許接受一個元組作為傳入sum_four的參數。

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

非常棒,這樣的話,上述問題就可以使用starmap函數解決:

>> > 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]

請注意 items 是一個生成器,這是為了避免 items 過大導致內存消耗量過大。平時開發的時候注意這些細節,能夠使你和普通的開發者拉開差距。

方案2: functools.partial

第二種解決方案是使用 partial 函數固定前三個參數。

根據文檔,partial將“凍結”函數的參數的某些部分,從而生成簡化版的函數。

因此上述問題的解決方案就是:

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

方案3: itertools.repeat()

事實上,Map 函數是允許傳遞可迭代參數的,但是有一個有趣的特點,他會用每個可迭代對象里的項作為傳入函數的不同參數。這樣說可能太過于抽象了,來看看實際的例子:

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

明顯,每次都使用了不同數組中對應下標的項傳入函數進行計算。

這樣,我們可以使用這個特點進行優化。

itertools.repeat() 函數能夠根據參數產生一個迭代器,該迭代器一次又一次返回對象。不指定times參數,它將無限期運行。

而 Map 函數會在最短的可迭代對象被迭代完后,就會自動停止運行。

結合這兩個特點,上述問題的解決方案就出來了:

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

這招非常巧妙,缺點是能讀懂的人不多。不過沒關系,計算機世界中某些東西知道就好,你并不一定需要去使用它。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 參數
    +關注

    關注

    11

    文章

    1785

    瀏覽量

    32086
  • 函數
    +關注

    關注

    3

    文章

    4306

    瀏覽量

    62431
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84453
  • 數組
    +關注

    關注

    1

    文章

    415

    瀏覽量

    25910
收藏 人收藏

    評論

    相關推薦

    一文詳解python調用函數

    函數被定義后,本身是不會自動執行的,只有在被調用后,函數才會被執行,得到相應的結果。但是在 Python 中我們要注意一個關鍵點,就是Python
    發表于 10-01 10:45 ?626次閱讀

    快速掌握Python的遞歸函數與匿名函數調用

    函數Python技術學習中重要的一個環節,深入掌握該階段的知識內容,對于Python技術能力的提升非常有幫助,這里就針對遞歸函數與匿名函數
    發表于 07-19 16:22

    python普通函數創建與調用

    python普通函數創建與調用函數是一僅在調用時運行的代碼塊。您可以將數據(稱為參數)傳遞到
    發表于 03-01 16:32

    Python函數裝飾器使用方法

    Python中的裝飾器是一可以裝飾其它對象的工具,簡單地說,他們是修改其他函數的功能的函數。該工具本質上是一個可調用的對象(callabl
    的頭像 發表于 01-21 11:36 ?1563次閱讀
    <b class='flag-5'>Python</b>的<b class='flag-5'>函數</b>裝飾器使用方法

    詳解python普通函數創建與調用

    函數是一僅在調用時運行的代碼塊。您可以將數據(稱為參數)傳遞到函數中,然后由函數可以把數據作為結果返回。
    的頭像 發表于 03-01 16:32 ?1837次閱讀

    簡述python類實例及構造函數基礎

    假設,I2.w通過屬性繼承搜索:I2-C1-C2-C3-C3.w,找到C3.w。 那么,I2.w為函數時,表示調用C3.w
    的頭像 發表于 02-21 11:23 ?698次閱讀

    Python入門之什么是函數

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

    Python支持遞歸函數

    Python支持遞歸函數——即直接或間接地調用自身以進行循環的函數。遞歸是頗為高級的話題,并且它在Python中相對少見。然而,它是一項應該
    的頭像 發表于 02-21 14:28 ?631次閱讀

    什么是函數調用

    函數調用,就是使用我們已經定義好的函數,或者C語言自帶的庫函數。
    的頭像 發表于 04-04 17:21 ?5667次閱讀

    python定義函數調用函數的順序

    定義函數調用函數的順序 函數被定義后,本身是不會自動執行的,只有在被調用后,函數才會被執行,得
    的頭像 發表于 10-04 17:17 ?1285次閱讀

    python函數函數之間的調用

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

    Python 函數參數分類

    文章應該對你會有不小的幫助。 接下來是正文。 1. 參數分類 函數,在定義的時候,可以有參數的,也可以沒有參數。 從函數定義的角度來看,參數可以分為兩: 必選參數 :調用
    的頭像 發表于 10-21 10:45 ?697次閱讀

    Python調用JS的 4 方式

    Python 實現 本文將聊聊利用 Python 調用 JS 的4方式 2. 準備 以一段簡單的 JS 腳本為例,將代碼寫入到文件中 //norm.js //計算兩個數的和 fu
    的頭像 發表于 10-30 09:41 ?675次閱讀

    python調用math函數的方法

    中。本文將詳細介紹math模塊中的各種數學函數調用方法,包括函數的功能、參數的使用和返回值的含義等方面,以幫助讀者更好地理解和應用這些函數。 一、導入math模塊 要使用math模塊
    的頭像 發表于 11-22 11:01 ?2806次閱讀

    python調用windows命令

    Python是一強大的編程語言,可以用于開發各種不同類型的應用程序。其中一個常見的用途是使用Python調用Windows命令來執行特定的任務。在本文中,我們將詳細討論如何使用
    的頭像 發表于 11-29 14:34 ?998次閱讀