2016-09-26 4 views
2

Ich habe eine Funktion mit 4 Argumente und möchte diese 4 Argumente für etwas überprüfen. Zur Zeit mache ich es wie folgt aus:Zugriff auf alle Funktionsargumente

def function1(arg1, arg2, arg3, arg4): 
    arg1 = function2(arg1) 
    arg2 = function2(arg2) 
    arg3 = function2(arg3) 
    arg4 = function2(arg4) 

def function2(arg): 
    arg = dosomething(arg) 
    return arg 

Ich denke, das ist nicht wirklich eine nette Art und Weise ist, es zu tun, so ist meine Idee, so etwas zu tun:

def function1(arg1, arg2, arg3, arg4): 
    for arg in listOfArguments: 
     arg = function2(arg) 


def function2(arg): 
    arg = checkSomething(arg) 
    return arg 

Gibt es eine Möglichkeit in Python, um eine Liste aller an function1 übergebenen Argumente zu erhalten?

Vielen Dank für Ihre Hilfe und Ideen.

+1

Es gibt: '* args' für beliebige Argumentlisten –

Antwort

6

gefunden werden kann, da Sie eine Satz Anzahl von Argumenten haben gerade einen iterable, zum Beispiel aus ihnen erstellen, wickeln die Argumentnamen in einem Tupel-Literal:

for arg in (arg1, arg2, arg3, arg4): 
    # do stuff 

Wenn es Ihnen nichts ausmacht Ihre Funktion in der Lage ist, nur *args syntax verwenden, um mit mehr args genannt zu werden:

def function1(*args): 
    for arg in args: 
     arg = function2(arg) 

, die dann die Argumente aussetzt, mit dem die Funktion als Tupel aufgerufen wurde, die iteriert werden kann.

Wenn Sie die Ergebnisse für jeden Aufruf speichern müssen, ist es besser, die for-loop in einer list comprehension erstellen eine Liste der zurückgegebenen Werte zu erstellen. Zum Beispiel gegeben, eine Funktion, die einen Wert annimmt und fügt einfach 2 es:

def add2(arg): 
    return arg + 2 

def function1(arg1, arg2, arg3, arg4): 
    a1, a2, a3, a4 = [add2(arg) for arg in (arg1, arg2, arg3, arg4)] 
    print(a1, a2, a3, a4) 

Wir haben eine Liste Verständnis schaffen, die jeden arg und liefert es an add2 und speichert sie dann als Eintrag in einer Liste nimmt, dann wir entpacken zu a1,..,aN. Die Werte enthalten jetzt die Ergebnisse der Funktionsaufrufe:

function1(1, 2, 3, 4) 
3, 4, 5, 6 

In den bisherigen Beispielen (arg1, arg2, arg3, arg4) immer mit args ersetzt werden, wenn Sie die *args Syntax verwenden, wenn die Funktion zu definieren, werden die Ergebnisse ähnlich sein.


Als Nachtrag, wenn Sie mehr ein Fan von funktionaler Programmierung sind, könnten Sie immer map die Argumente für die Funktion und speichern Sie ein paar Zeichen :-).

def function1(*args): 
    a1, a2, a3, a4 = map(add2, args) 
    print(a1, a2, a3, a4) 

gleiches Ergebnis: Ich werde eine *args Definition von function1 diesmal hinzuzufügen.

+0

Danke für Ihre schnelle Antwort.Es gibt jetzt das Problem, dass arg = function2 (arg) einen neuen Wert für arg erzeugt, aber dieser Wert ist verloren, nachdem die for-Schleife beendet ist. Wie übergebe ich den neuen Wert von arg an meine Argumente, damit ich mit ihnen arbeiten kann, nachdem die For-Schleife beendet ist? – JBecker

+1

Ich habe meine Antwort bearbeitet, wenn Sie den zurückgegebenen Wert speichern müssen, können Sie einfach ein Listenverständnis anstelle einer 'for'-Schleife verwenden. Entpacken Sie dann die resultierende Liste in Variablen, mit denen Sie arbeiten können, d. H. 'A1, a2, a3, a4 = r' –

3

Ja, verwenden *args:

In [1]: def func(*args): 
    ...:  print(len(args), args) 
    ...:  

In [2]: func(1, 2, 3, 4) 
4 (1, 2, 3, 4) 

Weitere Informationen here.

+1

Drucken ist eine Funktion in py3 – Sevanteri

+0

@Sevanteri: behoben – sokoli

Verwandte Themen