È pythonic per una funzione restituire più valori?



3 Answers

In primo luogo, si noti che Python consente quanto segue (non c'è bisogno di parentesi):

q, r = divide(22, 7)

Per quanto riguarda la tua domanda, in entrambi i casi non esiste una regola dura e veloce. Per esempi semplici (e solitamente inventati), può sembrare che sia sempre possibile che una determinata funzione abbia un unico scopo, risultante in un singolo valore. Tuttavia, quando si utilizza Python per le applicazioni del mondo reale, si corre velocemente in molti casi in cui è necessario restituire più valori e si ottiene un codice più pulito.

Quindi, direi che qualsiasi cosa abbia senso, e non provare a conformarmi a una convenzione artificiale. Python supporta più valori di ritorno, quindi usalo quando appropriato.

Question

In python, puoi avere una funzione per restituire più valori. Ecco un esempio forzato:

def divide(x, y):
    quotient = x/y
    remainder = x % y
    return quotient, remainder  

(q, r) = divide(22, 7)

Questo sembra molto utile, ma sembra che possa anche essere abusato ("Bene ... la funzione X calcola già ciò di cui abbiamo bisogno come valore intermedio. Diamo anche a X di restituire quel valore").

Quando dovresti disegnare la linea e definire un metodo diverso?




Sì, restituire più valori (ad es. Una tupla) è sicuramente pitonico. Come altri hanno sottolineato, ci sono un sacco di esempi nella libreria standard Python, così come in progetti Python ben rispettati. Due commenti aggiuntivi:

  1. Restituire valori multipli a volte è molto, molto utile. Prendiamo, ad esempio, un metodo che opzionalmente gestisce un evento (restituendo un certo valore nel farlo) e restituisce anche il successo o il fallimento. Questo potrebbe sorgere in un modello di catena di responsabilità. In altri casi, si desidera restituire più dati, strettamente collegati, come nell'esempio fornito. In questa impostazione, restituire più valori è come restituire una singola istanza di una classe anonima con diverse variabili membro.
  2. La gestione degli argomenti del metodo da parte di Python richiede la possibilità di restituire direttamente più valori. In C ++, ad esempio, gli argomenti del metodo possono essere passati per riferimento, quindi è possibile assegnare loro valori di output, oltre al valore di ritorno formale. In Python, gli argomenti vengono passati "per riferimento" (ma nel senso di Java, non C ++). Non è possibile assegnare nuovi valori agli argomenti del metodo e farlo riflettere all'esterno dell'ambito del metodo. Per esempio:

    // C++
    void test(int& arg)
    {
        arg = 1;
    }
    
    int foo = 0;
    test(foo); // foo is now 1!
    

    Confrontare con:

    # Python
    def test(arg):
        arg = 1
    
    foo = 0
    test(foo) # foo is still 0
    



OT: L'Algol68 di RSRE ha il curioso operatore "/: =". per esempio.

INT quotient:=355, remainder;
remainder := (quotient /:= 113);

Dando un quoziente di 3 e un rimanente di 16.

Nota: tipicamente il valore di "(x /: = y)" viene scartato come quoziente "x" è assegnato per riferimento, ma nel caso di RSRE il valore restituito è il resto.

cf Integer Arithmetic - Algol68









Related