3366 Stimmen

Was bewirken ** (Doppelstern/Ostern) und * (Stern/Ostern) bei Parametern?

Was tun *args y **kwargs bedeuten?

def foo(x, y, *args):
def bar(x, y, **kwargs):

14 Stimmen

161 Stimmen

Diese Frage ist ein sehr beliebtes Ziel für Duplikate, aber leider wird sie oft falsch verwendet. Denken Sie daran, dass diese Frage nach folgenden Punkten fragt Funktionen mit Varargs definieren ( def func(*args) ). Für die Frage, was es in der Funktion bedeutet ruft auf. ( func(*[1,2]) ) siehe aquí . Bei einer Frage, die comment zum Entpacken von Argumentlisten siehe aquí . Für eine Frage, die fragt, was die * bedeutet in Literale ( [*[1, 2]] ) siehe aquí .

4 Stimmen

@Aran-Fey: Ich denke, ein besseres Ziel für "was bedeutet es in Funktionsaufrufen" ist Was bedeutet der Sternoperator in einem Funktionsaufruf? . Ihr Link geht nicht wirklich auf die Verwendung von ** und es ist eine viel engere Frage.

2voto

dreftymac Punkte 29452

Kontext

  • python 3.x
  • Auspacken mit **
  • Verwendung bei der String-Formatierung

Verwendung mit String-Formatierung

Zusätzlich zu den Antworten in diesem Thread gibt es ein weiteres Detail, das nirgendwo erwähnt wurde. Dies erweitert die Antwort von Brad Solomon

Auspacken mit ** ist auch bei der Verwendung von Python nützlich str.format .

Dies ähnelt in etwa dem, was man mit Python machen kann f-strings f-Zeichenkette aber mit dem zusätzlichen Aufwand, ein dict zu deklarieren, um die Variablen zu halten (f-string benötigt kein dict).

Schnelles Beispiel

  ## init vars
  ddvars = dict()
  ddcalc = dict()
  pass
  ddvars['fname']     = 'Huomer'
  ddvars['lname']     = 'Huimpson'
  ddvars['motto']     = 'I love donuts!'
  ddvars['age']       = 33
  pass
  ddcalc['ydiff']     = 5
  ddcalc['ycalc']     = ddvars['age'] + ddcalc['ydiff']
  pass
  vdemo = []

  ## ********************
  ## single unpack supported in py 2.7
  vdemo.append('''
  Hello {fname} {lname}!

  Today you are {age} years old!

  We love your motto "{motto}" and we agree with you!
  '''.format(**ddvars)) 
  pass

  ## ********************
  ## multiple unpack supported in py 3.x
  vdemo.append('''
  Hello {fname} {lname}!

  In {ydiff} years you will be {ycalc} years old!
  '''.format(**ddvars,**ddcalc)) 
  pass

  ## ********************
  print(vdemo[-1])

2voto

*args ( oder *any ) bedeutet alle Parameter

def any_param(*param):
    pass

any_param(1)
any_param(1,1)
any_param(1,1,1)
any_param(1,...)

HINWEIS : Sie können keine Parameter an *args übergeben.

def any_param(*param):
    pass

any_param() # will work correct

Die *args sind vom Typ Tupel

def any_param(*param):
    return type(param)

any_param(1) #tuple
any_param() # tuple

für den Zugriff auf Elemente nicht von * verwenden

def any(*param):
    param[0] # correct

def any(*param):
    *param[0] # incorrect

Die **kwd

**kwd oder **beliebig Dies ist ein Diktat-Typ

def func(**any):
    return type(any) # dict

def func(**any):
    return any

func(width="10",height="20") # {width="10",height="20")

0voto

Premraj Punkte 65511
  • def foo(param1, *param2): ist eine Methode, die eine beliebige Anzahl von Werten für *param2 ,
  • def bar(param1, **param2): ist eine Methode, die eine beliebige Anzahl von Werten mit Schlüsseln für *param2
  • param1 ist ein einfacher Parameter.

Zum Beispiel ist die Syntax für die Implementierung von varargs in Java wie folgt:

accessModifier methodName(datatype… arg) {
    // method body
}

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