💂 個(gè)人網(wǎng)站:【 海擁 】【摸魚(yú)小游戲 】 🤟 風(fēng)趣幽默的人工智能學(xué)習(xí)網(wǎng)站:👉人工智能 💅 想尋找共同學(xué)習(xí)交流的小伙伴,請(qǐng)點(diǎn)擊【全棧技術(shù)交流群 】 💬 便宜且實(shí)用的計(jì)算機(jī)相關(guān)書(shū)籍:👉進(jìn)來(lái)逛逛
函數(shù)式編程是一種編程范式,我們?cè)谄渲袊L試以純數(shù)學(xué)函數(shù)風(fēng)格綁定所有內(nèi)容。它是一種聲明式的編程風(fēng)格。它的主要焦點(diǎn)是“要解決什么 ”,而命令式風(fēng)格的主要焦點(diǎn)是“如何解決 ”。它使用表達(dá)式而不是語(yǔ)句。計(jì)算表達(dá)式以產(chǎn)生值,而執(zhí)行語(yǔ)句以分配變量。
函數(shù)式編程的概念
任何函數(shù)式編程語(yǔ)言都應(yīng)該遵循這些概念。
純函數(shù) :這些函數(shù)有兩個(gè)主要屬性。首先,它們總是為相同的參數(shù)產(chǎn)生相同的輸出,而不管其他任何事情。其次,它們沒(méi)有副作用,即它們確實(shí)修改了任何參數(shù)或全局變量或輸出了一些東西。遞歸 :函數(shù)式語(yǔ)言中沒(méi)有“for”或“while”循環(huán)。函數(shù)式語(yǔ)言中的迭代是通過(guò)遞歸實(shí)現(xiàn)的。函數(shù)是一等的并且可以是高階的 :一等函數(shù)被視為一等變量。第一類變量可以作為參數(shù)傳遞給函數(shù),可以從函數(shù)返回或存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中。變量是不可變的 :在函數(shù)式編程中,我們不能在變量初始化后對(duì)其進(jìn)行修改。我們可以創(chuàng)建新變量——但我們不能修改現(xiàn)有變量。
Python 中的函數(shù)式編程
Python 也支持函數(shù)式編程范式,而無(wú)需任何特殊功能或庫(kù)的支持。
純函數(shù)
如上所述,純函數(shù)有兩個(gè)屬性。
它總是為相同的參數(shù)產(chǎn)生相同的輸出。例如,無(wú)論如何,3+7 永遠(yuǎn)是 10。 它不會(huì)更改或修改輸入變量。
第二個(gè)屬性也稱為不變性。純函數(shù)的唯一結(jié)果是它返回的值。它們是確定性的。使用函數(shù)式編程完成的程序很容易調(diào)試,因?yàn)榧兒瘮?shù)沒(méi)有副作用或隱藏的 I/O。純函數(shù)還可以更輕松地編寫(xiě)并行/并發(fā)應(yīng)用程序。當(dāng)代碼以這種風(fēng)格編寫(xiě)時(shí),智能編譯器可以做很多事情——它可以并行化指令,在需要時(shí)等待評(píng)估結(jié)果,并記住結(jié)果,因?yàn)橹灰斎氩桓淖?#xff0c;結(jié)果就永遠(yuǎn)不會(huì)改變。
例子 :
# 演示純函數(shù)的 Python 程序
# 一個(gè)不改變輸入列表并返回新列表的純函數(shù)
def pure_func ( List) :
New_List = [ ]
for i in List:
New_List. append( i** 2 )
return New_List
# 驅(qū)動(dòng)程序代碼
Original_List = [ 1 , 2 , 3 , 4 ]
Modified_List = pure_func( Original_List)
print ( "Original List:" , Original_List)
print ( "Modified List:" , Modified_List)
輸出:
Original List: [ 1 , 2 , 3 , 4 ]
Modified List: [ 1 , 4 , 9 , 16 ]
遞歸
在函數(shù)式編程中,沒(méi)有 for 循環(huán)或 while 循環(huán)的概念,而是使用遞歸。遞歸是一個(gè)函數(shù)直接或間接調(diào)用自身的過(guò)程。在遞歸程序中,提供了基本情況的解決方案,而較大問(wèn)題的解決方案則用較小的問(wèn)題來(lái)表示??赡軙?huì)出現(xiàn)一個(gè)問(wèn)題,什么是基本情況?基本情況可以被認(rèn)為是告訴編譯器或解釋器退出函數(shù)的條件。
示例:讓我們考慮一個(gè)程序,該程序?qū)⒃诓皇褂萌魏?for 循環(huán)的情況下找到列表中所有元素的總和。
# 演示遞歸的 Python 程序
# 遞歸函數(shù)查找列表的總和
def Sum ( L, i, n, count) :
# Base case
if n <= i:
return count
count += L[ i]
# 進(jìn)入遞歸
count = Sum( L, i + 1 , n, count)
return count
# 驅(qū)動(dòng)程序代碼
L = [ 1 , 2 , 3 , 4 , 5 ]
count = 0
n = len ( L)
print ( Sum( L, 0 , n, count) )
輸出 :
15
函數(shù)是一等的,可以是高階的
一等的對(duì)象自始至終統(tǒng)一處理。它們可以存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中,作為參數(shù)傳遞,或者在控制結(jié)構(gòu)中使用。如果一種編程語(yǔ)言將函數(shù)視為一等對(duì)象,則稱其支持一等函數(shù)。
一等函數(shù)的性質(zhì) :
函數(shù)是 Object 類型的實(shí)例。 你可以將函數(shù)存儲(chǔ)在變量中。 你可以將函數(shù)作為參數(shù)傳遞給另一個(gè)函數(shù)。 你可以從函數(shù)返回函數(shù)。 你可以將它們存儲(chǔ)在數(shù)據(jù)結(jié)構(gòu)中,例如哈希表、列表……
# 演示高階函數(shù)的 Python 程序
def shout ( text) :
return text. upper( )
def whisper ( text) :
return text. lower( )
def greet ( func) :
# 將函數(shù)存儲(chǔ)在變量中
greeting = func( "嗨,我是由作為參數(shù)傳遞的函數(shù)創(chuàng)建的。" )
print ( greeting)
greet( shout)
greet( whisper)
輸出 :
嗨,我是由作為參數(shù)傳遞的函數(shù)創(chuàng)建的。
嗨,我是由作為參數(shù)傳遞的函數(shù)創(chuàng)建的。
內(nèi)置高階函數(shù)
為了使列表和迭代器等可迭代對(duì)象的處理更加容易,Python 實(shí)現(xiàn)了一些常用的高階函數(shù)。這些函數(shù)返回一個(gè)節(jié)省空間的迭代器。一些內(nèi)置的高階函數(shù)是:
Map() : map() 函數(shù)在將給定函數(shù)應(yīng)用于給定迭代(列表、元組等)的每個(gè)項(xiàng)目后返回結(jié)果列表
語(yǔ)法 : map(fun, iter)
參數(shù) : fun :這是一個(gè)函數(shù),map 將給定迭代的每個(gè)元素傳遞給該函數(shù)。 iter :它是一個(gè)要被映射的可迭代對(duì)象。
返回類型 :返回 map 類的迭代器。
例子 :
# 用于演示 map 工作的 Python 程序。
# Return double of n
def addition ( n) :
return n + n
# 我們使用 map() 將所有數(shù)字翻倍
numbers = ( 1 , 2 , 3 , 4 )
results = map ( addition, numbers)
# 不打印值
print ( results)
# 打印值
for result in results:
print ( result, end = " " )
輸出 :
< map object at 0x7fae3004b630 >
2 4 6 8
filter() : filter() 方法在一個(gè)函數(shù)的幫助下過(guò)濾給定的序列,該函數(shù)測(cè)試序列中的每個(gè)元素是否為真。
語(yǔ)法 :過(guò)濾器(函數(shù),序列) 參數(shù) : function :測(cè)試序列的每個(gè)元素是否為真的函數(shù)。 sequence :需要過(guò)濾的序列,可以是集合、列表、元組或任何迭代器的容器。
返回類型 :返回一個(gè)已經(jīng)過(guò)濾的迭代器。
例子 :
# 演示過(guò)濾器工作的 Python 程序。
# 過(guò)濾元音的函數(shù)
def fun ( variable) :
letters = [ 'a' , 'e' , 'i' , 'o' , 'u' ]
if ( variable in letters) :
return True
else :
return False
# sequence
sequence = [ 'g' , 'e' , 'e' , 'j' , 'k' , 's' , 'p' , 'r' ]
# 使用過(guò)濾功能
filtered = filter ( fun, sequence)
print ( '過(guò)濾后的字母是:' )
for s in filtered:
print ( s)
輸出 :
過(guò)濾后的字母是:
e
e
Lambda 函數(shù) :在 Python 中,匿名函數(shù)意味著函數(shù)沒(méi)有名稱。我們已經(jīng)知道 def 關(guān)鍵字用于定義普通函數(shù),而 lambda 關(guān)鍵字用于創(chuàng)建匿名函數(shù)。
語(yǔ)法 :
lambda 參數(shù):表達(dá)式
這個(gè)函數(shù)可以有任意數(shù)量的參數(shù),但只有一個(gè)表達(dá)式,它被計(jì)算并返回。 任何需要函數(shù)對(duì)象的地方都可以免費(fèi)使用 lambda 函數(shù)。 你需要了解 lambda 函數(shù)在語(yǔ)法上僅限于單個(gè)表達(dá)式。 除了函數(shù)中的其他類型的表達(dá)式外,它在特定的編程領(lǐng)域有多種用途。
例子 :
# 演示 lambda 的 Python 代碼
cube = lambda x: x * x* x
print ( cube( 7 ) )
L = [ 1 , 3 , 2 , 4 , 5 , 6 ]
is_even = [ x for x in L if x % 2 == 0 ]
print ( is_even)
輸出 :
343
[ 2 , 4 , 6 ]
不變性
不變性是一種可用于調(diào)試的函數(shù)式編程范例,因?yàn)樗鼤?huì)在變量被更改而不是值被更改的地方引發(fā)錯(cuò)誤。Python 也支持一些不可變的數(shù)據(jù)類型,如字符串、元組、數(shù)字等。
例子 :
# 演示不可變數(shù)據(jù)類型的 Python 程序
# 字符串?dāng)?shù)據(jù)類型
immutable = "Haiyong"
# 更改值將引發(fā)錯(cuò)誤
immutable[ 1 ] = 'K'
輸出 :
Traceback ( most recent call last) :
File "/home/ee8bf8d8f560b97c7ec0ef080a077879.py" , line 10 , in
immutable[ 1 ] = 'K'
TypeError: 'str' object does not support item assignment
函數(shù)式編程和面向?qū)ο缶幊痰膮^(qū)別
當(dāng)你對(duì)事物有一組固定的操作時(shí),面向?qū)ο蟮恼Z(yǔ)言是很好的,并且隨著代碼的發(fā)展,你主要是添加新事物。這可以通過(guò)添加實(shí)現(xiàn)現(xiàn)有方法的新類來(lái)完成,而現(xiàn)有類則不作任何處理。
當(dāng)你有一組固定的東西時(shí),函數(shù)式語(yǔ)言是很好的,并且隨著你的代碼的發(fā)展,你主要是在現(xiàn)有的東西上添加新的操作。這可以通過(guò)添加使用現(xiàn)有數(shù)據(jù)類型進(jìn)行計(jì)算的新函數(shù)來(lái)完成,而現(xiàn)有函數(shù)將被單獨(dú)保留。
函數(shù)編程 面向?qū)ο缶幊?/th> 這種編程范式強(qiáng)調(diào)函數(shù)的使用,其中每個(gè)函數(shù)都執(zhí)行特定的任務(wù)。 這種編程范式基于面向?qū)ο蟮母拍?。在?chuàng)建對(duì)象實(shí)例的地方使用類 使用的基本元素是變量和函數(shù)。函數(shù)中的數(shù)據(jù)是不可變的(創(chuàng)建后無(wú)法更改)。 使用的基本元素是對(duì)象和方法,這里使用的數(shù)據(jù)是可變數(shù)據(jù)。 它遵循聲明式編程模型。 它遵循命令式編程模型。 它使用遞歸進(jìn)行迭代。 它使用循環(huán)進(jìn)行迭代。 它支持并行編程。 它不支持并行編程。 此編程范例中的語(yǔ)句在執(zhí)行時(shí)不需要遵循特定的順序。 這種編程范式中的語(yǔ)句需要遵循一個(gè)順序,即執(zhí)行時(shí)自底向上的方法。