418 Stimmen

Kann eine variable Anzahl von Argumenten an eine Funktion übergeben werden?

Ähnlich wie bei der Verwendung von varargs in C oder C++:

fn(a, b)
fn(a, b, c, d, ...)

531voto

unwind Punkte 377331

Ja. Sie können die *args als Nicht-Schlüsselwort Argument. Sie können dann eine beliebige Anzahl von Argumenten übergeben.

def manyArgs(*arg):
  print "I was called with", len(arg), "arguments:", arg

>>> manyArgs(1)
I was called with 1 arguments: (1,)
>>> manyArgs(1, 2, 3)
I was called with 3 arguments: (1, 2, 3)

Wie Sie sehen können, wird Python auspacken die Argumente als ein einziges Tupel mit allen Argumenten.

Für Schlüsselwortargumente müssen Sie diese als separates Argument akzeptieren, wie in Antwort von Skurmedel .

259voto

Skurmedel Punkte 20549

Ich füge dem Beitrag von unwinds hinzu:

Sie können auch mehrere Schlüsselwert-Args senden.

def myfunc(**kwargs):
    # kwargs is a dictionary.
    for k,v in kwargs.iteritems():
         print "%s = %s" % (k, v)

myfunc(abc=123, efh=456)
# abc = 123
# efh = 456

Und Sie können beides mischen:

def myfunc2(*args, **kwargs):
   for a in args:
       print a
   for k,v in kwargs.iteritems():
       print "%s = %s" % (k, v)

myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123

Sie müssen in dieser Reihenfolge deklariert und aufgerufen werden, d.h. die Funktionssignatur muss *args, **kwargs lauten und in dieser Reihenfolge aufgerufen werden.

28voto

calocedrus Punkte 2180

Wenn ich darf, ist der Code von Skurmedel für Python 2; um ihn an Python 3 anzupassen, ändern Sie iteritems a items und fügen Sie eine Klammer zu print . Das könnte Anfänger wie mich davor bewahren, anzustoßen: AttributeError: 'dict' object has no attribute 'iteritems' und an anderer Stelle suchen (z. B. Fehler " 'dict'-Objekt hat kein Attribut 'iteritems' " beim Versuch, die Funktion write_shp() von NetworkX zu verwenden ), warum dies geschieht.

def myfunc(**kwargs):
for k,v in kwargs.items():
   print("%s = %s" % (k, v))

myfunc(abc=123, efh=456)
# abc = 123
# efh = 456

und:

def myfunc2(*args, **kwargs):
   for a in args:
       print(a)
   for k,v in kwargs.items():
       print("%s = %s" % (k, v))

myfunc2(1, 2, 3, banan=123)
# 1
# 2
# 3
# banan = 123

14voto

Vladtn Punkte 2316

Ich schließe mich den anderen ausgezeichneten Beiträgen an.

Manchmal möchte man die Anzahl der Argumente nicht angeben und Schlüssel für sie verwenden wollen (der Compiler beschwert sich, wenn ein in einem Wörterbuch übergebenes Argument nicht in der Methode verwendet wird).

def manyArgs1(args):
  print args.a, args.b #note args.c is not used here

def manyArgs2(args):
  print args.c #note args.b and .c are not used here

class Args: pass

args = Args()
args.a = 1
args.b = 2
args.c = 3

manyArgs1(args) #outputs 1 2
manyArgs2(args) #outputs 3

Dann können Sie Dinge tun wie

myfuns = [manyArgs1, manyArgs2]
for fun in myfuns:
  fun(args)

1voto

def f(dic):
    if 'a' in dic:
        print dic['a'],
        pass
    else: print 'None',

    if 'b' in dic:
        print dic['b'],
        pass
    else: print 'None',

    if 'c' in dic:
        print dic['c'],
        pass
    else: print 'None',
    print
    pass
f({})
f({'a':20,
   'c':30})
f({'a':20,
   'c':30,
   'b':'red'})
____________

wird der obige Code Folgendes ausgeben

None None None
20 None 30
20 red 30

Dies ist so gut wie die Übergabe von variablen Argumenten mittels eines Wörterbuchs

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X