Es ist ein Memo-Schreiben des Buches effektive Python von O'Reilly Japan. https://www.oreilly.co.jp/books/9784873117560/ P42~44
** Betrachten Sie eine Funktion, die ein Protokoll mit Debug-Informationen speichert **
def log(massage, values):
if not values:
print(massage)
else:
values_str = ', '.join(str(x) for x in values)
print('%s: %s' % (massage, values_str))
log('My numbers are', [1, 2])
log('Hi there', [])
>>>
My numbers are: 1, 2
Hi there
In diesem Fall sollte der Parameter log function eine Liste erhalten, wenn Zahlen vorhanden sind, aber eine leere Liste sollte angegeben werden, auch wenn keine Zahlen vorhanden sind. Ich möchte diesen Ärger sparen, und wenn es keine Nummer gibt, möchte ich kein Argument vorbringen
Daher führen wir ein Argument variabler Länge mit dem Namen ** star argument ** mit dem Operator `*`
vor dem Argument ein.
def log2(massage, *values):
if not values:
print(massage)
else:
values_str = ', '.join(str(x) for x in values)
print('%s: %s' % (massage, values_str))
log2('My numbers are', [1, 2])
log2('Hi there') #Keine Eingabe für das zweite Argument
>>>
My numbers are: [1, 2]
Hi there
Durch Setzen des Sternarguments auf das Argument werden alle Eingaben verarbeitet und als nicht vorhanden betrachtet. (Wenn Sie es nicht zu einem Sternargument machen, stimmt es nicht mit der Anzahl der Parameter der Funktion überein und verursacht einen TypeError.)
Wenn Sie bereits eine Liste haben, können Sie den Operator `*`
zur Liste hinzufügen und ihn den Funktionsparametern zuweisen.
favorites = [7, 33, 99]
massage = 'Favorite colors'
log2(massage, *favorites)
>>>
Favorite colors: 7, 33, 99
** 1. Argumente variabler Länge werden in Taples konvertiert, bevor sie an die Funktion übergeben werden ** Wenn der Aufrufer der Funktion ein Generator ist, durchläuft er alle Tapples und kann einen Speicherabsturz verursachen (insbesondere wenn viele Daten vorhanden sind).
def my_generator():
for i in range(10):
yield i
def my_func(*args): #Hier werden die Argumente in Tupel konvertiert
print(args)
it = my_generator() #Generator wird generiert
my_func(*it) #Der in Taple umgerechnete Generator wird ausgegeben
>>>
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
Es ist wünschenswert, dass die Anzahl der von der Funktion my_func akzeptierten Argumentlisten gering ist.
** 2. Wenn die Position des Arguments mit variabler Länge und die Position des Arguments zum Zeitpunkt des Aufrufs abweichen, wird die Ausgabe beschädigt **
def log3(sequence, message, *values):
if not values:
print('%s: %s' %(sequence, massage))
else:
value_set = ', '.join(str(x) for x in values)
print('%s: %s: %s' % (sequence, massage, value_set))
log3(1, 'Favorotes', 7, 33)
log3('Favorites', 7, 33)
>>>
1: Favorotes: 7, 33
Favorites: 7: 33
In diesem Fall werden in der ersten Ausgabe 7 und 33 korrekt verarbeitet, da das dritte und die nachfolgenden Argumente dem Argument log x3 mit variabler Länge entsprechen. Andererseits wird in der zweiten Ausgabe 7 als Parameter für die Massage verwendet. In diesem Fall tritt keine Ausnahme auf, die möglicherweise unbemerkt bleibt. Um dies zu beseitigen, müssen Sie auf die Position des Eingabearguments und die Parameter der Funktion achten.
Recommended Posts