最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python函數式編程之面向過程面向對象及函數式簡析

 更新時間:2021年09月13日 17:18:31   作者:夢想橡皮擦  
這一番我們要學習點有難度的了,因此將降低閱讀與理解難度,盡量采用大白話為你鋪墊,因為涉及的一些概念也是借鑒的其它編程語言的風格,而且實際落地中存在部分爭議不過多學一點,總是沒有壞處的

Python 函數式編程

Python 不是純粹的函數式語言,但你可以使用 Python 進行函數式編程

典型的聽君一席話,如聽一席話,說白了就是 Python 具備函數式編程的特性,

so,可以借用函數式語言的設計模式和編程技術,把代碼寫成函數式編程的樣子

一般此時我會吹噓一下,函數式代碼比較簡潔和優(yōu)雅~

好了,已經吹噓完了。

以上內容都屬于講道理的范圍,那在 Python 中有哪些適合函數式編程的技能點

又有哪些不適的點呢?

下述 2 點先有個印象就行

優(yōu)點:生成器表達式,這個后面咱會反復提及,具備很多高階函數,例如 reducemap,filter 三巨頭。

缺點:沒有無限遞歸等~

如果你去百度 “什么是函數式編程”,很多地方會給出答案

函數式編程:允許把函數本身作為參數傳入另一個函數,還允許返回一個函數。

有道理!

其實函數式編程就是在函數中定義表達式和實現表達式的求職,說白了就是用函數落地你的代碼。

看起來好像是廢話,它還有一個補充的說明,在函數式編程中要避免狀態(tài)變化和使用可變對象。

其中避免狀態(tài)變化 重點要關注賦值語句以及它如何改變狀態(tài),因此你在函數式編程中,不會看到 global,nolocal 等內容。

同一案例的不同寫法,展示函數式編程

概念與原理都是比較抽象的,咱還是少說概念,這個留到未來你自己總結就好,直接展示源碼差異。

計算 1~100 內,計算 5 與 7 的倍數之和

面向過程的寫法

count = 0
for num in range(1, 101):
    if num % 5 == 0 or num % 7 == 0:
        count += num
print(count)

在面向過程的寫法中,邏輯都是從上向下進行運行的,例如 num 從 1 數到 100,如果對 5 或者對 7 取余等于 0,那表示可以整除,然后將 count 與對應的 num 相加,得到最后的余數。

這種思路是純面向過程的寫法,一般我們學習編程時,首先學會的就是該類寫法。

面向對象的寫法

該類寫法有兩種,一種是使用 Python 內置的列表實現,一種是自己聲明一個類來實現。

第一種寫法:

count = list()
for num in range(1, 101):
    if num % 5 == 0 or num % 7 == 0:
        count.append(num)
print(sum(count))

在上述寫法中,變量 count 聲明一個 list,即列表對象,但是整理看起來還是有些過程式編程語言的影子。

例如最后的 sum(count) 的使用就有些奇怪,看不出來面向對象的影子。

接下來,咱們創(chuàng)建一個自定義的類,進行邏輯實現。

class My_List_Sum(list):
    def sum(self):
        count = 0
        for n in self:
            count += n
        return count
count = My_List_Sum()
for num in range(1, 101):
    if num % 5 == 0 or num % 7 == 0:
        count.append(num)
print(count.sum())

上述代碼,我們自行實現了一個 My_List_Sum 類,讓它繼承自 list,此時你應該明白,list 就是一個類名,然后在類的內部實現了 sum 方法,再調用該對象的 sum 方法,完美的應用了面向對象的寫法。

接下來進入正題,函數式編程的落地實現

在正式編寫前,需要回憶一些基礎知識,例如 lambda 表達式以及列表相加。

判斷一個數字是 5 或者 7 的倍數, lambda 寫法如下:

multiple = lambda x: x % 5 == 0 or x % 7 == 0
a = multiple(3) # False
b = multiple(5) # True
c = multiple(7) # False
print(a, b, c)

列表相加代碼如下:

print([1]+[2]) # [1,2]

有了上述內容,可以編寫一個遞歸函數,實現對應的邏輯,代碼的說明已經添加到注釋中。

def tool(n: int, end: int, filter_func) -> list:
    """返回一個篩選之后的列表
    :param n: 起始值
    :param end: 終止值
    :param filter_func: 判斷表達式
    """
    # 如果到達上限,直接返回空列表
    if n == end: return []
    # 如果滿足過濾條件,返回該值與下一個值組成的列表
    if filter_func(n):
        return [n] + tool(n + 1, end, filter_func)
    else:
        # 不滿足過濾條件,直接返回下一個值
        return tool(n + 1, end, filter_func)
# 測試代碼
ret = tool(1, 101, lambda x: x % 5 == 0 or x % 7 == 0)
print(ret)
print(sum(ret))

上述代碼即為求和的函數式實現,其中部分邏輯如下:

  • 給定初始值與上限值,當迭代的值等于上限值時,返回空列表,即運行結束;
  • 傳入一個判斷條件,本案例中為一個 lambda 表達式,用于判斷 5 和 7 的倍數;
  • 當滿足條件時,進行的是相加+迭代工作,當不滿足條件時,直接進入下一次迭代。

當然還有一種函數式編程的寫法,代碼如下:

print(sum(n for n in range(1, 101) if n % 5 == 0 or n % 7 == 0))

這里用到的生成器后文會進行說明。

Python 函數式編程的特點

在 Python 中,函數即對象,例如聲明一個函數之后,你可以調用其屬性。

下述代碼展示的即為函數對象的屬性,其余內容可以自行再做測試。

def my_func(var1, var2, **kw):
    return var1 + var2
print(type(my_func))  # <class 'function'>
print(my_func.__code__)
print(my_func.__dict__)
print(my_func.__code__.co_code)
print(my_func.__code__.co_filename)
print(my_func.__code__.co_argcount)

函數式編程之所以高效,其中一個很重要的原因就是延遲計算,也叫做惰性求值,這些在后面都將逐步展開,現在依舊是接收一下印象概念。

正是因為函數即對象,所有才有本文開篇那段對函數式編程的定義。

函數可以使用其它函數作為參數,或者返回另一個函數,所以在實際編碼過程中,我們將會把函數轉換成其它代碼中的 “對象”,從而實現函數式編程。

接下來咱們要接觸一下 Python 中的純函數概念以及應用。

純函數

純函數是一個概念,也就是讓函數不會對函數外作用域產生影響,即作用域為本地。

說簡單點,就是在函數內部避免賦值操作,當然類似 global 等關鍵字也避免使用。

針對此,lambda 表達式就是純函數。

首先查看一個純函數的例子:

def my_func(num: int) -> int:
    return num * 100

上述代碼中函數的返回值僅與 num 有關,滿足下面兩個條件:

  • 沒有改變全局變量;
  • 沒有更新可變數據結構,例如列表,字典。

接觸完畢純函數概念之后,下面了解一下函數作為對象的落地應用。

在 Python 中聲明一個類,默認會攜帶部分內置的方法,例如:

from typing import Callable
# 聲明一個類,該類無意義,僅測試使用
class Ext:
    # 傳入的函數,可攜帶1~2個參數
    def __init__(self, test_demo: Callable[[int], int]) -> None:
        self.func = test_demo
    # 返回結果擴大2倍
    def __call__(self, arg: int) -> int:
        return self.func(arg) * 2
def one_func(var):
    return var + 1
def two_func(var):
    return var * 3
def three_func(var):
    return var
a = Ext(one_func)
print(a(3))  # 8
b = Ext(two_func)
print(b(3))  # 18
c = Ext(three_func)
print(c(3))  # 6

上述代碼使用了一個新的模塊 typing,該模塊是 Python 3.5 之后新增的模塊,主要為 Python 提供靜態(tài)類型的檢查 。

本案例中導入的是回調函數 Callable,格式如下:

Callable[[Arg1Type, Arg2Type],ReturnType]

其中內部中括號 Arg1Type 是參數類型,ReturnType 為返回值類型。

上述三個函數的簽名都與 Callable 定義的一致,所以都可以作為 test_demo 參數的值去傳遞。

以上就是Python函數式編程之面向過程面向對象及函數式簡析的詳細內容,更多關于Python函數式編程面向過程面向對象及函數式的資料請關注腳本之家其它相關文章!

相關文章

  • Python基礎之標準庫和常用的第三方庫案例教程

    Python基礎之標準庫和常用的第三方庫案例教程

    這篇文章主要介紹了Python基礎之標準庫和常用的第三方庫案例教程,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • 解決python3報錯之takes?1?positional?argument?but?2?were?given問題

    解決python3報錯之takes?1?positional?argument?but?2?were?gi

    這篇文章主要介紹了解決python3報錯之takes?1?positional?argument?but?2?were?given問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 解決python mysql insert語句的問題

    解決python mysql insert語句的問題

    這篇文章主要介紹了解決python mysql insert語句的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python常用的日期時間處理方法示例

    Python常用的日期時間處理方法示例

    這篇文章主要介紹了Python常用的日期時間處理方法示例,本文直接給出實現代碼,包含如給定日期向后N天的日期、昨天、今天、將字符串轉換成datetime類型等方法,需要的朋友可以參考下
    2015-02-02
  • Python閉包及裝飾器運行原理解析

    Python閉包及裝飾器運行原理解析

    這篇文章主要介紹了python閉包及裝飾器運行原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Python如何使用matplotlib繪制柱狀圖

    Python如何使用matplotlib繪制柱狀圖

    這篇文章主要介紹了Python如何使用matplotlib繪制柱狀圖問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • PO模式在selenium自動化測試框架的優(yōu)勢

    PO模式在selenium自動化測試框架的優(yōu)勢

    大家都知道po模式可以提高代碼的可讀性和減少了代碼的重復,但是相對的缺點還有,今天通過本文一起學習下PO模式在selenium自動化測試框架的優(yōu)勢,需要的朋友可以參考下
    2022-03-03
  • python requests指定出口ip的例子

    python requests指定出口ip的例子

    今天小編就為大家分享一篇python requests指定出口ip的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python實現在Excel文件中寫入圖表

    Python實現在Excel文件中寫入圖表

    這篇文章主要為大家介紹了如何利用Python語言實現在Excel文件中寫入一個比較簡單的圖表,文中的實現方法講解詳細,快動手嘗試一下吧
    2022-05-05
  • 用python建立兩個Y軸的XY曲線圖方法

    用python建立兩個Y軸的XY曲線圖方法

    今天小編就為大家分享一篇用python建立兩個Y軸的XY曲線圖方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論

屯留县| 二连浩特市| 无极县| 乐安县| 隆尧县| 玛曲县| 星子县| 从化市| 佳木斯市| 赤水市| 三原县| 依兰县| 红河县| 长子县| 仁寿县| 托克逊县| 西乌珠穆沁旗| 沭阳县| 壤塘县| 诸暨市| 平陆县| 商河县| 琼结县| 图木舒克市| 周宁县| 乌拉特后旗| 嘉定区| 荥阳市| 灌阳县| 西畴县| 甘洛县| 讷河市| 朝阳市| 武城县| 新野县| 合川市| 原阳县| 南昌市| 高阳县| 富宁县| 祁门县|