Espandere le tuple in argomenti


411

C'è un modo per espandere una tupla Python in una funzione - come parametri effettivi?

Ad esempio, qui expand()fa la magia:

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

So che si potrebbe definire myfuncome myfun((a, b, c)), ma ovviamente potrebbe esserci un codice legacy. Grazie

Risposte:


734

myfun(*some_tuple)fa esattamente quello che richiedi. L' *operatore decomprime semplicemente la tupla (o qualsiasi iterabile) e le passa come argomenti posizionali alla funzione. Ulteriori informazioni sulla decompressione degli argomenti .


8
L'operatore * decomprime semplicemente la tupla e le passa come argomenti posizionali alla funzione. Vedi di più qui: docs.python.org/3/tutorial/…
john_mc

4
Si noti che la stessa sintassi può essere utilizzata per elenchi e tuple.
brendon-ai,

Ho scoperto che puoi fare lo stesso con gli elenchi (in effetti, qualsiasi iterabile, comprese le stringhe), non sono sicuro di come la loro mutabilità influisca sulle cose. Sarebbe interessante da esaminare.
wcyn,

52

Nota che puoi anche espandere parte dell'elenco degli argomenti:

myfun(1, *("foo", "bar"))

13
Sembra che puoi farlo solo se la tupla espansa segue gli argomenti normalmente forniti - all'interprete non piace quando lo faccio:some_func(*tuple_of_stuff, another_argument)
Tom Galvin

6
@Quackmatic Avere la tupla espansa in qualsiasi posizione sembra funzionare bene in Python 3.5.1
River

1
@Quackmatic seconding @River, funziona perfettamente in Python 3.5.4: def func(a,b,c,d): print(a,b,c,d)conargs = ('fee', 'fi', 'fo'); func(*args, 'fum')
R. Navega,

15

Dai un'occhiata alla sezione tutorial di Python 4.7.3 e 4.7.4. Parla del passaggio delle tuple come argomenti.

Vorrei anche considerare l'utilizzo di parametri denominati (e il passaggio di un dizionario) invece di utilizzare una tupla e passare una sequenza. Trovo che l'uso degli argomenti posizionali sia una cattiva pratica quando le posizioni non sono intuitive o ci sono più parametri.


8

Questo è il metodo di programmazione funzionale. Solleva la funzione di espansione tupla dallo zucchero sintattico:

apply_tuple = lambda f, t: f(*t)

Esempio di utilizzo:

from toolz import * 
from operator import add, eq

apply_tuple = curry(apply_tuple)

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

La ridefinizione del curryapply_tuple consente di risparmiare molte partialchiamate a lungo termine.


5
Questo non è utile per un principiante. Utilizza moduli di terze parti e fa altre cose confuse ...
Gberger,

gberger, lambda f, t: f(*t)non usa moduli di terze parti e io sono un principiante di Python e questo mi è utile. Questo è un approccio funzionale puro. Se non usi questo stile, questa risposta non fa per te.
Dominykas Mostauskis,

1
toolz è di terze parti, è quello che intendevo
gberger

5
Non tutte le risposte devono essere per un principiante
Giordania,

1
Per l'esempio che hai fornito, puoi usare starmap docs.python.org/3.7/library/itertools.html#itertools.starmap
Bo.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.