2016-01-28 2 views
1

Я изучаю python. Как я могу изменить эту функцию в python, чтобы она добавляла любое количество целых чисел, списков или списков и чисел? Сейчас это добавляет только целые числаФункция Python, которая суммирует списки и номера

def super_sum(*args): 
    ''' Sums up the arguments 
    ''' 
    total = 0 
    for i in args: 
     total += i 
    return total 

Я хочу, чтобы иметь возможность быть в состоянии вызвать функцию и получить значения, как показано ниже

print super_sum(20, 20) # outputs 40 

или

a = [10, 20, 30, 40] 
b = [100, 20] 
print super_sum(a, b) # outputs 220 

или

a = [10, 30, 50] 
print super_sum(a, 50) # outputs 140 

ответ

2

Простой подход ch будет рекурсией:

def super_sum(*args): 
    ''' Sums up the arguments 
    ''' 
    total = 0 
    for i in args: 
     if isinstance(i, (int, long)): # On Py3, just isinstance(i, int) 
      total += i 
     else: 
      total += super_sum(*i) 
    return total 

Есть другие способы выполнения теста, например, EAFP pattern избежать явной проверки типа:

for i in args: 
     try: 
      # Assume unpackable iterable... 
      total += super_sum(*i) 
     except TypeError: 
      # If not iterable, assume numeric 
      total += i 
2

Define вспомогательную функцию:

def try_sum(x): 
    try: 
     return sum(x) 
    except TypeError: 
     return x 

Сейчас super_sum() всего:

def super_sum(*args): 
    return sum(try_sum(x) for x in args) 

(Если вы хотите, чтобы написать свой собственный sum(), который использует a for, вместо использования встроенного, не стесняйтесь делать это тоже. Он будет подключаться прямо.)

0
def super_sum(*args): 
    total = 0 
    args = list(args) 
    if len(args) == 1: 
     args = args[0] 
    for d in args: 

     if isinstance(d, list): 

      total += super_sum(d) 
     else: 
      total += d 
    return total 

print super_sum([1, 2, [3, 4], 5], 3, [2, 3]) 

На самом деле это немного больше, чем вы просили, он будет добавлять все числа, а переданные значения могут иметь список внутри списков. обычно называется deep_sum.

Смежные вопросы