Как написать функцию Python, которая добавляет все аргументы?

Я хотел бы написать функцию Python, которая добавляет все свои аргументы, используя оператор +. Количество аргументов не указано:

def my_func(*args):
    return arg1 + arg2 + arg3 + ...

Как это сделать?

С уважением


person alwbtc    schedule 17.07.2012    source источник
comment
При использовании *args тогда args представляет собой список всех переданных аргументов.   -  person Some programmer dude    schedule 17.07.2012
comment
@JoachimPileborg: кортеж, если быть точным.   -  person Sven Marnach    schedule 17.07.2012
comment
Если это продолжение Как найти список в списке списков, сумма элементов которых наибольшая?, тогда вам нужно укажите, какие входные данные будет принимать эта функция. Ваш вопрос в его нынешнем виде не принесет вам более полезных ответов, чем те, которые я уже дал вам там.   -  person Martijn Pieters    schedule 17.07.2012
comment
Но не имеет значения, какой ввод, он должен просто добавлять аргументы с помощью оператора +.   -  person alwbtc    schedule 17.07.2012
comment
Хорошо, тогда в чем проблема со встроенным в Python sum? Это именно то, что он делает.   -  person David Cain    schedule 17.07.2012
comment
Почему бы вам не сказать нам, какой вклад вы внесли и какой результат вы ожидаете? Для целых чисел сумма непобедима, но очевидно, что у вас другой ввод.   -  person Martijn Pieters    schedule 17.07.2012
comment
@alwbtc Я добавил к своему ответу еще одно решение, в котором не используется сумма, а также то, что вы хотите. Но было бы полезно, если бы вы могли сказать, что не так с sum в первую очередь.   -  person sloth    schedule 17.07.2012


Ответы (3)


Просто используйте встроенную функцию sum.

>>> def my_func(*args):
...     return sum(args)
...
>>> my_func(1,2,3,4)
10
>>>

Изменить:

Я не знаю, почему вы хотите избежать суммы, но начнем:

>>> def my_func(*args):
...   return reduce((lambda x, y: x + y), args)
...
>>> my_func(1,2,3,4)
10
>>>

Вместо lambda вы также можете использовать operator.add.


Изменить2:

Я просмотрел ваш другое questions, и кажется, что ваша проблема заключается в использовании sum в качестве параметра key для max при использовании пользовательского класса. Я ответил на ваш вопрос и предоставил способ использования вашего класса с sum в моем ответе.

person sloth    schedule 17.07.2012
comment
Но я не хочу использовать функцию sum. - person alwbtc; 17.07.2012
comment
@alwbtc - почему ты не хочешь? - person eumiro; 17.07.2012
comment
@eumiro, возможно, он хочет использовать оператор + для случаев, отличных от чисел. - person Henry Gomersall; 17.07.2012
comment
@HenryGomersall В этом случае ему следует просто добавить метод __radd__ в свой класс. - person sloth; 17.07.2012
comment
Я предполагаю, что вы могли бы уменьшить с помощью operator.add вместо (лямбда (x, y): x + y) во втором случае, правильно? (Кажется правильным.) - person Sarien; 24.07.2012
comment
@CorporalTouchy Да, правильно. Я также заметил это в своем ответе уже. - person sloth; 24.07.2012

Как насчет этого:

def my_func(*args):
    my_sum = 0
    for i in args:
        my_sum += i
    return my_sum

Если вы не хотите использовать оператор +=, то

my_sum = my_sum + i
person Some programmer dude    schedule 17.07.2012
comment
Это обобщено, чтобы сделать его отличным от sum(), заменив my_sum = 0 на my_sum = args[0], а цикл будет for i in args[1:]. Теперь это работает с любым списком объектов с разумным методом __add__. - person Henry Gomersall; 17.07.2012
comment
Вы также можете оставить метод как есть и реализовать разумный метод __radd__ в своем классе. - person sloth; 17.07.2012
comment
@BigYellowCactus Если это не собственный класс, то, вероятно, будет проще изменить функцию (например, строки). - person Henry Gomersall; 17.07.2012

Если вы точно не будете использовать sum, то что-то вроде:

def func(*args, default=None):
    from operator import add
    try:
        return reduce(add, args)
    except TypeError as e:
        return default

or functools.reduce in Py3

person Jon Clements♦    schedule 17.07.2012