1. 滾雪球學Python第四季開啓,一需三喫,Python 函數式編程初識,面向過程,面向對象,函數式

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滾雪球學 Python 第四輪,這一番我們要學習點有難度的了,因此,橡皮擦將降低閱讀與理解難度,儘量採用大白話爲你鋪墊。","attrs":{}}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"寫在前面","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這一輪的學習,非常偏理論,因爲涉及的一些概念也是借鑑的其它編程語言的風格,而且實際落地中存在部分爭議","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不過多學一點,總是沒有壞處的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滾雪球學 Python 第四輪,主要學習函數式編程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本系列文章每篇 3000 字左右(包含代碼),所以放心享用,不會增大每日學習強度滴","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滾雪球歷史系列,已完成 3 個專欄,更新中 1 個專欄,即第三輪學習更新中,目前到 21 篇~,由於第三輪是項目實踐,學 Django 去,所以第四輪概念類同步開啓。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10573584.html","title":"","type":null},"content":[{"type":"text","text":"滾雪球學 Python(完結)","attrs":{}}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10763952.html","title":"","type":null},"content":[{"type":"text","text":"滾雪球學 Python 第二輪(完結)","attrs":{}}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10901284.html","title":"","type":null},"content":[{"type":"text","text":"滾雪球學 Python 第三輪(更新中)","attrs":{}}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10656235.html","title":"","type":null},"content":[{"type":"text","text":"滾雪球學 Python 番外篇(完結)","attrs":{}}]}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Python 函數式編程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Python 不是純粹的函數式語言,但你可以使用 Python 進行函數式編程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"典型的聽君一席話,如聽一席話,說白了就是 Python 具備函數式編程的特性,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"so,可以借用函數式語言的設計模式和編程技術,把代碼寫成函數式編程的樣子","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一般此時我會吹噓一下,函數式代碼比較","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"簡潔和優雅","attrs":{}},{"type":"text","text":"~","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"好了,已經吹噓完了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以上內容都屬於講道理的範圍,那在 Python 中有哪些適合函數式編程的技能點","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"又有哪些不適的點呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下述 2 點先有個印象就行","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"優點:生成器表達式,這個後面咱會反覆提及,具備很多高階函數,例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"reduce","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"map","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"filter","attrs":{}}],"attrs":{}},{"type":"text","text":" 三巨頭。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"缺點:沒有無限遞歸等~","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你去百度 “什麼是函數式編程”,很多地方會給出答案","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函數式編程:允許把函數本身作爲參數傳入另一個函數,還允許返回一個函數。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有道理!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其實函數式編程就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"在函數中定義表達式和實現表達式的求職","attrs":{}},{"type":"text","text":",說白了就是用函數落地你的代碼。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"看起來好像是廢話,它還有一個補充的說明,在函數式編程中要避免狀態變化和使用可變對象。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"避免狀態變化","attrs":{}},{"type":"text","text":" 重點要關注賦值語句以及它如何改變狀態,因此你在函數式編程中,不會看到 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"global","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"nolocal","attrs":{}}],"attrs":{}},{"type":"text","text":" 等內容。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"同一案例的不同寫法,展示函數式編程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"概念與原理都是比較抽象的,咱還是少說概念,這個留到未來你自己總結就好,直接展示源碼差異。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"計算 1~100 內,計算 5 與 7 的倍數之和","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"面向過程的寫法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"count = 0\nfor num in range(1, 101):\n if num % 5 == 0 or num % 7 == 0:\n count += num\n\nprint(count)\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在面向過程的寫法中,邏輯都是從上向下進行運行的,例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"num","attrs":{}}],"attrs":{}},{"type":"text","text":" 從 1 數到 100,如果對 5 或者對 7 取餘等於 0,那表示可以整除,然後將 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"count","attrs":{}}],"attrs":{}},{"type":"text","text":" 與對應的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"num","attrs":{}}],"attrs":{}},{"type":"text","text":" 相加,得到最後的餘數。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這種思路是純面向過程的寫法,一般我們學習編程時,首先學會的就是該類寫法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"面向對象的寫法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"該類寫法有兩種,一種是使用 Python 內置的列表實現,一種是自己聲明一個類來實現。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一種寫法:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"count = list()\nfor num in range(1, 101):\n if num % 5 == 0 or num % 7 == 0:\n count.append(num)\n\nprint(sum(count))\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在上述寫法中,變量 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"count","attrs":{}}],"attrs":{}},{"type":"text","text":" 聲明一個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"list","attrs":{}}],"attrs":{}},{"type":"text","text":",即列表對象,但是整理看起來還是有些過程式編程語言的影子。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如最後的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sum(count)","attrs":{}}],"attrs":{}},{"type":"text","text":" 的使用就有些奇怪,看不出來面向對象的影子。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來,咱們創建一個自定義的類,進行邏輯實現。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"class My_List_Sum(list):\n def sum(self):\n count = 0\n for n in self:\n count += n\n\n return count\n\n\ncount = My_List_Sum()\nfor num in range(1, 101):\n if num % 5 == 0 or num % 7 == 0:\n count.append(num)\n\nprint(count.sum())\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代碼,我們自行實現了一個 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"My_List_Sum","attrs":{}}],"attrs":{}},{"type":"text","text":" 類,讓它繼承自 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"list","attrs":{}}],"attrs":{}},{"type":"text","text":",此時你應該明白,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"list","attrs":{}}],"attrs":{}},{"type":"text","text":" 就是一個類名,然後在類的內部實現了 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sum","attrs":{}}],"attrs":{}},{"type":"text","text":" 方法,再調用該對象的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sum","attrs":{}}],"attrs":{}},{"type":"text","text":" 方法,完美的應用了面向對象的寫法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"接下來進入正題,函數式編程的落地實現","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在正式編寫前,需要回憶一些基礎知識,例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"lambda","attrs":{}}],"attrs":{}},{"type":"text","text":" 表達式以及列表相加。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"判斷一個數字是 5 或者 7 的倍數, ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"lambda","attrs":{}}],"attrs":{}},{"type":"text","text":" 寫法如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"multiple = lambda x: x % 5 == 0 or x % 7 == 0\na = multiple(3) # False\nb = multiple(5) # True\nc = multiple(7) # False\nprint(a, b, c)\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"列表相加代碼如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"print([1]+[2]) # [1,2]\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有了上述內容,可以編寫一個遞歸函數,實現對應的邏輯,代碼的說明已經添加到註釋中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"def tool(n: int, end: int, filter_func) -> list:\n \"\"\"返回一個篩選之後的列表\n :param n: 起始值\n :param end: 終止值\n :param filter_func: 判斷表達式\n \"\"\"\n # 如果到達上限,直接返回空列表\n if n == end: return []\n # 如果滿足過濾條件,返回該值與下一個值組成的列表\n if filter_func(n):\n return [n] + tool(n + 1, end, filter_func)\n else:\n # 不滿足過濾條件,直接返回下一個值\n return tool(n + 1, end, filter_func)\n\n\n# 測試代碼\nret = tool(1, 101, lambda x: x % 5 == 0 or x % 7 == 0)\nprint(ret)\nprint(sum(ret))\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代碼即爲求和的函數式實現,其中部分邏輯如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"給定初始值與上限值,當迭代的值等於上限值時,返回空列表,即運行結束;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"傳入一個判斷條件,本案例中爲一個 lambda 表達式,用於判斷 5 和 7 的倍數;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"當滿足條件時,進行的是相加+迭代工作,當不滿足條件時,直接進入下一次迭代。","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當然還有一種函數式編程的寫法,代碼如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"print(sum(n for n in range(1, 101) if n % 5 == 0 or n % 7 == 0))\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏用到的生成器後文會進行說明。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Python 函數式編程的特點","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 Python 中,函數即對象,例如聲明一個函數之後,你可以調用其屬性。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下述代碼展示的即爲函數對象的屬性,其餘內容可以自行再做測試。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"def my_func(var1, var2, **kw):\n return var1 + var2\n\n\nprint(type(my_func)) # \nprint(my_func.__code__)\nprint(my_func.__dict__)\nprint(my_func.__code__.co_code)\nprint(my_func.__code__.co_filename)\nprint(my_func.__code__.co_argcount)\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函數式編程之所以高效,其中一個很重要的原因就是延遲計算,也叫做惰性求值,這些在後面都將逐步展開,現在依舊是接收一下印象概念。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正是因爲函數即對象,所有才有本文開篇那段對函數式編程的定義。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函數可以使用其它函數作爲參數,或者返回另一個函數,所以在實際編碼過程中,我們將會把函數轉換成其它代碼中的 “對象”,從而實現函數式編程。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來咱們要接觸一下 Python 中的純函數概念以及應用。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"純函數","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"純函數是一個概念,也就是讓函數不會對函數外作用域產生影響,即作用域爲本地。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說簡單點,就是在函數內部避免賦值操作,當然類似 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"global","attrs":{}}],"attrs":{}},{"type":"text","text":" 等關鍵字也避免使用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"針對此,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"lambda","attrs":{}}],"attrs":{}},{"type":"text","text":" 表達式就是純函數。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先查看一個純函數的例子:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"def my_func(num: int) -> int:\n return num * 100\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代碼中函數的返回值僅與 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"num","attrs":{}}],"attrs":{}},{"type":"text","text":" 有關,滿足下面兩個條件:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"沒有改變全局變量;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"沒有更新可變數據結構,例如列表,字典。","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接觸完畢純函數概念之後,下面瞭解一下函數作爲對象的落地應用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 Python 中聲明一個類,默認會攜帶部分內置的方法,例如:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"from typing import Callable\n\n\n# 聲明一個類,該類無意義,僅測試使用\nclass Ext:\n # 傳入的函數,可攜帶1~2個參數\n def __init__(self, test_demo: Callable[[int], int]) -> None:\n self.func = test_demo\n\n # 返回結果擴大2倍\n def __call__(self, arg: int) -> int:\n return self.func(arg) * 2\n\n\ndef one_func(var):\n return var + 1\n\n\ndef two_func(var):\n return var * 3\n\n\ndef three_func(var):\n return var\n\n\na = Ext(one_func)\nprint(a(3)) # 8\n\nb = Ext(two_func)\nprint(b(3)) # 18\n\nc = Ext(three_func)\nprint(c(3)) # 6\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代碼使用了一個新的模塊 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"typing","attrs":{}}],"attrs":{}},{"type":"text","text":",該模塊是 Python 3.5 之後新增的模塊,主要爲 Python 提供靜態類型的檢查 。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本案例中導入的是回調函數 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Callable","attrs":{}}],"attrs":{}},{"type":"text","text":",格式如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"Callable[[Arg1Type, Arg2Type],ReturnType]\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中內部中括號 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Arg1Type","attrs":{}}],"attrs":{}},{"type":"text","text":" 是參數類型,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ReturnType","attrs":{}}],"attrs":{}},{"type":"text","text":" 爲返回值類型。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述三個函數的簽名都與 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Callable","attrs":{}}],"attrs":{}},{"type":"text","text":" 定義的一致,所以都可以作爲 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"test_demo","attrs":{}}],"attrs":{}},{"type":"text","text":" 參數的值去傳遞。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"寫在後面","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滾雪球學Python第四輪,非常理論的一個系列,跟上大部隊的節奏,走起來,有任何問題,都可以在評論區留言,一般1小時之內都能解決。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天是持續寫作的第 213 / 365 天。可以關注點贊評論收藏。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"更多精彩","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"太多了,去主頁看吧。","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章