2012-05-12 9 views
21

Wenn ich eine Funktion def f(a, b, c, d) und zwei Tupel mit jeweils zwei Elementen habe, gibt es eine Möglichkeit, diese Tupel zu entpacken, so dass ich ihre Werte an die Funktion senden kann?Wie entpacke ich mehrere Tupel im Funktionsaufruf

f(*tup1, *tup2) 
+2

Ich fühlte auch, dass dies funktionieren sollte. Das Erlauben nur eines * und ** Ausdruckes, Argumente in Funktion _calls_ zu erweitern, scheint mir eine unnötige Einschränkung zu sein. Ebenso um es nur am Ende der Liste zuzulassen. Diese Einschränkung führt in der Praxis zu Tupel- und Dict-Building-Code-Cluttering um Funktionsaufrufe. – Stefan

+1

Ab [Python 3.5.0] (https://www.python.org/downloads/release/python-350/), dank [PEP-448] (http://www.python.org/dev/) peps/pep-0448 /), Ihr psuedocode ist nun gültig für Python. Siehe [meine aktualisierte Antwort] (http://stackoverflow.com/a/10564819/722121). –

Antwort

24

Ab the release of Python 3.5.0 macht PEP 448 "Additional Unpacking Generalizations" die natürliche Syntax für diesen gültigen Python:

>>> f(*tup1, *tup2) 
1 2 2 3 

In älteren Versionen von Python können Sie die Tupel zusammen verketten müssen, um ein einziges erweitert Argument zu liefern:

>>> tup1 = 1, 2 
>>> tup2 = 2, 3 
>>> def f(a, b, c, d): 
     print(a, b, c, d) 

>>> f(*tup1+tup2) 
1 2 2 3 
+0

Wenn tup1 die Länge 4 hat, wird tup2 ignoriert? Ist das das gewünschte Verhalten? – Spacedman

+2

@Spacedman Nein, 6 Werte werden gesendet, und Sie erhalten einen Fehler (oder es würde für eine Funktion funktionieren, die 6 Argumente benötigt). –

+0

Richtig, aber wenn die zwei Tups sich auf Länge vier addieren, wird es funktionieren, aber mächtig, einen subtilen Bug zu maskieren. Ich würde es immer vorziehen, explizit auszupacken. – Spacedman

-4
f(tup1[0],tup1[1],tup2[0],tup2[1]) #not good enough? 
+6

Was ist, wenn Sie die Länge der Tupel nicht kennen? Plus es ist hässlich. –

+1

Wenn die Tupel nicht die Länge 2 haben, was passiert in der anderen Lösung? Explizit ist besser als implizit? – Spacedman

+2

@ Spacedman Dies ist mühsam zu lesen und zu schreiben. –

11

Ein weiterer Ansatz chain

>>> from itertools import chain 
>>> def foo(a,b,c,d): 
     print a,b,c,d 


>>> tup1 = (1,2) 
>>> tup2 = (3,4) 
>>> foo(*chain(tup1,tup2)) 
1 2 3 4 
+1

+1. Nette Lösung, besonders wenn Sie viele Tupel haben. –

+0

@Lattyware korrekt, aber für zwei Tupel ist Ihre Lösung laut meinen Tests am schnellsten. – jamylak

Verwandte Themen