這篇文章主要介紹“Python中的函數(shù)式編程的方法是什么”,在日常操作中,相信很多人在Python中的函數(shù)式編程的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中的函數(shù)式編程的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習吧!
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:國際域名空間、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、廣安網(wǎng)站維護、網(wǎng)站推廣。
命令范式和函數(shù)范式
我們先對比一下編程中的命令范式兩個概念:
在命令式范式中,您通過給計算機一個任務(wù)序列來完成任務(wù),然后它執(zhí)行這些任務(wù)。在執(zhí)行它們時,它可以改變狀態(tài)。例如,假設(shè)你一開始把A設(shè)為5,然后你改變A的值,你有變量,在這個意義上,變量內(nèi)部的值是變化的。
在函數(shù)范型中,你不告訴計算機要做什么,而是告訴它是什么。例如:一個數(shù)的最大公約數(shù)是多少,從1到n的乘積是多少,等等。因此,變量不能改變。一旦你設(shè)置了一個變量,它就會一直保持這種狀態(tài)(注意,在純函數(shù)語言中它們不被稱為變量)。所謂"副作用"(side effect),指的是函數(shù)內(nèi)部與外部互動(最典型的情況,就是修改全局變量的值),產(chǎn)生運算以外的其他結(jié)果。函數(shù)式編程強調(diào)沒有"副作用",意味著函數(shù)要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變量的值。
讓我們來看一個典型Python代碼的例子:
a = 3 def some_func(): global a a = 5 some_func() print(a)
這段代碼的輸出是5。在函數(shù)范型中,改變變量是一個大禁忌,而讓函數(shù)影響它們范圍之外的東西也是一個大禁忌。函數(shù)唯一能做的就是計算并返回結(jié)果。
現(xiàn)在你可能會想:“沒有變量,就沒有副作用?”這有什么好處呢?”
如果一個函數(shù)使用相同的參數(shù)被調(diào)用兩次,那么它肯定會返回相同的結(jié)果。因為函數(shù)沒有副作用,如果你正在構(gòu)建一個計算的程序,你可以加速這個程序。如果程序知道func(2)等于3,我們可以將其存儲在一個表中。這可以防止程序在我們已經(jīng)知道答案的情況下重復(fù)運行相同的函數(shù)。
Map
為了理解map,讓我們首先看看什么是iterables。iterable是任何可以迭代的東西。通常這些是列表或數(shù)組,但是Python有許多不同類型的迭代器。您甚至可以創(chuàng)建自己的對象,這些對象可以使用Python中魔法方法進行迭代。這里有兩個方法:
class Counter: def __init__(self, low, high): # set class attributes inside the magic method __init__ # for "inistalise" self.current = low self.high = high def __iter__(self): # first magic method to make this object iterable return self def __next__(self): # second magic method if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1
“魔法方法是python內(nèi)置方法,不需要主動調(diào)用,存在的目的是為了給python的解釋器進行調(diào)用,幾乎每個魔法方法都有一個對應(yīng)的內(nèi)置函數(shù),或者運算符,當我們對這個對象使用這些函數(shù)或者運算符時就會調(diào)用類中的對應(yīng)魔法方法,可以理解為重寫內(nèi)置函數(shù)?!?/td> |
第一個神奇的方法是用“__ iter__”返回迭代對象,通常在循環(huán)開始時使用。
如果我們運行:
for c in Counter(3, 8): print(c)
那么將會輸出:
345678
在Python中,迭代器是一個對象,它只有一個簡單的魔法方法。這意味著您可以訪問對象中的位置,但不能遍歷對象。有些對象將使用方法__next__,如上面代碼中第二個例子。
現(xiàn)在我們知道了什么是可迭代對象,讓我們回到map函數(shù)。map函數(shù)允許我們將一個函數(shù)應(yīng)用到iterable中的每個項。通常,我們希望對列表中的每一項都應(yīng)用一個函數(shù),但是要知道對于大多數(shù)迭代器來說都是可能的。Map接受兩個輸入,即要應(yīng)用的函數(shù)和可迭代的對象:
map(function, iterable)
假設(shè)我們有一個列表:
[1, 2, 3, 4, 5]
我們希望將列表中的每一個數(shù)字進行平方,那么可以這么寫代碼:
x = [1, 2, 3, 4, 5] def square(num): return num*num print(list(map(square, x)))
Python中的函數(shù)是惰性的。如果我們代碼中不包含“l(fā)ist()”,函數(shù)將存儲迭代的定義,而不是一個列表。我們需要顯式地告訴Python“將這個轉(zhuǎn)換為一個列表”,以便我們使用它。
現(xiàn)在寫一個像“square(num)”這樣的普通函數(shù)很好,但是它看起來不太對。我們必須定義一個完整的函數(shù)才能在map中使用一次?我們可以使用lambda(匿名)函數(shù)在map中定義一個函數(shù)。
lambda 表達式
lambda表達式是一個單行函數(shù)。舉個例子,這個lambda表達式對給定的一個數(shù)字求平方:
square = lambda x: x * x
運行程序:
>>> square(3) 9
告訴Python這是一個lambda函數(shù),輸入被稱為x,冒號后面的內(nèi)容就是你對輸入的操作,它會自動返回結(jié)果。
現(xiàn)在我們可以將上面的程序簡化:
x = [1, 2, 3, 4, 5] print(list(map(lambda num: num * num, x)))
Reduce
Reduce是一個函數(shù),它把一個可迭代的東西變成一個東西。通常,您在一個列表上執(zhí)行計算以將其縮減為一個數(shù)字。Reduce是這樣的:
reduce(function, list)
我們可以(通常也會)使用lambda表達式作為函數(shù)。
列表的乘積是每一個單獨的數(shù)字相乘。要做到這一點,你可以:
product = 1x = [1, 2, 3, 4]for num in x: productproduct = product * num
但是使用reduce你可以這樣寫:
from functools import reduce product = reduce((lambda x, y: x * y),[1, 2, 3, 4])
Filter
filter函數(shù)接受一個iterable并過濾掉在該iterable中不需要的所有東西。
filter通常接受一個函數(shù)和一個列表。它將函數(shù)應(yīng)用于列表中的每一項,如果該函數(shù)返回True,則不執(zhí)行任何操作。如果返回False,則從列表中刪除該項目。
語法如下:
filter(function, list)
讓我們看看一個小例子,沒有過濾器,我們會寫:
x = range(-5, 5) new_list = [] for num in x: if num < 0: new_list.append(num)
有了過濾器,這就變成:
x = range(-5, 5) all_less_than_zero = list(filter(lambda num: num < 0, x))
高階函數(shù)
高階函數(shù)可以將函數(shù)作為參數(shù)并返回函數(shù)。一個非常簡單的例子如下:
def summation(nums): return sum(nums) def action(func, numbers): return func(numbers) print(action(summation, [1, 2, 3]))
partial application
部分應(yīng)用程序(也稱為閉包)有點奇怪,但是非???。您可以調(diào)用一個函數(shù)而不提供它需要的所有參數(shù)。我們來看一個例子。我們想要創(chuàng)建一個函數(shù),它有兩個參數(shù),一個底數(shù)和一個指數(shù),并返回底數(shù)的指數(shù)次方,就像這樣:
def power(base, exponent): return base ** exponent
現(xiàn)在我們想要一個專門的平方函數(shù),用冪函數(shù)求出一個數(shù)的平方:
def square(base): return power(base, 2)
這是可行的,但如果我們想要一個立方體函數(shù)呢?或者是函數(shù)的4次方?我們能一直寫下去嗎?嗯,你可以。但是程序員很懶。如果你一遍又一遍地重復(fù)同樣的事情,這是一個信號,表明有一種更快的方法可以加快速度,讓你不再重復(fù)。我們可以在這里使用部分應(yīng)用程序。讓我們看一個例子的平方函數(shù)使用部分應(yīng)用程序:
from functools import partialsquare = partial(power, exponent=2)print(square(2))
到此,關(guān)于“Python中的函數(shù)式編程的方法是什么”的學(xué)習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習,快去試試吧!若想繼續(xù)學(xué)習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站欄目:Python中的函數(shù)式編程的方法是什么
轉(zhuǎn)載注明:http://aaarwkj.com/article8/gjgiop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)、建站公司、虛擬主機、商城網(wǎng)站、品牌網(wǎng)站設(shè)計、動態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)