1. 程式人生 > 程式設計 >Python3 實現減少可呼叫物件的引數個數

Python3 實現減少可呼叫物件的引數個數

問題

一個被其他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 實現減少可呼叫物件的引數個數就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。