您好,登錄后才能下訂單哦!
小編給大家分享一下Python3如何實(shí)現(xiàn)減少可調(diào)用對象的參數(shù)個(gè)數(shù),希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
問題
一個(gè)被其他python代碼使用的callable對象,可能是一個(gè)回調(diào)函數(shù)或者是一個(gè)處理器,由于其參數(shù)太多,導(dǎo)致調(diào)用時(shí)出錯(cuò)。
解決方案
如果需要減少某個(gè)函數(shù)的參數(shù)個(gè)數(shù),可以使用functools.partial() 。 partial() 函數(shù)允許給一個(gè)或多個(gè)參數(shù)設(shè)置固定的值,減少接下來被調(diào)用時(shí)的參數(shù)個(gè)數(shù)。 假設(shè)一個(gè)函數(shù)有很多參數(shù):
def func(a, b, c, d): print(a, b, c, d)
使用 partial() 函數(shù)來固定某些參數(shù)值:
from functools import partial s1 = partial(func, 1) # a = 1 print(s1(2, 3, 4)) (1, 2, 3, 4) s2 = partial(func, d=100) # d = 100 print(s2(1, 2, 3)) (1, 2, 3, 100) s3 = partial(func, 1, 2, d=100) # a = 1, b = 2, d = 100 print(s3(3)) (1, 2, 3, 100)
可以看出 partial()函數(shù)固定某些參數(shù),并返回一個(gè)新的callable對象。這個(gè)新的callable接受未賦值的參數(shù), 然后跟之前已經(jīng)賦值過的參數(shù)合并起來,最后將所有參數(shù)傳遞給原始函數(shù)。
討論
假設(shè)有一個(gè)點(diǎn)的列表points,表示(x, y)坐標(biāo)元組?,F(xiàn)在需要以點(diǎn)(4, 3)為基點(diǎn),根據(jù)點(diǎn)和基點(diǎn)之間的距離來排序points中所有的點(diǎn)。
定義一個(gè)函數(shù),用來計(jì)算兩點(diǎn)之間的距離:
import math points = [(1, 2), (3, 4), (5, 6), (7, 8)] pt = (4, 3) def distance(p1, p2): x1, y1 = p1 x2, y2 = p2 return math.hypot(x2 - x1, y2 - y1)
列表的 sort() 排序方法,可以接受一個(gè)關(guān)鍵字參數(shù),設(shè)置自定義排序的邏輯, 但是它只能接受一個(gè)單個(gè)參數(shù)的函數(shù),很顯然,distance()函數(shù)不符合條件,通過使用 partial() 函數(shù)可以解決這個(gè)問題:
points.sort(key=partial(distance, pt)) print(points) [(3, 4), (1, 2), (5, 6), (7, 8)]
很多時(shí)候 partial() 能實(shí)現(xiàn)的效果,其實(shí),lambda表達(dá)式也能實(shí)現(xiàn)。
points.sort(key=lambda x: distance(pt, x)) print(points) [(3, 4), (1, 2), (5, 6), (7, 8)]
看完了這篇文章,相信你對“Python3如何實(shí)現(xiàn)減少可調(diào)用對象的參數(shù)個(gè)數(shù)”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。