Как я могу создать функцию Python с переменными аргументами
Я хочу создать весовую функцию в Python. Однако величина взвешивания варьируется, и мне нужно, чтобы функция имела дополнительные параметры (например, вы можете найти стоимость weightA
а также weightB
, но вы также можете найти все вышеперечисленное.
Основная функция выглядит так:
weightA = 1
weightB = 0.5
weightC = 0.33
weightD = 2
cost = 70
volumeA = 100
volumeB = 20
volumeC = 10
volumeD = 5
def weightingfun (cost, weightA, weightB, volumeA, volumeB):
costvolume = ((cost*(weightA+weightB))/(weightA*volumeA+weightB*volumeB))
return costvolume
Как я могу изменить функцию, чтобы я мог, например, также весовой объем C и объем D?
Спасибо вперед!
5 ответов
Это можно сделать очень просто с помощью операций над кортежами или списками:
import operator
def weightingfun(cost, weights, volumes):
return cost*sum(weights)/sum(map( operator.mul, weights, volumes))
weights = (1, 0.5, 0.33, 2)
volumes = (100, 20, 10, 5)
print weightingfun(70, weights, volumes)
Два варианта: использовать два списка:
# option a:
# make two lists same number of elements
wt_list=[1,0.5,0.33,2]
vol_list=[100,20,10,5]
cost = 70
def weightingfun (p_cost, p_lst, v_lst):
a = p_cost * sum(p_lst)
sub_wt = 0
for i in range(0,len(v_lst)):
sub_wt = sub_wt + (p_lst[i] * v_lst[i])
costvolume = a/sub_wt
return costvolume
print weightingfun (cost, wt_list, vol_list)
Второй вариант - использовать словарь
Заменить weightA
, weightB
, volumeA
, volumeB
параметры будут собирать параметры. Например:
- список весов и список томов
- список / набор (вес, объем) кортежей
- список / набор объектов с атрибутами веса и объема
Пример последнего:
def weightingfun(cost, objects):
totalWeight = sum((o.weight for o in objects))
totalWeightTimesVolume = sum(((o.weight * o.volume) for o in objects))
costvolume = (cost*totalWeight)/totalWeightTimesVolume
return costvolume
Вам лучше использовать объект со свойствами веса / объема (пост Лоуренса)
Но чтобы показать, как сжать два кортежа:
weights = (1, 0.5, 0.33, 2)
volumes = (100, 20, 10, 5)
def weightingfun(cost, weights, volumes):
for w,v in zip(weights, volumes):
print "weight={}, volume={}".format(w, v)
weightingfun(70, weights, volumes)
На самом деле есть и этот метод, в конце концов это то же самое, что и передача списка,
def weightingfun2(cost, *args):
for arg in args:
print "variable arg:", arg
if __name__ == '__main__':
weightingfun2(1,2,3,"asdfa")
Чтобы получить подробную информацию о том, что на самом деле происходит, вы можете получить здесь: http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/