1
votes

Est-il possible d'utiliser "while something" au lieu de "while True" dans ce morceau de code?

J'ai lu sur quelques pages en ligne qu'utiliser "while True" et casser manuellement la boucle while avec "break" est une mauvaise pratique. Dans ce cas particulier, j'aimerais ne pas utiliser "while True" et je me demande si c'est possible.

while x is not float:
    x = input()
    try:
        x = float(x)
    except ValueError:
        continue

J'ai essayé de faire ceci:

while True:
    x = input()
    try:
        x = float(x)
        break
    except ValueError:
        continue


2 commentaires

Vous pouvez remplacer x n'est pas float par not isinstance (x, float) .


Le problème avec la deuxième partie est que si x était un flottant, vous n'auriez pas besoin d'essayer de le taper cast.


3 Réponses :


1
votes

Vous pouvez utiliser isinstance pour vérifier si x est une instance de float ou non, selon la suggestion de @Enzo

#Define x as None here
x = None

#Run loop until you find x which is a float
while not isinstance(x, float):
    x = input()
    try:
        #If x can be cast to a float, the loop will break
        x = float(x)
    except ValueError:
        continue


0 commentaires

1
votes

Si c'est la boucle entière, il n'y a pas beaucoup de problème avec l'utilisation de break . La principale raison pour laquelle vous devriez essayer d'éviter break est qu'elle peut créer des boucles plus grandes ou des boucles avec plus de branches ( if , etc.) à l'intérieur difficiles à suivre.

Je ne pense pas que Python ait un moyen très simple de faire cela, donc une simple boucle avec break fonctionne bien. La solution suggérée dans les autres réponses (en utilisant une valeur d'espace réservé pour x ) fonctionne également, mais je la trouve personnellement moins lisible.


0 commentaires

1
votes

De PEP 315 , nous avons cette déclaration:

Les utilisateurs du langage sont invités à utiliser la forme while-True avec un if-break interne lorsqu'une boucle do-while aurait été appropriée.

Cette déclaration fait référence à cette partie du PEP 315 a>:

Les efforts ultérieurs pour relancer le PEP en avril 2009 n'ont pas été couronnés de succès car aucune syntaxe n'a émergé qui pourrait rivaliser avec la forme suivante:

while True:
    <setup code>
    if not <condition>:
        break
    <loop body>

Vous ne citez pas les sources qui prétendent qu'il s'agit d'une "mauvaise pratique", mais ces extraits de PEP 315 les contredit.


0 commentaires