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