Python: Как я могу назначить строковые представления операторов математическим операторам, используя словарь?

#python #dictionary #user-defined-functions

#python #словарь #определяемые пользователем функции

Вопрос:

Моя цель — создать UDF, который выполняет простую арифметику. Я хочу, чтобы функция принимала 2 значения, а затем строковое представление оператора, например ‘mulitiply’, и выполняла оператор от x до y. Это моя первая попытка, извините за беспорядок.

 def_myArithmetic(x, y, op):
     op={'multiply': *, 'divide': /, 'add':  , 'subtract':-}
     **some loop**
         **return calculation**

 

что мне удалось до сих пор

 import operator
def do_arithmetic(x, y, op):
  op={'multiply': operator.multiply,'divide': operator.divide,'add': operator.add ,'subtract': operator.subtract}
  for i in range(x,y):
     print (x, y)
 

использование этого блока кода возвращает ошибку при вызове функции.

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

Я считаю, что я где-то рядом с правильными строками, но явно не знаю, как это написать. Было бы очень полезно иметь что-то, на что можно ссылаться, когда я пытаюсь реализовать выбранные мной правила.

Спасибо за ваш отзыв

Комментарии:

1. Используйте operator модуль. operator.add operator.mul , и т.д.

2. могу ли я попросить пример в UDF?

3. {'multiply': operator.mul, ...}

4. Ваш словарь — правильный подход, вам просто нужно использовать эти функции в качестве значений.

5. это очень полезно, спасибо, Бармар

Ответ №1:

Ваша словарная переменная заменяет op параметр. Используйте для этого другое имя.

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

Вам нужно вызвать функцию operator, а не просто поместить ее в кортеж с аргументами.

Для цикла нет причин for .

Нет operator.multiply , это operator.mul . Найдите полный список здесь.

 def do_arithmetic(x, y, op):
    operations = {
        'multiply': operator.mul,
        'divide': operator.truediv,
        'add': operator.add,
        'subtract': operator.sub
    }
    return operations[op](x, y)
 

Комментарии:

1. Это невероятно полезно, большое спасибо, Бармар !. Я только начал кодировать всего 4 дня назад. Это заставило много читать на практике.