[PYTHON] Wie man lange Einschlüsse loswird

Lange Einschlüsse sind hart

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?

Generator + Kollektor

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)

Prägnanter

↑ 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

Frühere Geschichte

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

Wie man lange Einschlüsse loswird
So entfernen Sie benutzerdefinierte Serverpiktogramme in message.content
So erhalten Sie Elemente vom Typ Wörterbuch von Python 2.7
Befreien Sie sich von Pythons KeyError
schaffen es, schwere Pyls in vim-lsp loszuwerden
[Linux] [C / C ++] Zusammenfassung, wie man pid, ppid, tid bekommt
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
So erhalten Sie einen Überblick über Ihre Daten in Pandas
So erhalten Sie eine Liste mit Links von einer Seite aus Wikipedia
Langsames scp -pr loswerden
Zusammenfassung der Verwendung von pandas.DataFrame.loc
Zusammenfassung der Verwendung von pyenv-virtualenv
So erhalten Sie die Python-Version
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
Wie fange ich mit Django an?
Zusammenfassung der Verwendung von csvkit
So erhalten Sie die ID von Type2Tag NXP NTAG213 mit nfcpy
[Python] Wie man den Bruchteil einer natürlichen Zahl mit hoher Geschwindigkeit erhält
[Python] So erhalten Sie den ersten und den letzten Tag des Monats
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
So speichern Sie einen Teil eines langen Videos mit OpenCV
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Python-Technik für diejenigen, die Anfänger loswerden wollen
So entfernen Sie die "Tags müssen ein Array von Hashes sein." Fehler in Qiita API
[Python] Zusammenfassung der Verwendung von Pandas
Wie man die schöne Suppeninstanziierung beschleunigt
So erhalten Sie die Eltern-ID mit sqlalchemy
So überprüfen Sie die Version von Django
Wie bekomme ich IP bei Tornado + Nginx
So installieren Sie CatBoost [Stand Januar 2020]
Berechnen Verwenden Sie% des Befehls df
Wie bekomme ich Stacktrace in Python?
[Python2.7] Zusammenfassung der Verwendung von unittest
So erhalten Sie eine farbige Ausgabe an die Konsole
Jupyter Notebook Grundlagen der Verwendung
Grundlagen von PyTorch (1) - Verwendung von Tensor-
Zusammenfassung der Verwendung der Python-Liste
[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
Zusammenfassung des Schreibens von AWS Lambda
Entfernen Sie DICOM-Bilder in Python
[Frage] Wie verwende ich plot_surface von Python?
So berechnen Sie die Volatilität einer Marke
Verwendung von Folium (Visualisierung von Standortinformationen)
So finden Sie den Bereich des Boronoi-Diagramms
[Python] Verwendung von zwei Arten von type ()
Zusammenfassung zum Importieren von Dateien in Python 3
So erhalten Sie Ergebnisse von id in Celery
[NNabla] So erhalten Sie die Ausgabe (Variable) der mittleren Schicht des erstellten Netzwerks
[Django] So erhalten Sie Daten durch Angabe von SQL.
So erhalten Sie Hilfe in einer interaktiven Shell
Nicht viel erwähnt, wie man Pickle benutzt
Zusammenfassung der Verwendung von MNIST mit Python
[Python] Werden Sie die Datierung mit regulären Ausdrücken los
So legen Sie Attribute mit Mock of Python fest
So implementieren Sie "named_scope" von RubyOnRails mit Django
So erhalten Sie Artikeldaten mithilfe der Qiita-API
Ich möchte die Daten von League of Legends ③ erhalten
Ich möchte die Daten von League of Legends ② erhalten