L’uso di un dizionario come un’istruzione switch in Python

Sto cercando di fare una semplice calcolatrice in Python, l’uso di un dizionario. Ecco il mio codice:

def default():
    print "Incorrect input!"

def add(a, b):
    print a+b

def sub(a, b):
    print a-b

def mult(a, b):
    print a*b

def div(a, b):
    print a/b

line = raw_input("Input: ")
parts = line.split(" ")
part1 = float(parts[0])
op = parts[1];
part3 = float(parts[2])

dict = {
    '+': add(part1, part3),
    '-': sub(part1, part3),
    '*': mult(part1, part3),
    '/': div(part1, part3)
    }

try:
    dict[op]
except KeyError:
    default()

ma tutte le funzioni sono attivate. Qual è il problema?

InformationsquelleAutor user3342163 | 2014-02-23



2 Replies
  1. 13

    Definire il dizionario come coppie di forma str : function:

    my_dict = {'+' : add, 
               '-' : sub, 
               '*' : mult, 
               '/' : div}

    E quindi, se si desidera chiamare un’operazione, utilizzare my_dict[op] per ottenere una funzione, e quindi passare la chiamata con i corrispondenti parametri:

     my_dict[op] (part1, part3)
    |___________|
          |
      function (parameters)

    Nota: non usare Python integrato nomi come nomi di variabili, o potrete nascondere la sua attuazione. Utilizzare my_dict invece di dict per esempio.

    • nota: dict è non Python parole chiave: 'dict' not in keyword.kwlist. Si tratta di un builtin nome però: 'dict' in dir(__builtins__).
  2. 11

    È perché quando il dizionario è popolata, si esegue ogni operazione con gli operandi
    e alla fine, si sta chiamando dict[op] che contiene None e non fare nulla con esso.

    Quello che succede è:

    # N.B.: in case this is not clear enough, 
    #       what follows is the *BAD* code from the OP
    #       with inline explainations why this code is wrong
    
    dict = {
        # executes the function add, outputs the result and assign None to the key '+'
        '+': add(part1, part3), 
        # executes the function sub, outputs the result and assign None to the key '-'
        '-': sub(part1, part3),
        # executes the function mult, outputs the result and assign None to the key '*'
        '*': mult(part1, part3),
        # executes the function div, outputs the result and assign None to the key '/'
        '/': div(part1, part3)
        }
    
    try:
        # gets the value at the key "op" and do nothing with it
        dict[op]
    except KeyError:
        default()

    che è il motivo per cui si ottiene tutte le uscite, e non succede nulla nel vostro try blocco.

    Puoi effettivamente fare:

    dict = {
        '+': add,
        '-': sub,
        '*': mult,
        '/': div
        }
    
    try:
        dict[op](part1, part3)
    except KeyError:
        default()

    ma come @christian saggiamente suggerisce, non si dovrebbe usare python nomi come nomi di variabili, che potrebbero portare a problemi. E un altro miglioramento mi consigli todo stampa il risultato una volta, e fare le funzioni lambda:

    d = {
        '+': lambda x,y: x+y,
        '-': lambda x,y: x-y,
        '*': lambda x,y: x*y,
        '/': lambda x,y: x/y
        }
    
    try:
        print(d[op](part1, part3))
    except KeyError:
        default()

    che verrà restituito il risultato e stampa

    • N. B.: e ‘ bello per un commento su un post quando downvoting per indicare che cosa potrebbe essere sbagliato, e dare dei suggerimenti.
    • Non downvoter (perché la risposta è corretta), ma mi sa che avete preso quelle -1 perché la soluzione è quasi identico al mio. Appena aggiunto il lambda parte.
    • beh, in realtà abbiamo pubblicato la prima parte, allo stesso tempo, in modo che dovrebbe assolutamente essere un motivo 🙂
    • Non ho downvoted ma la mia ipotesi è che la tua risposta contiene “cattivo” codice senza un apposito disclaimer.
    • “bad” di codice?! come mai?
    • il primo esempio di codice, chiamate le funzioni immediatamente. Il testo, dopo i blocchi di codice indica che non si capiscono. Un grande #XXX DON'T DO IT, see the explanation below sopra il codice sarebbe di aiuto.
    • beh, non è il mio testo è abbastanza chiaro? Quello che succede è che, seguito dal codice sbagliato e quindi È possibile effettivamente fare con un codice migliore. Questo è il punto di spiegare l’OP perché quello che ha fatto è sbagliato, prima di ottenere una soluzione! Se l’OP legge i commenti all’interno del codice, che sarà lui a vedere la realtà sto spiegando, riga per riga, perché il suo codice è verificato un errore. E, infine, si può anche notare che è una copia esatta del codice con un commento all’interno. Non vedo nulla di male…

Lascia un commento