久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Python 函數式編程,看這一篇就夠了!

     hercules028 2022-05-14

    本文對 Python 中的函數式編程技術進行了簡單的入門介紹。


    圖片

    頭等函數

    在 Python 中,函數是「頭等公民」(first-class)。也就是說,函數與其他數據類型(如 int)處于平等地位。

    因而,我們可以將函數賦值給變量,也可以將其作為參數傳入其他函數,將它們存儲在其他數據結構(如 dicts)中,并將它們作為其他函數的返回值。

    把函數作為對象

    由于其他數據類型(如 string、list 和 int)都是對象,那么函數也是 Python 中的對象。我們來看示例函數 foo,它將自己的名稱打印出來:
    def foo(): print('foo')

    由于函數是對象,因此我們可以將函數 foo 賦值給任意變量,然后調用該變量。例如,我們可以將函數賦值給變量 bar:
    bar = foobar()#will print 'foo' to the console

    語句 bar = foo 將函數 foo 引用的對象賦值給變量 bar。

    把對象作為函數

    當對象可調用時(callable),它們與函數一樣,如 object()。這是通過 __call__ 方法實現的。

    示例如下:
    class Greeter: def __init__(self, greeting): self.greeting = greeting def __call__(self, name): return self.greeting + ' ' + name

    每一次配置 Greeter 類的對象時,我們都會創建一個新的對象,即打招呼時可以喊的新名字。如下所示:
    morning = Greeter('good morning') #creates the callable objectmorning('john') # calling the object#prints 'good morning john' to the console

    我們可以調用 morning 對象的原因在于,我們已經在類定義中使用了 __call__ 方法。為了檢查對象是否可調用,我們使用內置函數 callable:
    callable(morning) #truecallable(145) #false. int is not callable.

    數據結構內的函數

    函數和其他對象一樣,可以存儲在數據結構內部。例如,我們可以創建 int to func 的字典。當 int 是待執行步驟的簡寫時,這就會派上用場。
    # store in dictionarymapping = { 0 : foo, 1 : bar}x = input() #get integer value from usermapping[x]() #call the func returned by dictionary access

    類似地,函數也可以存儲在多種其他數據結構中。

    把函數作為參數和返回值

    函數還可以作為其他函數的參數和返回值。接受函數作為輸入或返回函數的函數叫做高階函數,它是函數式編程的重要組成部分。

    高階函數具備強大的能力。就像《Eloquent JavaScript》中解釋的那樣:
    「高階函數允許我們對動作執行抽象,而不只是抽象數值。」
    我們來看一個例子。假設我們想對一個項目列表(list of items)執行迭代,并將其順序打印出來。我們可以輕松構建一個 iterate 函數:
    def iterate(list_of_items): for item in list_of_items: print(item)

    看起來很酷吧,但這只不過是一級抽象而已。如果我們想在對列表執行迭代時進行打印以外的其他操作要怎么做呢?

    這就是高階函數存在的意義。我們可以創建函數 iterate_custom,待執行迭代的列表和要對每個項應用的函數都是 iterate_custom 函數的輸入:
    def iterate_custom(list_of_items, custom_func): for item in list_of_items: custom_func(item)

    這看起來微不足道,但其實非常強大。

    我們已經把抽象的級別提高了一層,使代碼具備更強的可重用性。現在,我們不僅可以在打印列表時調用該函數,還可以對涉及序列迭代的列表執行任意操作。

    函數還能被返回,從而使事情變得更加簡單。就像我們在 dict 中存儲函數一樣,我們還可以將函數作為控制語句,來決定適合的函數。例如:
    def add(x, y):    return x + ydef sub(x, y):    return x - ydef mult(x, y):    return x * ydef calculator(opcode):    if opcode == 1:       return add    elif opcode == 2:       return sub    else:       return mult my_calc = calculator(2) #my calc is a subtractormy_calc(5, 4) #returns 5 - 4 = 1 my_calc = calculator(9) #my calc is now a multipliermy_calc(5, 4) #returns 5 x 4 = 20.

    嵌套函數

    函數還可以在其他函數內部,這就是「內部函數」。內部函數在創建輔助函數時非常有用,輔助函數即作為子模塊來支持主函數的小型可重用函數。

    在問題需要特定函數定義(參數類型或順序)時,我們可以使用輔助函數。這種不遵循傳統做法的操作使得解決問題變得更加簡單,示例參見:http://www-inst.eecs./~cs61a/sp12/lectures/lect4-2x3.pdf。

    假設你想定義一個斐波那契函數 fib(n),該函數只有一個參數 n,我們必須返回第 n 個斐波那契數。

    定義此類函數的一種可行方式是:使用輔助函數來追蹤斐波那契數列的前兩個項(因為斐波那契數是前兩個數之和)。
    def fib(n): def fib_helper(fk1, fk, k): if n == k: return fk else: return fib_helper(fk, fk1+fk, k+1) if n <= 1: return n else: return fib_helper(0, 1, 1)

    將該計算從函數主體移到函數參數,這具備非常強大的力量。因為它減少了遞歸方法中可能出現的冗余計算。

    單表達式函數(Lambda 表達式)

    如果我們想在未給函數命名之前寫一個函數要怎么做?如果我們想寫一個簡短的單行函數(如上述示例中的函數 foo 或 mult)要怎么做?

    我們可以在 Python 中使用 lambda 關鍵字來定義此類函數。示例如下:
    mult = lambda x, y: x * ymult(1, 2) #returns 2

    該 mult 函數的行為與使用傳統 def 關鍵字定義函數的行為相同。

    注意:lambda 函數必須為單行,且不能包含程序員寫的返回語句。

    事實上,它們通常具備隱式的返回語句(在上面的示例中,函數想表達 return x * y,不過我們省略了 lambda 函數中的顯式返回語句)。

    lambda 函數更加強大和精準,因為我們還可以構建匿名函數(即沒有名稱的函數):
    (lambda x, y: x * y)(9, 10) #returns 90

    當我們只需要一次性使用某函數時,這種方法非常方便。例如,當我們想填充字典時:
    import collectionspre_fill = collections.defaultdict(lambda: (0, 0))#all dictionary keys and values are set to 0

    接下來我們來看 Map、Filter 和 Reduce,以更多地了解 lambda。

    Map、Filter 和 Reduce

    Map

    map 函數基于指定過程(函數)將輸入集轉換為另一個集合。這類似于上文提到的 iterate_custom 函數。例如:
    def multiply_by_four(x): return x * 4scores = [3, 6, 8, 3, 5, 7]modified_scores = list(map(multiply_by_four, scores))#modified scores is now [12, 24, 32, 12, 20, 28]

    在 Python 3 中,map 函數返回的 map 對象可被類型轉換為 list,以方便使用。現在,我們無需顯式地定義 multiply_by_four 函數,而是定義 lambda 表達式:

    modified_scores = list(map(lambda x: 4 * x, scores))

    當我們想對集合內的所有值執行某項操作時,map 函數很有用。

    Filter

    就像名稱所顯示的那樣,filter 函數可以幫助篩除不想要的項。例如,我們想要去除 scores 中的奇數,那么我們可以使用 filter:
    even_scores = list(filter(lambda x: True if (x % 2 == 0) else False, scores))#even_scores = [6, 8]

    由于提供給 filter 的函數是逐個決定是否接受每一個項的,因此該函數必須返回 bool 值,且該函數必須是一元函數(即只使用一個輸入參數)。

    Reduce

    reduce 函數用于「總結」或「概述」數據集。例如,如果我們想要計算所有分數的總和,就可以使用 reduce:
    sum_scores = reduce((lambda x, y: x + y), scores)#sum_scores = 32

    這要比寫循環語句簡單多了。注意:提供給 reduce 的函數需要兩個參數:一個表示正在接受檢查的項,另一個表示所用運算的累積結果。

    本文是關于函數式編程的一篇入門文章,雖然盡量完備地介紹了相關的知識,但并不是那么深入。如想了解更多,大家可以閱讀以下資源:

    • Best Practices for Using Functional Programming in Python:https:///blog/python/functional-programming/

    • Functional Programming Tutorials and Notes:https://www./zh/practice/python/functional-programming/functional-programming-1/tutorial/

    機器之心、Python 編程時光

    原文鏈接:https:///better-programming/introduction-to-functional-programming-in-python-3d26cd9cbfd7

    重磅!程序員交流群已成立

    公眾號運營至今,離不開小伙伴們的支持。

    為了給小伙伴們提供一個互相交流的平臺,特地開通了程序員交流群

    群里有不少技術大神,不時會分享一些技術要點,更有一些資源收藏愛好者不時分享一些優質的學習資料。(群完全免費,不廣告不賣課!)

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 偷窥国产亚洲免费视频| 欧美日韩一区二区综合| 麻花传媒剧国产MV免费播放| 人妻少妇久久中文字幕| 亚洲中文字幕国产精品| 免费人成网站视频在线观看 | 国产精品天天看天天狠| 在线高清免费不卡全码| 国产成人无码免费看视频软件| 久久精品中文闷骚内射| 久久被窝亚洲精品爽爽爽| 亚洲AV无码之国产精品网址| 中文字幕V亚洲日本在线电影| 又爽又黄无遮拦成人网站| 波多野结系列18部无码观看AV| 熟妇人妻一区二区三区四区| 午夜免费无码福利视频麻豆| 精品乱码无人区一区二区| 国语精品自产拍在线观看网站| 欧美黑人又大又粗XXXXX| 波多野结系列18部无码观看AV| 欧美人与动人物牲交免费观看久久| 精品卡通动漫亚洲AV第一页| 免费观看的AV毛片的网站| 青青草国产线观看| 国产一区二区不卡91| 饥渴的少妇2中文字幕| 日本高清中文字幕免费一区二区 | 欧美性受XXXX黑人XYX性爽| 亚洲 国产 制服 丝袜 一区| 亚洲AV无码专区在线电影天堂| 亚洲人成影院在线观看| 国产成人亚洲综合图区| 国产AV大陆精品一区二区三区| 精品一区二区三区在线播放视频| 亚洲中文字幕人妻系列| 久久97精品久久久久久久不卡 | 国产69囗曝吞精在线视频| 少妇办公室好紧好爽再浪一点| 亚洲人成色99999在线观看| 一个人免费视频观看在线WWW|