J'ai vu un certain article et il m'a semblé intéressant, alors je l'ai essayé.
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'appel
print ()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'appel
print ()`.
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))]
.
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