Quelle est la différence entre “tout en 1” et “while True”?
J'ai vu deux façons de créer une boucle infinie en Python:
-
while 1: do_something()
-
while True: do_something()
Quelle est la différence entre ces? Est un plus pythonic que les autres?
- peut-être une boucle infinie n'est pas pythonic ? (voir bl'alpha)
Vous devez vous connecter pour publier un commentaire.
Fondamentalement il n'a pas d'importance, telles minuties n'affecte pas vraiment de savoir si quelque chose est "pythonic" ou pas.
Si vous êtes intéressé dans la trivialité, cependant, il ya quelques différences.
La builtin type booléen n'existe pas jusqu'à Python 2.3 donc le code qui a été prévu pour fonctionner sur des versions anciennes ont tendance à utiliser le
while 1:
forme. Vous le verrez dans la bibliothèque standard, par exemple.Le Vrai et le Faux objets internes sont pas de mots réservés avant le Python 3 pourrait être attribué à, la modification de leur valeur. Cette aide avec le cas ci-dessus, car le code pourrait faire
True = 1
pour la compatibilité ascendante, mais signifie que le nomTrue
doit être recherchée dans les globals dictionnaire à chaque fois qu'il est utilisé.En raison de la restriction ci-dessus, le "bytecode" les deux versions de la compilation est différent en Python 2, car il y a une optimisation constante des entiers qu'il ne peut pas l'utiliser pour
True
. Parce que Python peut dire lors de la compilation de la1
que c'est toujours non nul, il supprime le saut conditionnel et ne prend pas en charge la constante à tous:Donc,
while True:
est un peu plus facile à lire, etwhile 1:
est un peu plus douce pour les anciennes versions de Python. Comme vous avez peu de chances d'avoir besoin pour s'exécuter sur Python 2.2 ces jours ou besoin de s'inquiéter à propos de la bytecode nombre de boucles, la première est légèrement préférable.while True:
est plus pythonic. Au moins la façon dont j'interprète la drôle de terme pythonic, votre kilométrage peut varier.True = False
, fonctionne "comme prévu", drôle 🙂True
en 3.x si vous essayez vraiment dur. Dans la version 3.0,import builtins; builtins.__dict__['True'] = 0
va le faire; en 3.3, vous avez à faire beaucoup plus de créativité, mais c'est encore possible. Si le pire arrive au pire, vous pouvez toujoursctypes
votre chemin dans l'API C (ou l'équivalent pour les autres implémentations). La chose amusante est que le compilateurLes plus pythonic façon y aura toujours d'être le plus lisible. Utilisation
while True:
Il n'a pas vraiment d'importance. Ni est dur à lire ou à comprendre, bien que personnellement j'ai toujours utiliser
while True
, qui est un peu plus explicite.Plus généralement, beaucoup de tout–rompre les boucles de gens à écrire en Python pourrait être quelque chose d'autre. Parfois je vois des gens écrire
i = 0; while True: i += 1 ...
, qui peut être remplacée parfor i in itertools.count()
et des gens qui écrivent deswhile True: foo = fun() if foo is None: break
lorsque cela peut être écritfor foo in iter(fun, None)
, ce qui nécessite l'apprentissage, mais elle est moins passe-partout et l'occasion pour des erreurs stupides.Ni.
Deux d'entre eux-je scanner le code à la recherche de la
break
, au lieu d'être en mesure de voir la condition d'arrêt là où il appartient.J'essaie d'éviter ce genre de chose dans la mesure du possible, et si c'est pas possible, que le code parle de lui-même comme ceci:
Edit: Il semble que le mot "éviter" ci-dessus n'était pas assez claire. En utilisant une boucle infinie et de partir de quelque part à l'intérieur de la boucle (à l'aide de
break
) doit généralement être évitée complètement. Parfois, ce n'est pas possible. Dans ce cas, j'aime utiliser quelque chose comme le code ci-dessus, qui, cependant, représente toujours le même concept – le code ci-dessus n'est rien de plus qu'un compromis – mais au moins, je peux vous montrer la fin de la boucle au début – tout comme je ne voudrais pas appeler une fonctiondo_something_with_args(*args)
.found_answer = True
.break
est que la condition d'arrêt ne peut pas être facilement et efficacement exprimé. Si vous signifient littéralement utiliser une variable commefound_answer
ensuite, vous devez analyser pour que, plutôt que debreak
- et, en général, vous aurez toujours besoin d'uncontinue
au lieu de labreak
pour le faire sortir de la boucle.True
,not found_answer
ounot received_quit_command
dit quelque chose pour le lecteur de code.Je pense que c'est surtout une question de style. Les deux devraient être facilement compréhensible comme une boucle infinie.
Cependant, personnellement, je préfère la deuxième option. C'est parce que ça prend juste un mental de micro-étape de moins à comprendre, surtout pour les programmeurs sans C en arrière-plan.
La première on va travailler également dans les premières versions où
True
n'est pas encore défini.Si vous avez un algorithme qui est supposé se terminer dans un temps fini, je recommanderais ce produit, qui est toujours plus sûr que
while True
:De l'OMI, la deuxième option est plus évident.
Si on pouvait se débarrasser de la
while
et écrire du code plus compact, qui pourrait être plus pythonic.Par exemple:
Je crois que la deuxième expression est plus explicite, et donc plus pythonic.
Ce n'est qu'une question de style, de programmation débutant comprendre une ou l'autre option.
Mais la deuxième option ne fonctionne que si
True
n'était pas assigné àFalse
, ce qui était possible jusqu'à ce que Python 3:La meilleure façon, c'est "tout en Vrai" avec un saut conditionnel en dehors de la boucle.