目錄
頭等函數
把函數當作物件
把物件當作函數
資料結構內的函數
把函數當作參數和回傳值
巢狀函數
單一表達式函數(Lambda 表達式)
Map、Filter 和 Reduce
Map
Filter
Reduce
首頁 後端開發 Python教學 一文詳盡 Python 函數式程式設計技術

一文詳盡 Python 函數式程式設計技術

Apr 13, 2023 pm 03:16 PM
python 程式設計 科技

本文對 Python 中的函數式程式設計技術進行了簡單的入門介紹。

一文詳盡 Python 函數式程式設計技術

頭等函數

在 Python 中,函數是「頭等公民」(first-class)。也就是說,函數與其他資料型態(如 int)處於平等地位。

因而,我們可以將函數賦值給變量,也可以將其作為參數傳入其他函數,將它們儲存在其他資料結構(如 dicts)中,並將它們作為其他函數的返回值。

把函數當作物件

由於其他資料型態(如 string、list 和 int)都是對象,那麼函數也是 Python 中的對象。我們來看範例函數 foo,它將自己的名稱列印出來:

def foo():
 print("foo")
登入後複製

由於函數是對象,因此我們可以將函數 foo 賦值給任意變量,然後呼叫該變數。例如,我們可以將函數賦值給變數 bar:

bar = foo
bar()
#will print "foo" to the console
登入後複製

語句 bar = foo 將函數 foo 引用的物件賦值給變數 bar。

把物件當作函數

當物件可呼叫時(callable),它們與函數一樣,如 object()。這是透過 call 方法實現的。

範例如下:

class Greeter:
 def __init__(self, greeting):
self.greeting = greeting
 def __call__(self, name):
return self.greeting + " " + name
登入後複製

每次配置 Greeter 類別的物件時,我們都會建立一個新的對象,也就是打招呼時可以喊的新名字。如下圖:

morning = Greeter("good morning") #creates the callable object
morning("john") # calling the object
#prints "good morning john" to the console
登入後複製

我們可以呼叫 morning 物件的原因在於,我們已經在類別定義中使用了 call 方法。為了檢查物件是否可調用,我們使用內建函數 callable:

callable(morning) #true
callable(145) #false. int is not callable.
登入後複製

資料結構內的函數

函數和其他物件一樣,可以儲存在資料結構內部。例如,我們可以建立 int to func 的字典。當 int 是待執行步驟的簡寫時,這就會派上用場。

# store in dictionary
mapping = {
 0 : foo,
 1 : bar
}
x = input() #get integer value from user
mapping[x]() #call the func returned by dictionary access
登入後複製

類似地,函數也可以儲存在多種其他資料結構中。

把函數當作參數和回傳值

函數也可以當作其他函數的參數和回傳值。接受函數作為輸入或傳回函數的函數叫做高階函數,它是函數式程式設計的重要組成部分。

高階函數具備強大的能力。就像《Eloquent JavaScript》中解釋的:

「高階函數允許我們對動作執行抽象,而不只是抽象數值。」

我們來看一個例子。假設我們想要對一個項目清單(list of items)執行迭代,並將其順序列印出來。我們可以輕鬆建立一個 iterate 函數:

def iterate(list_of_items):
for item in list_of_items:
print(item)
登入後複製

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

這就是高階函數存在的意義。我們可以建立函數 iterate_custom,待執行迭代的列表和要對每個項目應用的函數都是 iterate_custom 函數的輸入:

def iterate_custom(list_of_items, custom_func):
 for item in list_of_items:
custom_func(item)
登入後複製

這看起來微不足道,但其實非常強大。

我們已經把抽象的層級提升了一層,讓程式碼具備更強的可重用性。現在,我們不僅可以在列印清單時呼叫該函數,還可以對涉及序列迭代的清單執行任意操作。

函數還能被傳回,使事情變得更加簡單。就像我們在 dict 中儲存函數一樣,我們也可以將函數作為控制語句,來決定適合的函數。例如:

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.
登入後複製

巢狀函數

函數還可以在其他函數內部,這就是「內部函數」。內部函數在建立輔助函數時非常有用,輔助函數即作為子模組來支援主函數的小型可重複使用函數。

在問題需要特定函數定義(參數類型或順序)時,我們可以使用輔助函數。這種不遵循傳統做法的操作使得解決問題變得更加簡單,範例請參見:

http://www-inst.eecs.berkeley.edu/~cs61a/sp12/lectures/lect4-2x3. pdf。

假設你想定義一個斐波那契函數 fib(n),函數只有一個參數 n,我們必須傳回第 n 個斐波那契數。

定義此類函數的一個可行方式是:使用輔助函數來追蹤斐波那契數列的前兩個項(因為斐波那契數是前兩個數之和)。

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)
登入後複製

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

單一表達式函數(Lambda 表達式)

如果我們想在未為函數命名之前寫一個函數要怎麼做?如果我們想寫一個簡短的單行函數(如上述範例中的函數 foo 或 mult)要怎麼做?

我们可以在 Python 中使用 lambda 关键字来定义此类函数。示例如下:

mult = lambda x, y: x * y
mult(1, 2) #returns 2
登入後複製

该 mult 函数的行为与使用传统 def 关键字定义函数的行为相同。

注意:lambda 函数必须为单行,且不能包含程序员写的返回语句。

事实上,它们通常具备隐式的返回语句(在上面的示例中,函数想表达 return x * y,不过我们省略了 lambda 函数中的显式返回语句)。

lambda 函数更加强大和精准,因为我们还可以构建匿名函数(即没有名称的函数):

(lambda x, y: x * y)(9, 10) #returns 90
登入後複製

当我们只需要一次性使用某函数时,这种方法非常方便。例如,当我们想填充字典时:

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 函数基于指定过程(函数)将输入集转换为另一个集合。这类似于上文提到的 iterate_custom 函数。例如:

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 函数返回的 map 对象可被类型转换为 list,以方便使用。现在,我们无需显式地定义 multiply_by_four 函数,而是定义 lambda 表达式:

modified_scores = list(map(lambda x: 4 * x, scores))
登入後複製

当我们想对集合内的所有值执行某项操作时,map 函数很有用。

Filter

就像名称所显示的那样,filter 函数可以帮助筛除不想要的项。例如,我们想要去除 scores 中的奇数,那么我们可以使用 filter:

even_scores = list(filter(lambda x: True if (x % 2 == 0) else False, scores))
#even_scores = [6, 8]
登入後複製

由于提供给 filter 的函数是逐个决定是否接受每一个项的,因此该函数必须返回 bool 值,且该函数必须是一元函数(即只使用一个输入参数)。

Reduce

reduce 函数用于「总结」或「概述」数据集。例如,如果我们想要计算所有分数的总和,就可以使用 reduce:

sum_scores = reduce((lambda x, y: x + y), scores)
#sum_scores = 32
登入後複製

这要比写循环语句简单多了。注意:提供给 reduce 的函数需要两个参数:一个表示正在接受检查的项,另一个表示所用运算的累积结果。

以上是一文詳盡 Python 函數式程式設計技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

visual studio code 可以用於 python 嗎 visual studio code 可以用於 python 嗎 Apr 15, 2025 pm 08:18 PM

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

See all articles