2016-05-10 6 views
1

Ich arbeitete an einem Projekt in Python, bei dem ein Operator (Multiplikation, Division, Addition und Subtraktion) nach dem Zufallsprinzip ausgewählt und dann an zwei Ganzzahlen ausgeführt wurde. Bis jetzt wird mein Code zufällig den Operator in Form eines Chars auswählen. Worum ich mich bemühe, ist eigentlich Mathe. Hier ist mein Code:Wie multipliziere ich eine Variable in Python mit einem Zeichen?

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 

Nun, was ich tun möchte, Eingang A nehmen und jeweils multiplizieren, dividieren, addieren oder subtrahieren es (mit dem „auserwählten“ Operator ") von Eingang B.

Dank , Avidh

+0

Entfernen Sie einfach die Anführungszeichen, um die Operation auszuführen, d. H. 'InputA + inputB' fügt' inputA' zu 'inputB' hinzu. – mwm314

Antwort

2

ein Wörterbuch mit Lambda-Funktionen

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)) 

Hinweis verwenden Sie, dass python die operator module zur Verfügung hat, die Sie dies zu erreichen, verwenden können:

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

kann ich bitte das Bedienmodul anstelle von lambdas empfehlen? –

+1

Nur zu dem :) – smac89

4

Sie könnten einfach die Operation ausführen, anstatt die Operatoren in einer Variablen zu speichern. Ihre ifs würde dann wie folgt aussehen:

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

Eine bessere Möglichkeit, Funktionen zu verwenden, anstatt von Strings ist, und ordnen Sie den Operator-String an die Funktion in einem Wörterbuch.

Modul operator enthält die Funktionen, die Sie benötigen: add(), sub(), mul() und div(). Sie können ein Wörterbuch wie folgt aufgebaut:

import operator 

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

zufällig Um einen Operator auswählen, wird eine zufällige Auswahl aus dem Wörterbuch der Schlüssel machen:

import random 

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

Alternativ können Sie eine Liste von Tupeln verwenden:

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

(Dies sieht aus wie ein Hausaufgaben Problem, aber hier geht ...)

einer der mehr unkompliziert und Pythonic Möglichkeiten, um einen funktionalen Programmierstil zu verwenden, und jede Operation mit einer anonymen Funktion (lambda) paaren dies zu tun wären, dass diese Funktion ausführt:

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())) 

Vorkaufsschlag: Wer Dich exec zu verwenden, sagt oder eval kennt Python nicht, und wenn Sie nicht verstehen, warum es eine schlechte Idee ist, dann lesen Sie this. (Eigentlich there are reasons why they're dangerous for the real experts too.)

Verwandte Themen