[PYTHON] Fizzbuzz avec gestion des exceptions

J'ai vu un certain article et il m'a semblé intéressant, alors je l'ai essayé.

La partie spéciale de la transition d'exception est-elle la poursuite du traitement? Où vous pouvez sauter la partie

Personnellement, la partie spéciale de la transition dans l'exception est la poursuite du traitement? Je pense que c'est pour jeter la partie de et sauter à l'endroit sauf.

Plus précisément, cela ressemble à ce qui suit.

try:
    print(object() + 1)
except TypeError:
    print("hai")

# hai

Continuation vers ʻobject () + 1en traitement normal? Je ne peux pas sauter l'appelprint ()qui est. Une exception est levée si une erreur se produit. S'il existe une partie try-except pour gérer l'exception, interceptez l'exception levée à cet endroit. Puisqu'il est responsable du mécanisme, il est possible de sauter l'appelprint ()`.

Même si l'occurrence d'exception est considérée comme la condition de fin

En outre, il ne s'agit pas de StopIteration de l'objet itérable, mais il s'arrête lorsqu'une exception se produit. Il semble qu'il puisse être utilisé comme condition de fin de boucle en faisant une telle spécification.

Heureusement, le fizzbuzz normal est de "1 à 100". De plus, si 100 est utilisé comme chaîne de caractères et que sa longueur est prise, len (" 100 ") vaut 3, donc une exception doit être levée au début du troisième chiffre. Vous pouvez le faire en créant une liste (xs) de longueur 3 et en le faisant avec xs [len (str (i))].

Voilà pourquoi

J'ai pensé qu'il valait mieux l'écrire avec quelques restrictions, mais je ne pouvais penser à rien de particulièrement bon. C'est inutilement récursif au lieu de boucler.

import sys

xs = ["fizz", "", ""]


def g(i, x, out):
    try:
        return out((i % 5) or "buzz")
    except TypeError:
        try:
            x = xs[i % 3] or (i % 5) / (i % 5) and i
            return out(i, int(x), out)
        except ValueError:
            try:
                x += g(i, x, lambda y: y)
            except TypeError:
                pass
        except ZeroDivisionError:
            x = "buzz"
        out(i, x, out)


try:
    g(1, None, lambda i, x, out: xs[len(str(i))][g(i + 1, sys.stdout.write("{}\n".format(x)), out)])
except IndexError:
    pass

Après cela, il semble normal de faire du fizzbuzz à partir du message d'erreur de gestion des exceptions, mais je l'ai arrêté.

Recommended Posts

Fizzbuzz avec gestion des exceptions
Gestion des exceptions
FizzBuzz en Python3
Gestion des exceptions Python
Gestion des exceptions Python
Manipuler yaml avec python
Python, à propos de la gestion des exceptions
Gestion des exceptions Python (mémo d'apprentissage Python ⑥)
Apprenez avec FizzBuzz Iterator, Generator, Decorator
Gestion des exceptions lors de la communication de l'API Python
Lancer intentionnellement une exception avec augmentation
Afficher la trace de la pile avec une exception python
Gestion des expressions régulières par PHP / Python
[Introduction à l'application Udemy Python3 +] 65. Gestion des exceptions
[Introduction à cx_Oracle] (12e) Gestion des exceptions DB
Un chercheur d'une société pharmaceutique a résumé la gestion des exceptions de Python
Gestion des exceptions Python un peu plus pratique
Importation de modules et gestion des exceptions en python
Je viens de faire FizzBuzz avec AWS Lambda