Effektives Python-Memo-Element 18 Verwenden Sie Positionsargumente variabler Länge, um das Erscheinungsbild sauberer zu gestalten

Es ist ein Memo-Schreiben des Buches effektive Python von O'Reilly Japan. https://www.oreilly.co.jp/books/9784873117560/ P42~44

Verwenden Sie das Sternargument (* arg), damit es ordentlich aussieht

** 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

Auf den ersten Blick ist es praktisch, aber es hat tatsächlich zwei Probleme

** 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

Effektives Python-Memo-Element 18 Verwenden Sie Positionsargumente variabler Länge, um das Erscheinungsbild sauberer zu gestalten
Effektives Python-Memo-Element 19 Geben Sie Schlüsselwortargumenten optionales Verhalten
Effektives Python-Memo Element 11 Verwenden Sie zip, um Iteratoren parallel zu verarbeiten
Effektives Python-Memo Punkt 3
Effektives Python-Hinweiselement 20 Verwenden Sie None und die Dokumentationszeichenfolge, wenn Sie dynamische Standardargumente angeben
Effektives Python-Memo Punkt 10 Aufzählung aus der Reichweite
Effektives Python-Memo Element 7 Verwenden Sie die Listeneinschlussnotation anstelle von Karte und Filter
Verwendung der C-Bibliothek in Python
Geben Sie die ausführbare Python-Datei an, die mit virtualenv verwendet werden soll
Der einfachste Weg, OpenCV mit Python zu verwenden
[Algorithmus x Python] Verwendung der Liste
Verwenden Sie das Python-Framework "cocotb", um Verilog zu testen.
Verwendung von Raspeye Relay Module Python
Ich wollte die Python-Bibliothek von MATLAB verwenden
[Python] Verwendung der Diagrammerstellungsbibliothek Altair
Geben Sie MinGW als den in Python verwendeten Compiler an
[Einführung in die Udemy Python3 + -Anwendung] 27. Verwendung des Wörterbuchs
[Einführung in die Udemy Python3 + -Anwendung] 30. Verwendung des Sets
Verwendung des in Lobe in Python erlernten Modells
[Einführung in Udemy Python3 + Application] 52. Tapple von Positionsargumenten
Ich möchte R-Datensatz mit Python verwenden
[Python] Verwendung von Matplotlib, einer Bibliothek zum Zeichnen von Diagrammen
Erleichtern Sie die Anzeige von Python-Modulausnahmen
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Effektives Python-Memo-Element 9 Betrachten Sie einen Generatorausdruck für die Notation großer Einschlüsse
Verwendung der Methode __call__ in der Python-Klasse
[Hyperledger Iroha] Hinweise zur Verwendung des Python SDK
[Python] Ich möchte die Option -h mit argparse verwenden
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
[Einführung in Udemy Python3 + Application] 50. Positionsargumente, Schlüsselwortargumente und Standardargumente
Tipps für Python-Anfänger, um das Scikit-Image-Beispiel für sich selbst zu verwenden