Произведение аргументов, расположенных между минимальным и максимальным аргументами
Условие задачи: Напишите функцию, принимающую произвольное количество аргументов, и возвращающую произведение аргументов, расположенных между минимальным и максимальным аргументами. Если функции передается пустой список аргументов, то она должна возвращать значение None. В процессе решения не использовать преобразования конструкции *args в список или иную структуру данных.
def min_max(*args):
composition = 1
max_arg = args[0]
max_ind = 0
min_arg = args[0]
min_ind = 0
# Проходит по списку и вычисляет max и min
for i, item in enumerate(args):
if item > max_arg:
max_arg = item
max_ind = i
if item < min_arg:
min_arg = item
min_ind = i
for i in args[min_ind:max_ind]:
composition *= i
return composition
if __name__ == '__main__':
arg = list(map(float, input('Введите список аргументов: ').split()))
print("Произведение аргументов, расположенных"
" между минимальным и максимальным аргументами: ",
min_max(*arg))
Проблема: если попытаться вывести пустой список, выдает ошибку IndexError, подскажите как можно решить и в чем ошибка?
Ответы (3 шт):
все потому что вы сразу лезете в args[0], которого не существует
используйте проверку вначале на пустые параметры:
def min_max(*args):
if args == ():
return None
или
def min_max(*args):
if len(args) == 0:
return None
Идиоматичная проверка на пустой кортеж, список и т.п. в питоне выглядит так:
def min_max(*args):
if not args:
return None
Здесь используется тот факт, что приведение пустой коллекции к булевому типу даёт False.
Проверять на нулевую длину или совпадение с пустым кортежем тоже можно, но это выглядит не так красиво и понятно, на мой взгляд.