2009-11-10 5 views
36

Leggendo attraverso Peter Norvig's Solving Every Sudoku Puzzle essay, ho incontrato alcuni idiomi Python che non avevo mai visto prima.Significato dell'uso di virgole e underscore con l'operatore di assegnazione Python?

Sono consapevole del fatto che una funzione può restituire una tupla/elenco di valori, nel qual caso è possibile assegnare più variabili per i risultati, come ad esempio

def f(): 
    return 1,2 

a, b = f() 

Ma qual è il significato di ciascuno dei a seguire?

d2, = values[s] ## values[s] is a string and at this point len(values[s]) is 1 

Se len(values[s]) == 1, allora come è questa dichiarazione diversa da d2 = values[s]?

Un'altra domanda su come utilizzare una sottolineatura nell'assegnazione qui:

_,s = min((len(values[s]), s) for s in squares if len(values[s]) > 1) 

Ha il carattere di sottolineatura hanno l'effetto di sostanza scartando il primo valore restituito nella lista?

risposta

33

d2, = values[s] è proprio come a,b=f(), tranne per il disimballaggio 1 elemento tuple.

>>> T=(1,) 
>>> a=T 
>>> a 
(1,) 
>>> b,=T 
>>> b 
1 
>>> 

a è tupla, b è un numero intero.

+2

Così 'b, = T' significa ottenere il primo elemento da quella tupla? È anche "b = T [0]"? Ho bisogno di più esempi o meno spiegazioni wordy ^^ – Sherlock70

+2

Sì, è lo stesso risultato – eduffy

15

_ è come qualsiasi altro nome di variabile ma di solito significa "Non mi interessa questa variabile".

La seconda domanda: si tratta di "value unpacking". Quando una funzione restituisce una tupla, è possibile decomprimere i suoi elementi.

>>> x=("v1", "v2") 
>>> a,b = x 
>>> print a,b 
v1 v2 
6

Il _ nella shell Python fa riferimento anche al valore dell'ultima operazione. Quindi

>>> 1 
1 
>>> _ 
1 

Le virgole fanno riferimento a tuple disimballaggio. Quello che succede è che il valore di ritorno è una tupla, e quindi è scompattato nelle variabili separate da virgole, nell'ordine degli elementi della tupla.

+1

Sì, ma nel contesto sopra riportato, è una variabile "non importa". –

5

È possibile utilizzare la virgola finale in una tupla come questo:

>>> (2,)*2 
(2, 2) 

>>> (2)*2 
4 
Problemi correlati