Vous entendez souvent que Python encourage le style EAFP ("il est plus facile de demander pardon que la permission") par rapport au style LBYL ("regardez avant de sauter"). Pour moi, c'est une question d'efficacité et de lisibilité.
Dans votre exemple (disons qu'au lieu de renvoyer une liste ou une chaîne vide, la fonction devait renvoyer une liste ou None), si vous vous attendez à ce que 99% du temps resultcontienne réellement quelque chose d'itérable, j'utiliserais l' try/exceptapproche. Ce sera plus rapide si les exceptions sont vraiment exceptionnelles. Si resultc'est Noneplus de 50% du temps, l'utilisation ifest probablement meilleure.
Pour soutenir cela avec quelques mesures:
>>> import timeit
>>> timeit.timeit(setup="a=1;b=1", stmt="a/b") # no error checking
0.06379691968322732
>>> timeit.timeit(setup="a=1;b=1", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.0829463709378615
>>> timeit.timeit(setup="a=1;b=0", stmt="try:\n a/b\nexcept ZeroDivisionError:\n pass")
0.5070195056614466
>>> timeit.timeit(setup="a=1;b=1", stmt="if b!=0:\n a/b")
0.11940114974277094
>>> timeit.timeit(setup="a=1;b=0", stmt="if b!=0:\n a/b")
0.051202772912802175
Ainsi, alors qu'une ifdéclaration vous coûte toujours , il est presque gratuit de mettre en place un try/exceptblocage. Mais lorsqu'un Exceptionproblème survient réellement, le coût est beaucoup plus élevé.
Moral:
- C'est parfaitement OK (et "pythonique") à utiliser
try/exceptpour le contrôle de flux,
- mais cela a plus de sens quand les
Exceptions sont réellement exceptionnels.
À partir de la documentation Python:
EAFP
Plus facile de demander pardon que la permission. Ce style de codage Python commun suppose l'existence de clés ou d'attributs valides et intercepte les exceptions si l'hypothèse s'avère fausse. Ce style propre et rapide se caractérise par la présence d' un grand nombre
tryet exceptdéclarations. La technique contraste avec le
style LBYL commun à de nombreux autres langages tels que C.