搜尋
首頁後端開發Python教學一起來分析Python函數式編程

本篇文章為大家帶來了關於python的相關知識,其中主要介紹了函數式程式設計的相關問題,也就是在命令式範式中,透過為電腦提供一系列指令然後執行它們來完成任務,希望對大家有幫助。

一起來分析Python函數式編程

 推薦學習:python學習教學

在這篇文章裡,你將學會什麼是函數範式以及如何使用Python進行函數式編程。你也將了解列表推導和其它形式的推導。

函數範式

在命令式範式中,透過為電腦提供一系列指令然後執行它們來完成任務。在執行這些指令時,可以改變某些狀態。例如,假設你最初將A設為5,然後改變A的值。這時在變數內部值的意義上,你改變了A的狀態。

在函數式範式中,你不用告訴電腦做什麼而是告訴他這個東西是什麼。例如數字的最大公約數是什麼,從1到n的乘積是什麼等等。

因此,變數不能變化。一旦你設定了一個變量,它就永遠保持這種狀態(注意,在純函數式語言中,它們不是變量)。因此,函數式程式設計沒有副作用。副作用指的是函數改變它自己以外的東西。讓我們來看一些典型Python程式碼的範例:

這段程式碼的輸出是5。在函數式範式中,改變變數是一個很大的禁忌,並且具有影響其範圍之外事物的功能也是一個很大的禁忌。函數唯一能做的就是計算一些東西並將其作為結果傳回。

現在你可能會想:「沒有變量,沒有副作用?為什麼這樣好?」這個問題問得好,我相信大多數人對此感到疑惑。

如果使用相同的參數呼叫函數兩次,則保證會傳回相同的結果。如果你已經學習了數學函數,你就會知道這個好處。這稱為參照透明度。由於函數沒有副作用,如果你正在建立一個計算某些事情的程序,你可以加速程序。如果每次呼叫func(2)都回傳3,我們可以將它儲存在表中,這可以防止程式重複執行相同的功能。

通常,在函數式程式設計中,我們不使用迴圈。我們使用遞歸。遞歸是一個數學概念,通常意味著“自我調用”。使用遞歸函數,該函數將其自身作為子函數重複呼叫。這是Python中遞迴函數的一個很好的例子:

有些程式語言也具有惰性。這意味著他們直到最後一秒才計算或做任何事情。如果你寫一些程式碼來執行2 2,函數程式只會在你真正需要使用結果時計算出來。我們很快就會在Python中探索惰性。

Map

為了理解,我們先來看看迭代是什麼。通常可以迭代的物件是列表或數組,但Python有許多不同的類型可以迭代。你甚至可以創建自己的對象,這些對象可以透過實現魔術方法進行迭代。魔術方法就像是一個API,可以幫助你的物件變得更Pythonic。您需要實現2個魔術方法才能使對象成為可迭代的:

第一個魔術方法“__iter__”(註:這裡是雙下劃線)返回迭代對象,這通常在循環開始時使用。 ”__next__「傳回下一個物件。

讓我們快速進入一個終端呼叫上面的程式碼:

#運行將會印出

在Python中,迭代器是一個只有__iter__魔術方法的物件。這意味著您可以存取物件中的位置,但不能遍歷該物件。有些物件將具有魔術方法__next__而不是__iter__魔術方法,例如集合(在本文後面討論)。對於本文,我們假設我們接觸的所有內容都是可迭代的物件。

現在我們知道什麼是可迭代物件了,讓我們回到map函數。 map函數允許我們將函數應用於iterable中的每一項。 Map需要2個輸入,它們分別是要套用的函數和可迭代物件。

假設我們有一個數字列表,如下所示:

我們想要對每個數字進行平方,我們可以寫如下程式碼:

Python中函數式的函數是具有惰性的。如果我們不使用“list”,函數將儲存iterable的定義,而不是列表本身。我們需要明確告訴Python「把它變成一個清單」供我們使用。

在Python中突然從非惰性求值轉向惰性求值有點奇怪。如果你在函數式思維方式中考慮得更多,而不是命令式思維方式,那麼你最終會習慣它。

現在寫一個像「square(num)」這樣的普通函數雖然很好,但卻是不對的。我們必須定義一個完整的函數才能在map中使用它?好吧,我們可以使用lambda(匿名)函數在map中定義一個函數。

Lambda表達式

lambda表達式是一個只有一行的函數。舉個例子,這個lambda表達式對給定的數字平方:

#讓我們運行它:

# #這看起來不像函數嗎?

嗯,這有點令人困惑,但可以解釋。我們將一些東西分配給變數“square”。那這個呢:

告訴Python這是一個lambda函數,輸入叫做x。冒號之後的任何內容都是您對輸入所做的操作,它會自動傳回結果。

簡化我們的square程式到只有一行程式碼,我們可以這樣做:

所以在lambda表達式中,所有參數都在左邊,你要用它們做的東西在右邊。它有點亂。但事實是,編寫只有其他函數式程式設計師才能閱讀的程式碼會有一定的樂趣。此外,使用函數並將其轉換為一行程式碼是非常酷的。

Reduce

Reduce是將迭代變成一個東西的函數。通常,你可以在列表上使用reduce函數執行計算以將其減少到一個數字。 Reduce看起來像這樣:

我們常常會使用lambda表達式作為函數。

清單的乘積是每個單獨的數字相乘。要做到這一點你將寫如下程式碼:

但是使用reduce你可以這樣寫:

得到相同的功能,程式碼更短,並且在使用函數式程式設計的情況下更整潔。 (註:reduce函數在Python3中已不是內建函數,需要從functools模組中導入)

Filter

filter函數採用可迭代的方式,並過濾掉你在該可迭代中不需要的所有內容。

通常,filter需要一個函數和一個列表。它將函數應用於清單中的每一項,如果函數傳回True,則不執行任何操作。如果傳回False,則從清單中刪除該項目。

語法如下:

讓我們來看一個小例子,沒有filter我們會寫:

使用filter,可以這樣寫:

Python作為一門不斷發展與普及的語言,還在不斷更新中。學習時,建議找一些學習夥伴一起來學習討論,效果更佳。如果想學習Python,歡迎加入Python學習交流群(627012464),一起督促,一起學習。裡面有開發工具,很多乾貨和技術資料分享!

高階函數

高階函數可以將函數當作參數並傳回函數。一個很簡單的例子如下:

第二個回傳函數的範例:

##開頭我說過純函數式程式語言沒有變數。更高階的函數使這變得更容易。

Python中的所有函數都是一等公民。一等公民被定義為具有以下一個或多個特徵:

在運行時創建

在資料結構中分配變數或元素

作為函數的參數傳遞

作為函數的結果傳回

Python中的所有函數都可以用作高階函數。

Partial application

Partial application(也稱為閉包)有點奇怪,但非常酷。您可以在不提供所需的所有參數的情況下呼叫函數。讓我們在一個例子中看到這一點。我們想要建立一個函數,它接受2個參數,一個基數和一個指數,並且傳回指數冪的基數,如下所示:

##現在我們想要一個專用的平方函數,使用冪函數計算數字的平方:

這有效,但如果我們想要一個立方體函數呢?或者求四次方的功能呢?我們可以繼續寫下它們嗎?好吧,你可以。但程式設計師很懶的。如果你一遍又一遍地重複同樣的事情,這表明有一種更快的方法來加快速度,這將使你不再重複。我們可以在這裡使用閉包。讓我們來看一個使用閉包的square函數的範例:

是不是很酷!我們可以只使用1個參數來呼叫需要2個參數的函數。

我們也可以使用一個迴圈來產生一個冪函數,該函數實作從立方體一直到1000的冪。

函數式程式設計不是pythonic

您可能已經注意到了,我們想要在函數式程式設計中做的很多事情都圍繞著列表。除了reduce函數和閉包之外,您看到的所有函數都會產生列表。 Guido(Python之父)不喜歡Python中的函數式,因為Python已經有了自己產生列表的方法。

如果你在Python的互動環境下寫入」import this“,你將會得到:

這是Python之禪。這是一首關於Pythonic意味著什麼的詩。我們想要涉及的部分是:

There should be one — and preferably only one — obvious way to do it.(應該盡量找到一種,最好是唯一一種明顯的解決方案)

在Python中,map和filter可以執行與清單推導(下面討論)相同的操作。這打破了Python之禪的一個規則,因此函數式程式設計的這些部分不被視為「pythonic」。

另一個話題是Lambda。在Python中,lambda函數是一個普通函數。 Lambda是語法糖。這兩種說法是等價的。

普通函數可以執行lambda函數可以執行的所有操作,但它不能以相反的方式運作。 lambda函數不能完成普通函數可以執行的所有操作。

這是一個簡短的論證,為什麼函數式程式設計不能很好地適應整個Python生態系統。你可能已經注意到我之前提到了列表推導,我們現在將討論它們。

列表推導

前面,我提到你可以用map或filter做的任何事情,你可以用列表推導。列表推導是一種在Python中產生列表的方法。語法是:

讓我們將清單中的每個數字平方,例如:

我們可以看到如何將函數應用於列表中的每一項。我們如何應用filter呢?看看前面的程式碼:

我們可以將其轉換成列表推導,像這樣:

列表支援if這樣的語句。您不再需要將一百萬個函數應用於某些東西以獲得您想要的東西。事實上,如果你想嘗試產生某種列表,那麼使用列表推導看起來會更清晰,更容易。如果我們想要將清單中每個0以下的數字平方怎麼辦?有了lambda,map和filter你會寫:

這似乎很長很複雜。透過列表推導,它只是:

#列表推導僅適用於列表。 map,filter適合任何可迭代的對象,那麼這有什麼用呢?你可以對你遇到的任何可迭代物件使用任何推導。

其他推導

你可以為任何可迭代物件建立一個推導。

可以使用推導產生任何可迭代的物件。從Python 2.7開始,您甚至可以產生字典(hashmap)。

如果它是可迭代的,則可以產生它。讓我們來看看最後一組的例子。

#set是一個元素列表,在該列表中沒有元素重複兩次。

set中的元素沒有順序。

您可能會注意到set(集合)與dict(字典)具有相同的花括號。 Python非常聰明。根據你是否為dict提供值,它會知道你是在寫dict推導還是set推導。

 推薦學習:python教學

#

以上是一起來分析Python函數式編程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器