Python Language Disimballare Iterables


Esempio

Python 3.x 3.0

In Python 3, puoi decomprimere un iterabile senza conoscere il numero esatto di elementi in esso contenuti e persino avere una variabile che tenga la fine del iterabile. Per questo, si fornisce una variabile che può raccogliere un elenco di valori. Questo viene fatto mettendo un asterisco prima del nome. Ad esempio, decomprimere un list :

first, second, *tail, last = [1, 2, 3, 4, 5]
print(first)
# Out: 1
print(second)
# Out: 2
print(tail)
# Out: [3, 4]
print(last)
# Out: 5

Nota : quando si utilizza la sintassi *variable , la variable sarà sempre un elenco, anche se il tipo originale non era un elenco. Può contenere zero o più elementi a seconda del numero di elementi nell'elenco originale.

first, second, *tail, last = [1, 2, 3, 4]
print(tail)
# Out: [3]

first, second, *tail, last = [1, 2, 3]
print(tail)
# Out: []
print(last)
# Out: 3

Allo stesso modo, scompattando un str :

begin, *tail = "Hello"
print(begin)
# Out: 'H'
print(tail)
# Out: ['e', 'l', 'l', 'o']

Esempio di disimballaggio di una date ; _ è usato in questo esempio come variabile throwaway (ci interessa solo il valore year ):

person = ('John', 'Doe', (10, 16, 2016))
*_, (*_, year_of_birth) = person
print(year_of_birth)
# Out: 2016

Vale la pena ricordare che, dal momento che * mangia un numero variabile di elementi, non è possibile avere due * s per lo stesso iterabile in un compito - non saprebbe quanti elementi vanno nel primo disimballaggio, e quanti nel secondo :

*head, *tail = [1, 2]
# Out: SyntaxError: two starred expressions in assignment
Python 3.x 3.5

Finora abbiamo discusso di disfare i compiti. * e ** sono stati estesi in Python 3.5 . Ora è possibile avere diverse operazioni di spacchettamento in un'unica espressione:

{*range(4), 4, *(5, 6, 7)}
# Out: {0, 1, 2, 3, 4, 5, 6, 7}
Python 2.x 2.0

È anche possibile decomprimere un argomento iterabile in funzione:

iterable = [1, 2, 3, 4, 5]
print(iterable)
# Out: [1, 2, 3, 4, 5]
print(*iterable)
# Out: 1 2 3 4 5
Python 3.x 3.5

La decompressione di un dizionario utilizza due stelle adiacenti ** ( PEP 448 ):

tail = {'y': 2, 'z': 3}
{'x': 1, **tail}
 # Out: {'x': 1, 'y': 2, 'z': 3}

Ciò consente sia la sovrascrittura dei vecchi valori sia la fusione dei dizionari.

dict1 = {'x': 1, 'y': 1}
dict2 = {'y': 2, 'z': 3}
{**dict1, **dict2}
# Out: {'x': 1, 'y': 2, 'z': 3}
Python 3.x 3.0

Python 3 ha rimosso la disimballaggio tuple nelle funzioni. Quindi quanto segue non funziona in Python 3

# Works in Python 2, but syntax error in Python 3:
map(lambda (x, y): x + y, zip(range(5), range(5)))
# Same is true for non-lambdas:
def example((x, y)):
    pass

# Works in both Python 2 and Python 3:
map(lambda x: x[0] + x[1], zip(range(5), range(5)))
# And non-lambdas, too:
def working_example(x_y):
    x, y = x_y
    pass

Vedi PEP 3113 per informazioni dettagliate.