国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

1. 滾雪球?qū)WPython第四季開啟,一需三吃,Python 函數(shù)式編程初識,面向過程,面向?qū)ο螅?

huaixiaoz / 1373人閱讀

摘要:看起來好像是廢話,它還有一個補(bǔ)充的說明,在函數(shù)式編程中要避免狀態(tài)變化和使用可變對象。函數(shù)式編程的特點(diǎn)在中,函數(shù)即對象,例如聲明一個函數(shù)之后,你可以調(diào)用其屬性。

滾雪球?qū)W Python 第四輪,這一番我們要學(xué)習(xí)點(diǎn)有難度的了,因此,橡皮擦將降低閱讀與理解難度,盡量采用大白話為你鋪墊。

寫在前面

這一輪的學(xué)習(xí),非常偏理論,因?yàn)樯婕暗囊恍└拍钜彩墙梃b的其它編程語言的風(fēng)格,而且實(shí)際落地中存在部分爭議

不過多學(xué)一點(diǎn),總是沒有壞處的。

滾雪球?qū)W Python 第四輪,主要學(xué)習(xí)函數(shù)式編程

本系列文章每篇 3000 字左右(包含代碼),所以放心享用,不會增大每日學(xué)習(xí)強(qiáng)度滴

滾雪球歷史系列,已完成 3 個專欄,更新中 1 個專欄,即第三輪學(xué)習(xí)更新中,目前到 21 篇~,由于第三輪是項(xiàng)目實(shí)踐,學(xué) Django 去,所以第四輪概念類同步開啟。

Python 函數(shù)式編程

Python 不是純粹的函數(shù)式語言,但你可以使用 Python 進(jìn)行函數(shù)式編程

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

so,可以借用函數(shù)式語言的設(shè)計(jì)模式和編程技術(shù),把代碼寫成函數(shù)式編程的樣子

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

好了,已經(jīng)吹噓完了。

以上內(nèi)容都屬于講道理的范圍,那在 Python 中有哪些適合函數(shù)式編程的技能點(diǎn)

又有哪些不適的點(diǎn)呢?

下述 2 點(diǎn)先有個印象就行

  • 優(yōu)點(diǎn):生成器表達(dá)式,這個后面咱會反復(fù)提及,具備很多高階函數(shù),例如 reducemapfilter 三巨頭。
  • 缺點(diǎn):沒有無限遞歸等~

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

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

有道理!

其實(shí)函數(shù)式編程就是在函數(shù)中定義表達(dá)式和實(shí)現(xiàn)表達(dá)式的求職,說白了就是用函數(shù)落地你的代碼。

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

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

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

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

計(jì)算 1~100 內(nèi),計(jì)算 5 與 7 的倍數(shù)之和

面向過程的寫法

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

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

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

面向?qū)ο蟮膶懛?/strong>

該類寫法有兩種,一種是使用 Python 內(nèi)置的列表實(shí)現(xiàn),一種是自己聲明一個類來實(shí)現(xiàn)。

第一種寫法:

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) 的使用就有些奇怪,看不出來面向?qū)ο蟮挠白印?/p>

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

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

上述代碼,我們自行實(shí)現(xiàn)了一個 My_List_Sum 類,讓它繼承自 list,此時(shí)你應(yīng)該明白,list 就是一個類名,然后在類的內(nèi)部實(shí)現(xiàn)了 sum 方法,再調(diào)用該對象的 sum 方法,完美的應(yīng)用了面向?qū)ο蟮膶懛ā?/p>

接下來進(jìn)入正題,函數(shù)式編程的落地實(shí)現(xiàn)

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

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

multiple = lambda x: x % 5 == 0 or x % 7 == 0a = multiple(3) # Falseb = multiple(5) # Truec = multiple(7) # Falseprint(a, b, c)

列表相加代碼如下:

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

有了上述內(nèi)容,可以編寫一個遞歸函數(shù),實(shí)現(xiàn)對應(yīng)的邏輯,代碼的說明已經(jīng)添加到注釋中。

def tool(n: int, end: int, filter_func) -> list:    """返回一個篩選之后的列表    :param n: 起始值    :param end: 終止值    :param filter_func: 判斷表達(dá)式    """    # 如果到達(dá)上限,直接返回空列表    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))

上述代碼即為求和的函數(shù)式實(shí)現(xiàn),其中部分邏輯如下:

  1. 給定初始值與上限值,當(dāng)?shù)闹档扔谏舷拗禃r(shí),返回空列表,即運(yùn)行結(jié)束;
  2. 傳入一個判斷條件,本案例中為一個 lambda 表達(dá)式,用于判斷 5 和 7 的倍數(shù);
  3. 當(dāng)滿足條件時(shí),進(jìn)行的是相加+迭代工作,當(dāng)不滿足條件時(shí),直接進(jìn)入下一次迭代。

當(dāng)然還有一種函數(shù)式編程的寫法,代碼如下:

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

這里用到的生成器后文會進(jìn)行說明。

Python 函數(shù)式編程的特點(diǎn)

在 Python 中,函數(shù)即對象,例如聲明一個函數(shù)之后,你可以調(diào)用其屬性。

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

def my_func(var1, var2, **kw):    return var1 + var2print(type(my_func))  # 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)

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

正是因?yàn)楹瘮?shù)即對象,所有才有本文開篇那段對函數(shù)式編程的定義。

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

接下來咱們要接觸一下 Python 中的純函數(shù)概念以及應(yīng)用。

純函數(shù)

純函數(shù)是一個概念,也就是讓函數(shù)不會對函數(shù)外作用域產(chǎn)生影響,即作用域?yàn)楸镜亍?/p>

說簡單點(diǎn),就是在函數(shù)內(nèi)部避免賦值操作,當(dāng)然類似 global 等關(guān)鍵字也避免使用。

針對此,lambda 表達(dá)式就是純函數(shù)。

首先查看一個純函數(shù)的例子:

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

上述代碼中函數(shù)的返回值僅與 num 有關(guān),滿足下面兩個條件:

  1. 沒有改變?nèi)肿兞浚?/li>
  2. 沒有更新可變數(shù)據(jù)結(jié)構(gòu),例如列表,字典。

接觸完畢純函數(shù)概念之后,下面了解一下函數(shù)作為對象的落地應(yīng)用。

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

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

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

本案例中導(dǎo)入的是回調(diào)函數(shù) Callable,格式如下:

Callable[[Arg1Type, Arg2Type],ReturnType]

其中內(nèi)部中括號 Arg1Type 是參數(shù)類型,ReturnType 為返回值類型。

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

寫在后面

滾雪球?qū)WPython第四輪,非常理論的一個系列,跟上大部隊(duì)的節(jié)奏,走起來,有任何問題,都可以在評論區(qū)留言,一般1小時(shí)之內(nèi)都能解決。

今天是持續(xù)寫作的第 213 / 365 天。
可以關(guān)注點(diǎn)贊評論收藏

更多精彩

太多了,去主頁看吧。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/119554.html

相關(guān)文章

  • 這篇博客和你嘮嘮 python 并發(fā),雪球學(xué)python四季16篇

    摘要:圖片下載屬于操作,比較耗時(shí),基于此,可以利用中的多線程將其實(shí)現(xiàn)。更多精彩滾雪球?qū)W完結(jié)滾雪球?qū)W第二輪完結(jié)滾雪球?qū)W第三輪滾雪球?qū)W番外篇完結(jié) 在 python 編碼過程中...

    qpwoeiru96 評論0 收藏0
  • python 數(shù)據(jù)庫編程,這篇是針對 mysql 的,雪球學(xué)Python4季13篇

    摘要:的安裝博客補(bǔ)充知識年最新安裝教程,滾雪球?qū)W第四季。操作操作數(shù)據(jù)庫一般被程序員成為操作增刪改查,其中各個字符分別代表新增,讀取,更新,刪除。可以返回受影響行數(shù),可以直接通過該值判斷是否修改成功。 ...

    xiaowugui666 評論0 收藏0
  • 趣味Python入門(一):初識Python

    摘要:盡管如此,還具有高級的數(shù)據(jù)類型和靈活性。它配備了大量的標(biāo)準(zhǔn)模塊,可用于程序庫。一些模塊提供如下功能通過這些很贊的特性,瞬時(shí)化身為面向過程的語言。開發(fā)者可以便捷地將解釋器連接到一個使用編寫的應(yīng)用程序,并能隨時(shí)用作擴(kuò)展。下一部分會繼續(xù)分享。 【編者按】本文作者是 Abhishek Jaiswal ,擅長 .NET、C#、Python 等多種語言的技術(shù)控。本文中,作者通過活潑有趣的口吻向大家...

    sutaking 評論0 收藏0
  • PyTips 0x02 - Python 中的數(shù)編程

    摘要:項(xiàng)目地址中的函數(shù)式編程函數(shù)式編程英語或稱函數(shù)程序設(shè)計(jì),又稱泛函編程,是一種編程范型,它將電腦運(yùn)算視為數(shù)學(xué)上的函數(shù)計(jì)算,并且避免使用程序狀態(tài)以及易變對象。 項(xiàng)目地址:https://git.io/pytips Python 中的函數(shù)式編程 函數(shù)式編程(英語:functional programming)或稱函數(shù)程序設(shè)計(jì),又稱泛函編程,是一種編程范型,它將電腦運(yùn)算視為數(shù)學(xué)上的函數(shù)計(jì)算,并且...

    FrozenMap 評論0 收藏0
  • python開發(fā)六篇--遞歸數(shù)和面對對象編程初識

    摘要:遞歸函數(shù)遞歸函數(shù)的用法遞歸函數(shù)在一個函數(shù)里在調(diào)用這個函數(shù)本身。如來根本不會管師徒四人按照什么流程去取。面向?qū)ο蟮某绦騼?yōu)點(diǎn)是解決了程序的擴(kuò)展性。 遞歸函數(shù) 遞歸函數(shù)的用法: - 遞歸函數(shù):在一個函數(shù)里在調(diào)用這個函數(shù)本身。 - 遞歸的最大深度:998 實(shí)例 找一個函數(shù)的索引位置,遞歸實(shí)現(xiàn) l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,5...

    objc94 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<