Schreiben wir FizzBuzz mit einem Fehler: Python-Version

Einführung

Ich habe einmal einen Artikel in meinem Blog mit dem Titel FizzBuzz mit Fehlern schreiben veröffentlicht, nachdem ich Ruby geübt hatte. Es gab jedoch eine überraschende Reaktion und die folgende Geschichte wurde in Qiita geschrieben:

Ich komme ursprünglich aus Python, also habe ich den Code schnell geschrieben im Geiste von "Übrigens, ich habe Python schon lange nicht mehr geschrieben, meine Fähigkeiten werden langweilig sein, und ich bin die Person, die im Originalartikel geschrieben hat, also MOTTAINAI !!" Sah.

Da das Muster jedoch bereits in mir festgelegt wurde, dauerte es ungefähr 20 Minuten. Daher ist es möglicherweise eine gute Idee, dies zu versuchen (wenn Sie sich in Python sicher sind).

Antworte vorerst

class FizzBuzzError(Exception):
    def __init__(self, message, errors):
        self.message = message
        self.errors = errors


def fizzbuzz_function(n, message):
    def _return_fizz(i):
        try:
            1 / (i % n)
            return ''
        except ZeroDivisionError:
            raise FizzBuzzError(message, message)
    return _return_fizz


def error_message(f, *args, **kargs):
    def _f(n):
        try:
            return f(n)
        except FizzBuzzError as e:
            return e.message
    return _f


@error_message
def fizz(n):
    return fizzbuzz_function(3, "Fizz")(n)


@error_message
def buzz(n):
    return fizzbuzz_function(5, "Buzz")(n)


def fizzbuzz(n):
    return "".join([fizz(n), buzz(n)]) or n


def main():
    for i in [fizzbuzz(n + 1) for n in range(99)]:
        print(i)


if __name__ == "__main__":
    main()

Dies ist eine Python3-Spezifikation. Wenn Sie Python2 verwenden, verwenden Sie bitte import __future__ from print_function``;)

Kommentar

Ich verstehe die Spezifikationen von Pythons benutzerdefiniertem Fehler nicht ...!

Ich kann nichts sagen, weil ich nicht tief verfolgt habe, weil ich ein wenig von Python entfernt bin, aber ich frage mich, ob eine solche Implementierung in Ordnung ist. Zur Zeit verwende ich diesen StackOverflow, ohne es zu verstehen, also vielleicht Diese Implementierung kann redundant sein.

class FizzBuzzError(Exception):
    def __init__(self, message, errors):
        self.message = message
        self.errors = errors

Immerhin verwendet Python Closure

Was Python ein bisschen besser macht als Ruby, ist die Leichtigkeit, Verschlüsse zu schreiben? Ich denke ehrlich, dass es mühsam ist, Proc und Hoge in Ruby zu erstellen, und wenn Sie in Python kein () hinzufügen, gefällt mir persönlich die Spezifikation der Handhabung von Funktionsobjekten (Masakari von Rubyist willkommen ……!).

Übrigens wird fizzbuzz zu ** abstrahiert, wenn es ein Vielfaches von etwas ist, wird eine entsprechende Nachricht ausgegeben **. Wenn Sie nur diesen Teil herausnehmen und erstellen, ist es praktisch, einen Verschluss in Python zu verwenden. Als tatsächliches Verwendungsbeispiel sieht es wie folgt aus.

def fizzbuzz_function(n, message):
    def _return_fizz(i):
        try:
            1 / (i % n)
            return ''
        except ZeroDivisionError:
            raise FizzBuzzError(message, message)
    return _return_fizz


def fizz(n):
    return fizzbuzz_function(3, "Fizz")(n)

Der Nachrichtenerfassungsteil kann auch abstrahiert werden ... Es ist eine Dekoration!

Lassen Sie uns jetzt weiter überlegen. Wir wollen eine Hyper-Return von Error, wir wollen keinen Fehler.

Wenn Sie den Verschluss verstehen können, sollten Sie versuchen, einen Dekorateur zu verwenden. Für die Definition des Dekorateurs ist die folgende Erklärung von PEP 318 am einfachsten zu verstehen, daher zitiere ich sie:

@dec2
@dec1
def func(arg1, arg2, ...):
    pass

This is equivalent to:

def func(arg1, arg2, ...):
    pass
func = dec2(dec1(func))

Hier in diesem Code:

def error_message(f, *args, **kargs):
    def _f(n):
        try:
            return f(n)
        except FizzBuzzError as e:
            return e.message
    return _f

In Python ist "" "" Falsch!

Dies ist ein kontroverser Punkt, aber "" "ist in der Python-Spezifikation falsch. Mit anderen Worten, wenn die Verknüpfung der beiden Ergebnisse eine leere Zeichenfolge ist, ist sie bereits falsch. Sie müssen also nur die empfangene Nummer so zurückgeben, wie sie ist. Es scheint praktisch, weil es nur mit dem sogenannten "oder Operator" geschrieben werden kann! Ich brauche keinen ternären Operator!

def fizzbuzz(n):
    return "".join([fizz(n), buzz(n)]) or n

Zusammenfassung

Also schrieb ich diesmal über den Fehler FizzBuzz von Python basierend auf der unerwarteten Reaktion.

Da der Originalartikel jedoch als Super-Return verwendet wird, ist es meiner Meinung nach am wahrscheinlichsten, dass "Raise" in diesem Fall nicht anders ist als "Return". Als ich versuchte, die Python-Fähigkeit von "Dekorateur" und seiner Umgebung zu betonen, kam ich zu dem obigen Code.

Aufgabe

Was ist, wenn die Sprache keine Fehlerbehandlung hat?

Ich erinnere mich zum Beispiel, dass Go keine Syntax für die Fehlerbehandlung hat (ich wusste, dass "Panik" und "Wiederherstellung" vorbereitet wurden ...), aber im Fall von Haskell. Es gibt Zeiten, in denen du etwas sehen willst;)

Recommended Posts

Schreiben wir FizzBuzz mit einem Fehler: Python-Version
Schreiben wir Python mitinema4d.
FizzBuzz in Python3
Lassen Sie uns mit Python 1 einen Investitionsalgorithmus entwickeln
Überprüfen Sie die Version mit Python
Ein Ei mit Python erstellen
Fehler beim Spielen mit Python
Schreiben Sie mit Python in csv
Geben Sie die Python-Version mit virtualenv an
Lassen Sie uns Git-Cat mit Python bauen
Fehlerbehebung Python-Versionsprüfung
Schneiden Sie ein Bild mit Python aus
[Python] Mit Python in eine CSV-Datei schreiben
Lassen Sie uns eine GUI mit Python erstellen.
Schreiben Sie einen HTTP / 2-Server in Python
[Python] Lassen Sie uns kurz über die Einschlussnotation schreiben
Ich habe eine SMS mit Python gesendet
Lass uns mit Python mit Python spielen [Anfänger]
Lassen Sie uns mit Python Image Scraping durchführen
Verwalten Sie jede Python-Version mit Homebrew
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Zeichnen Sie eine Illustration mit Python + OpenCV
[Python] Mail mit Outlook senden
Lassen Sie uns die Stimme mit Python # 1 FFT analysieren
Schreiben Sie ein Batch-Skript mit Python3.5 ~
Ich erhalte eine Fehlermeldung beim Import von Pandas.
[Python] Erstellen einer Umgebung mit Anaconda [Mac]
Schreiben Sie testgetriebenen FizzBuzz-Code mit Python doctest.
Hinweise beim Erstellen einer Umgebung mit Python
Erstellen wir mit Python eine kostenlose Gruppe
Erstellen Sie schnell eine Excel-Datei mit Python #python
[Einführung in Python] Verwenden wir foreach mit Python
Lesen wir die RINEX-Datei mit Python ①
Lassen Sie uns mit Python langsam sprechen
[Python] Lassen Sie uns matplotlib mit Japanisch kompatibel machen
Schreiben Sie einen TCP-Client mit Python Twisted
[Python] Erstellen Sie schnell eine API mit Flask
Scraping von einer authentifizierten Site mit Python
Lassen Sie uns MySQL-Daten mit Python bearbeiten
Erstellen Sie eine englische Wort-App mit Python
Erstellen Sie ein Webframework mit Python! (1)
Senden Sie eine E-Mail mit Amazon SES + Python
Treten Sie einem Online-Richter mit Python 3.x bei
Machen wir einen Twitter-Bot mit Python!
Kommen wir zu Python # 0 (Umgebungskonstruktion)
Erstellen Sie ein Webframework mit Python! (2)
[Blender x Python] Beginnen wir mit Blender Python !!
Lassen Sie uns die Asset-Allokation durch das Black Ritterman-Modell erklären (mit einem Ausführungsbeispiel von Python).
Ich habe eine Fehlermeldung erhalten, als ich opencv mit Raspeye in Python3 eingefügt habe [Remedy]
Ich möchte Google Mail mit Python senden, kann dies jedoch aufgrund eines Fehlers nicht
Was tun, wenn bei der Installation von Python mit pyenv eine Fehlermeldung angezeigt wird?
Auf der Suche nach einer effizienten Möglichkeit, eine Docker-Datei mit Python mit Gedichten zu schreiben
Beim Speichern mit OpenCV ist ein Fehler aufgetreten
Python-Handspiel (Beginnen wir mit AtCoder?)
Lösen wir simultane lineare Gleichungen mit Python Sympy!