2016-05-10 2 views
1

Я работал над проектом на Python, который включает случайный выбор оператора (умножение, деление, сложение и вычитание), а затем выполнение этой операции на двух целых числах. Пока мой код будет произвольно выбирать оператор в виде символа. То, с чем я борюсь, на самом деле делает математику. Вот мой код:Как умножить переменную на символ в Python?

from random import randint 
inputA = 2 
inputB = 3 
output = 0 

desiredOutput = 5; 
#possible operations: addition, subtraction, multiplication, division 

add = "+" 
multiply = "*" 
divide = "/" 
subtract = "-" 

#choose randomely between the four 

chooser = randint(1,4) 
chosen = add 
if chooser == 1: 
    chosen = add 
if chooser == 2: 
    chosen = multiply 
if chooser == 3: 
    chosen = divide 
if chooser == 4: 
    chosen = subtract 

Теперь то, что я хочу сделать, это взять вход А и, соответственно, умножение, деление, сложение или вычитание его (с помощью «выбранного» оператор ") от входа B.

Спасибо , Avidh

+0

Просто избавитесь от кавычек, чтобы выполнить операцию, то есть 'inputA + inputB' добавит' inputA' в 'inputB'. – mwm314

ответ

2

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

import random 

my_operators = {'+' : lambda a, b: a + b, 
    '-': lambda a, b: a - b, 
    '*': lambda a, b: a * b, 
    '/': lambda a, b: a/b 
} 

actions = list(my_operators.keys()) 

chosen = random.choice(actions) 
print (my_operators[chosen] (inputA, inputB)) 

Обратите внимание, что питон имеет operator module доступен, которые вы можете использовать для достижения этой цели:

import operator 
my_operators = {'+' : operator.add, 
    '-': operator.add, 
    '*': operator.mul, 
    '/': operator.div 
} 
+0

Могу я, пожалуйста, рекомендовать использовать операторский модуль вместо лямбда? –

+1

Просто добирайся до этого :) – smac89

4

Вы можете просто выполнить операцию вместо хранения операторов в переменной. Ваше сослагательное наклонение будет выглядеть:

result = None 
if chooser == 1: 
    result = inputA + inputB 
if chooser == 2: 
    result = inputA * inputB 
if chooser == 3: 
    result = inputA/inputB 
if chooser == 4: 
    result = inputA - inputB 
print(result) 
3

Лучшим способ заключается в использовании функции вместо строк, и отобразить строку оператора к функции в словаре.

Модуль operator содержит функции, которые вам нужны: add(), sub(), mul() и div(). Вы можете настроить словарь так:

import operator 

ops = {'+': operator.add, 
     '-': operator.sub, 
     '*': operator.mul, 
     '/': operator.div} 

Для случайного выбора оператора, сделать случайный выбор из ключей словаря:

import random 

op = random.choice(ops.keys()) 
result = ops[op](inputA, inputB) 
print('{} {} {} = {}'.format(inputA, op, inputB, result) 

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

ops = [('+', operator.add), ('-', operator.sub), ...] 
op, func = random.choice(ops) 
result = func(inputA, inputB) 
print('{} {} {} = {}'.format(inputA, op, inputB, result) 
0

(Это выглядит как проблема домашних заданий, но здесь идет ...)

Одним из наиболее прямолинейным и вещий способов сделать это было бы использовать функциональный стиль программирования и пара каждую операцию с анонимной функцией (lambda), который выполняет эту функцию:

from random import choice 
inputA = 2 
inputB = 3 
output = 0 

desiredOutput = 5; 
#possible operations: addition, subtraction, multiplication, division 

ops = dict(
    add = ("+", lambda a,b: a+b), 
    multiply = ("*", lambda a,b: a*b), 
    divide = ("/", lambda a,b: a/b), 
    subtract = ("-", lambda a,b: a-b), 
) 

#choose randomly among the four operations 

symbol, function = ops[ choice(ops.keys()) ] 
output = function(inputA, inputB) 
print ("{inputA} {symbol} {inputB} = {output}".format(**locals())) 

превентивный удар: Тот, кто говорит вам, чтобы использовать exec или eval не знает Python, и если вы не понимаете, почему это плохая идея, тогда прочитайте this. (Фактически there are reasons why they're dangerous for the real experts too.)

Смежные вопросы