Функция Python со списком в качестве аргумента ИЛИ множественные значения в качестве аргумента - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу написать функцию Python my_sum, которая расширяет встроенную в Python sum следующим образом:

  • Если последовательность передается в my_sum, она ведет себя как встроенная-in sum.
  • Если несколько значений переданы в my_sum, возвращается сумма значений.

Желаемый вывод :

my_sum([1, 2, 3])  # shall return 6 (similiar to built-in sum)
my_sum(1, 2, 3)    # shall return 6 as well, (sum throws TypeError)

Что сработало, было следующим:

def my_sum(*x):
    try:
        return sum(x)  # sums multiple values
    except TypeError:
        return sum(*x)  # sums sequence of values

Является ли это питонским способом достижения желаемого поведения?Для меня код выглядит странно.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

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

Кроме того, проверка и форматирование ввода должны выполняться во внешней части кода, а не в конечной функции.В лучшем случае данные должны быть проверены перед переходом к этой функции, и у вас должна быть только функция sum для обработки готовых данных.

Это способ:

  • Сохранять простоту
  • Избегать добавления условных путей
  • Избегать защитного программирования во внутреннем коде
  • И, таким образом, избежать будущих проблем.

У меня был бы следующий код.

def argsToList(*x):
  return list(x)  

print sum([1,2,3,4])
print sum(argsToList(1,2,3,4))
# both output 10
0 голосов
/ 21 ноября 2018

Это питон.Я думаю, что требуется по крайней мере одна проверка, и у python есть философия «Просить прощения, а не разрешения» (объяснено здесь ), что в основном означает, что использование блоков try-кроме допустимо для стандартных потоков управления.

Если импорт установленной библиотеки является питоническим и что-то, что вам разрешено и вы хотите сделать, вы также можете использовать numpy.sum следующим образом:

import numpy as np
def my_sum(*x):
    return np.sum(x)

При этом определении оба

my_sum([1, 2, 3])  
my_sum(1, 2, 3) 

возврат 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...