Произведение аргументов, расположенных между минимальным и максимальным аргументами

Условие задачи: Напишите функцию, принимающую произвольное количество аргументов, и возвращающую произведение аргументов, расположенных между минимальным и максимальным аргументами. Если функции передается пустой список аргументов, то она должна возвращать значение 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 шт):

Автор решения: Zhihar

все потому что вы сразу лезете в args[0], которого не существует

используйте проверку вначале на пустые параметры:

def min_max(*args):
    if args == ():
          return None

или

def min_max(*args):
    if len(args) == 0:
          return None
→ Ссылка
Автор решения: Эникейщик

Добавить в начало функции

if len(args) == 0:
    return None
→ Ссылка
Автор решения: CrazyElf

Идиоматичная проверка на пустой кортеж, список и т.п. в питоне выглядит так:

def min_max(*args):
    if not args:
        return None

Здесь используется тот факт, что приведение пустой коллекции к булевому типу даёт False.

Проверять на нулевую длину или совпадение с пустым кортежем тоже можно, но это выглядит не так красиво и понятно, на мой взгляд.

→ Ссылка