Разделите каждый элемент на следующий в Python

Как я могу Разделить каждый элемент на следующий в функции деления? Я передаю произвольные аргументы в вызывающей функции. Заранее спасибо.

    def add(*number):
        numm = 0
        for num in number:
            numm =num+numm
        return numm

    def subtract(*number):
        numm = 0
        for num in number:
            numm = num-numm
        return numm

    def division(*number):
        #i am facing problem here
        # numm = 1
        # for num in number:

        try:
        if (z>=1 and z<=4):
            def get_input():
                print('Please enter numbers with a space seperation...')
                values = input()
                listOfValues = [int(x) for x in values.split()]
                return listOfValues

            val_list = get_input()

            if z==1:
                print("Addition of  numbers is:", add(*val_list))
            elif z==2:
                print("Subtraction of numbers is:", subtract(*val_list))
            elif z==3:
                print("division of numbers is:", division(*val_list))

2 ответа

Решение

Я не уверен, что я понимаю, что вы хотите, но если вы ожидаете звонить division() с параметрами 100, 3, 2 и вычислить (100 / 3) / 2 (ответ: 16.6666) затем

def division(*number):
    numm = number[0]
    for num in number[1:]:
        numm /= num
    return numm

Это не аналогично другим функциям, потому что они начинаются с numm установить на ноль. Установка в 1 будет работать для умножения, но для деления это не поможет. Вам нужно установить его на первый параметр, а затем разделить последовательно на остальные параметры.

В Python 3 вы можете изящно достичь этой цели с помощью reduce из библиотеки functools. Из документации:

Примените функцию двух аргументов кумулятивно к элементам последовательности слева направо, чтобы свести последовательность к одному значению. Например, Reduce(лямбда x, y: x+y, [1, 2, 3, 4, 5]) вычисляет ((((1+2)+3)+4)+5). Левый аргумент, x, является накопленным значением, а правый аргумент, y, является обновленным значением из последовательности. Если присутствует необязательный инициализатор, он помещается перед элементами последовательности в вычислении и служит по умолчанию, когда последовательность пуста. Если инициализатор не указан и последовательность содержит только один элемент, возвращается первый элемент.

И в качестве примера, как его можно использовать в вашем коде, чтобы он выглядел намного лучше:

from functools import reduce


def get_input():
  print('Please enter numbers with a space seperation...')
  values = input()
  listOfValues = [int(x) for x in values.split()]
  return listOfValues

def add(iterable):
  return sum(iterable, start=0)
  # or reduce(lambda x, y: x + y, iterable, 0)

def subtract(iterable):
  return reduce(lambda x, y: x - y, iterable, 0)

def division(iterable):
  return reduce(lambda x, y: x / y, iterable, 1)


if __name__ == '__main__':
  try:
    print("Operation_type: ")
    value = input()
    operation_type = int(value)
  except ValueError:
    operation_type = -1

  if (operation_type >= 1 and operation_type <= 4):
    values = get_input()

    if operation_type == 1:
      print("Addition of  numbers is: {}".format(add(values)))
    elif operation_type == 2:
      print("Subtraction of numbers is: {}".format(subtract(values)))
    elif operation_type == 3:
      print("division of numbers is: {}".format(division(values)))

  else:
    print("An invalid argument was specified: `operation_type` must be in range between 1 and 4")
Другие вопросы по тегам