Python3 實現減少可呼叫物件的引數個數
阿新 • • 發佈:2020-01-09
問題
一個被其他python程式碼使用的callable物件,可能是一個回撥函式或者是一個處理器,由於其引數太多,導致呼叫時出錯。
解決方案
如果需要減少某個函式的引數個數,可以使用functools.partial() 。 partial() 函式允許給一個或多個引數設定固定的值,減少接下來被呼叫時的引數個數。 假設一個函式有很多引數:
def func(a,b,c,d): print(a,d)
使用 partial() 函式來固定某些引數值:
from functools import partial s1 = partial(func,1) # a = 1 print(s1(2,3,4)) (1,2,4) s2 = partial(func,d=100) # d = 100 print(s2(1,3)) (1,100) s3 = partial(func,1,d=100) # a = 1,b = 2,d = 100 print(s3(3)) (1,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,(1,8)]
很多時候 partial() 能實現的效果,其實,lambda表示式也能實現。
points.sort(key=lambda x: distance(pt,x)) print(points) [(3,8)]
以上這篇Python3 實現減少可呼叫物件的引數個數就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。