<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【干貨+福利】Python 函數(shù)式編程,看這一篇就夠了!

          共 6934字,需瀏覽 14分鐘

           ·

          2022-09-29 15:51

          c5963010631818857d66257c7f5fa305.webp


          6037f54b9b97c0832e1da78405ac3a7c.webp


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

          e703bec2f2644770838bf53b90e4ffc5.webp


          頭等函數(shù)
          在 Python 中,函數(shù)是「頭等公民」(first-class)。也就是說,函數(shù)與其他數(shù)據(jù)類型(如 int)處于平等地位。
          因而,我們可以將函數(shù)賦值給變量,也可以將其作為參數(shù)傳入其他函數(shù),將它們存儲在其他數(shù)據(jù)結構(如 dicts)中,并將它們作為其他函數(shù)的返回值。
          把函數(shù)作為對象
          由于其他數(shù)據(jù)類型(如 string、list 和 int)都是對象,那么函數(shù)也是 Python 中的對象。我們來看示例函數(shù) foo,它將自己的名稱打印出來:
                def?foo():
          ???print("foo")

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

          語句 bar = foo 將函數(shù) foo 引用的對象賦值給變量 bar。
          把對象作為函數(shù)
          當對象可調用時(callable),它們與函數(shù)一樣,如 object()。這是通過 __call__ 方法實現(xiàn)的。
          示例如下:
              class?Greeter:
          ???def?__init__(self,?greeting):
          ??????self.greeting?=?greeting
          ???def?__call__(self,?name):
          ??????return?self.greeting?+?"?"?+?name

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

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

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

          類似地,函數(shù)也可以存儲在多種其他數(shù)據(jù)結構中。
          把函數(shù)作為參數(shù)和返回值
          函數(shù)還可以作為其他函數(shù)的參數(shù)和返回值。接受函數(shù)作為輸入或返回函數(shù)的函數(shù)叫做高階函數(shù),它是函數(shù)式編程的重要組成部分。
          高階函數(shù)具備強大的能力。就像《Eloquent JavaScript》中解釋的那樣:
          「高階函數(shù)允許我們對動作執(zhí)行抽象,而不只是抽象數(shù)值。」
          我們來看一個例子。假設我們想對一個項目列表(list of items)執(zhí)行迭代,并將其順序打印出來。我們可以輕松構建一個 iterate 函數(shù):
              def?iterate(list_of_items):
          ????for?item?in?list_of_items:
          ????????print(item)

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

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

          這看起來微不足道,但其實非常強大。
          我們已經(jīng)把抽象的級別提高了一層,使代碼具備更強的可重用性。現(xiàn)在,我們不僅可以在打印列表時調用該函數(shù),還可以對涉及序列迭代的列表執(zhí)行任意操作。
          函數(shù)還能被返回,從而使事情變得更加簡單。就像我們在 dict 中存儲函數(shù)一樣,我們還可以將函數(shù)作為控制語句,來決定適合的函數(shù)。例如:
              def?add(x,?y):
          ????return?x?+?y
          def?sub(x,?y):
          ????return?x?-?y
          def?mult(x,?y):
          ????return?x?*?y
          def?calculator(opcode):
          ????if?opcode?==?1:
          ???????return?add
          ????elif?opcode?==?2:
          ???????return?sub
          ????else:
          ???????return?mult?
          my_calc?=?calculator(2)?#my?calc?is?a?subtractor
          my_calc(5,?4)?#returns?5?-?4?=?1?
          my_calc?=?calculator(9)?#my?calc?is?now?a?multiplier
          my_calc(5,?4)?#returns?5?x?4?=?20.?

          嵌套函數(shù)

          函數(shù)還可以在其他函數(shù)內部,這就是「內部函數(shù)」。內部函數(shù)在創(chuàng)建輔助函數(shù)時非常有用,輔助函數(shù)即作為子模塊來支持主函數(shù)的小型可重用函數(shù)。
          在問題需要特定函數(shù)定義(參數(shù)類型或順序)時,我們可以使用輔助函數(shù)。這種不遵循傳統(tǒng)做法的操作使得解決問題變得更加簡單,示例參見:http://www-inst.eecs.berkeley.edu/~cs61a/sp12/lectures/lect4-2x3.pdf。
          假設你想定義一個斐波那契函數(shù) fib(n),該函數(shù)只有一個參數(shù) n,我們必須返回第 n 個斐波那契數(shù)。
          定義此類函數(shù)的一種可行方式是:使用輔助函數(shù)來追蹤斐波那契數(shù)列的前兩個項(因為斐波那契數(shù)是前兩個數(shù)之和)。
              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)

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

          單表達式函數(shù)(Lambda 表達式)
          如果我們想在未給函數(shù)命名之前寫一個函數(shù)要怎么做?如果我們想寫一個簡短的單行函數(shù)(如上述示例中的函數(shù) foo 或 mult)要怎么做?
          我們可以在 Python 中使用 lambda 關鍵字來定義此類函數(shù)。示例如下:
              mult?=?lambda?x,?y:?x?*?y
          mult(1,?2)?#returns?2

          該 mult 函數(shù)的行為與使用傳統(tǒng) def 關鍵字定義函數(shù)的行為相同。

          注意:lambda 函數(shù)必須為單行,且不能包含程序員寫的返回語句。
          事實上,它們通常具備隱式的返回語句(在上面的示例中,函數(shù)想表達 return x * y,不過我們省略了 lambda 函數(shù)中的顯式返回語句)。
          lambda 函數(shù)更加強大和精準,因為我們還可以構建匿名函數(shù)(即沒有名稱的函數(shù)):
              (lambda?x,?y:?x?*?y)(9,?10)?#returns?90
            

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

          接下來我們來看 Map、Filter 和 Reduce,以更多地了解 lambda。
          Map、Filter 和 Reduce
          Map
          map 函數(shù)基于指定過程(函數(shù))將輸入集轉換為另一個集合。這類似于上文提到的 iterate_custom 函數(shù)。例如:
              def?multiply_by_four(x):
          ????return?x?*?4
          scores?=?[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 函數(shù)返回的 map 對象可被類型轉換為 list,以方便使用。現(xiàn)在,我們無需顯式地定義 multiply_by_four 函數(shù),而是定義 lambda 表達式:

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

          當我們想對集合內的所有值執(zhí)行某項操作時,map 函數(shù)很有用。
          Filter
          就像名稱所顯示的那樣,filter 函數(shù)可以幫助篩除不想要的項。例如,我們想要去除 scores 中的奇數(shù),那么我們可以使用 filter:
              even_scores?=?list(filter(lambda?x:?True?if?(x?%?2?==?0)?else?False,?scores))
          #even_scores?=?[6,?8]

          由于提供給 filter 的函數(shù)是逐個決定是否接受每一個項的,因此該函數(shù)必須返回 bool 值,且該函數(shù)必須是一元函數(shù)(即只使用一個輸入?yún)?shù))。
          Reduce
          reduce 函數(shù)用于「總結」或「概述」數(shù)據(jù)集。例如,如果我們想要計算所有分數(shù)的總和,就可以使用 reduce:
              sum_scores?=?reduce((lambda?x,?y:?x?+?y),?scores)
          #sum_scores?=?32

          這要比寫循環(huán)語句簡單多了。注意:提供給 reduce 的函數(shù)需要兩個參數(shù):一個表示正在接受檢查的項,另一個表示所用運算的累積結果。
          本文是關于函數(shù)式編程的一篇入門文章,雖然盡量完備地介紹了相關的知識,但并不是那么深入。如想了解更多,大家可以閱讀以下資源:
          • Best Practices for Using Functional Programming in Python: https://kite.com/blog/python/functional-programming/

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


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


              

          END



                
                  

          贈書福利

          
                        
          
                          


          贈書為「從零開始利用Excel與Python進行數(shù)據(jù)分析」

          贈送5本,24小時內本文留言排名前5即可獲贈,可以分享閱讀此干貨后的收獲呀~

          截止2022/9/29/12:00

          b799bf2a84a1cb7382aba48b204c739e.webp

                      
                        

          《從零開始利用Excel與Python進行數(shù)據(jù)分析》介紹了數(shù)據(jù)分析的方法和步驟,并分別通過Excel和Python實施和對比。通過《從零開始利用Excel與Python進行數(shù)據(jù)分析》一方面可以拓寬對Excel功能的認識,另一方面可以學習和掌握Python的基礎操作。內容由淺入深,注重功能實用性,適合數(shù)據(jù)分析工作者、相關專業(yè)學生、Python初學者、Excel深入學習者閱讀。


          分為 11 章,涵蓋的主要內容有Excel和Python在數(shù)據(jù)分析領域的定位與核心功能對比、統(tǒng)計量介紹、Excel與Python實踐環(huán)境搭建、數(shù)據(jù)處理與分析的基本方法、ETL方法、數(shù)據(jù)建模理論、數(shù)據(jù)挖掘基礎、數(shù)據(jù)可視化的基本方法、分析報告的制作方法。

          
                        
          
                          

          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼逼香蕉网 | 高清在线视频一区 | 啊啊啊啊被操逼了好爽视频免费 | 黄网址免费| 日韩老熟|