In Python werden Sammlungen im Allgemeinen unter Einbeziehung generiert (glaube ich).
Wenn es jedoch etwas kompliziert wird, ist die Einschlussnotation schwer zu lesen.
#Fügen Sie zwangsweise die Fizz Buzz-Liste hinzu
fb = ["Fizz Buzz" if i % 15 == 0
else "Fizz" if i % 3 == 0
else "Buzz" if i % 5 == 0
else i
for i in range(30)]
In diesem Fall ist das Lesen durch Schreiben einer for-Anweisung einfacher.
Der Schreibstil, kleine Änderungen vorzunehmen, während das Objekt vor der Initialisierung belichtet wird, ist jedoch etwas schuldig (wenn die funktionale Präferenz stark ist).
fb = []
for i in range(30):
if i % 15 == 0:
fb.append("Fizz Buzz")
elif i % 3 == 0:
fb.append("Fizz")
elif i % 5 == 0:
fb.append("Buzz")
else:
fb.append(i)
was ist zu tun?
Es ist möglich, einen Generator mit Ertrag zu definieren und darauf basierend eine Sammlung zu erstellen.
def _fb():
for i in range(30):
if i % 15 == 0:
yield "Fizz Buzz"
elif i % 3 == 0:
yield "Fizz"
elif i % 5 == 0:
yield "Buzz"
else:
yield i
fb = list(_fb)
↑ ist nicht schlecht, aber nach dem Definieren des Generators ist die Zuordnung zu einer Variablen über die Listenfunktion kompliziert.
Wenn Sie vergessen, eine Liste zu erstellen und den Iterator direkt als Variable zu erhalten, kann dies eine Brutstätte für Fehler sein.
Ich möchte, dass die Definition unter Verwendung von Yield so definiert wird, wie sie ist.
Dies kann mit einem Dekorateur erreicht werden.
def comprehension(collector):
def ret(func):
return collector(func())
return ret
#Die Liste wird der Variablen "fb" zugewiesen, indem Folgendes ausgeführt wird.
@comprehension(list)
def fb():
for i in range(30):
if i % 15 == 0:
yield "Fizz Buzz"
elif i % 3 == 0:
yield "Fizz"
elif i % 5 == 0:
yield "Buzz"
else:
yield i
Das erste Ausgangsmaterial ist der Dekorateur namens Sammeln in der Bibliothek funcy. Verwandeln Sie die Generatorfunktion in eine Funktion, die eine Liste zurückgibt. Damit kann Fizz Buzz geschrieben werden als:
from funcy import collecting
@collecting
def _fb():
for i in range(30):
if i % 15 == 0:
yield "Fizz Buzz"
elif i % 3 == 0:
yield "Fizz"
elif i % 5 == 0:
yield "Buzz"
else:
yield i
fb = _fb()
Es ist jedoch schwierig, die Funktion einmal zu definieren.
[Für / Liste] von Racket (https://docs.racket-lang.org/reference/for.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for%2Flist% Ich dachte, wenn ich so etwas wie 29% schreiben könnte 29), habe ich eine Lösung gefunden, die keine Funktion im Dekorator zurückgibt.
Recommended Posts