Que signifie «while True» en Python?

91
def play_game(word_list):
    hand = deal_hand(HAND_SIZE) # random init
    while True:
        cmd = raw_input('Enter n to deal a new hand, r to replay the last hand, or e to end game: ')
        if cmd == 'n':
            hand = deal_hand(HAND_SIZE)
            play_hand(hand.copy(), word_list)
            print
        elif cmd == 'r':
            play_hand(hand.copy(), word_list)
            print
        elif cmd == 'e':
            break
        else:
            print "Invalid command."

Alors que QUOI est vrai?

Je pense que dire «tant que vrai» est un raccourci, mais pour quoi faire? Pendant que la variable «main» reçoit une valeur? Et si la variable «main» ne reçoit pas de valeur?

Baba
la source
1
La vérité est une sorte d'alias pour 1. Une sorte de question connexe que j'ai posée peut être trouvée ici stackoverflow.com/questions/885908/...
Copas
17
@Copas, Truen'est pas un alias pour 1. Bien que dans de nombreuses langues 1évalue la vérité dans un contexte booléen.
adamse le
2
adamse: Dans certaines versions de Python, Truea été un alias pour 1, non? Bien que oui, dans les dernières versions de Python, il existe un vrai type booléen.
Ken
1
@adamse, @Ken: citant les nouveautés de Python 2.3 - PEP 285 : "Un type booléen a été ajouté à Python 2.3. Deux nouvelles constantes ont été ajoutées au __builtin__module, True et False. (Les constantes True et False ont été ajoutées à la construction -ins dans Python 2.2.1, mais les versions 2.2.1 sont simplement définies sur des valeurs entières de 1 et 0 et ne sont pas d'un type différent.) ".
Cristian Ciupitu
@adamse En python, ce n'est pas le cas, mais c'est le cas dans de nombreux langages. J'ai considéré que c'était une question plus générale. Parler à un débutant comme Baba a dit qu'il / elle était "True est une sorte d'alias pour 1" est parfaitement exact. Je suis d'accord en Python True n'est pas un alias pour 1. Je ne l'ai pas dit.
Copas du

Réponses:

108

while Truesignifie boucle pour toujours. L' whileinstruction prend une expression et exécute le corps de la boucle tandis que l'expression prend la valeur (booléen) "true". Trueévalue toujours la valeur booléenne «true» et exécute ainsi indéfiniment le corps de la boucle. C'est un idiome auquel vous vous habituerez finalement! La plupart des langues que vous êtes susceptible de rencontrer ont des idiomes équivalents.

Notez que la plupart des langages ont généralement un mécanisme pour sortir prématurément de la boucle. Dans le cas de Python, c'est la breakdéclaration dans le cmd == 'e'cas de l'exemple dans votre question.

Richard Cook
la source
9
Par souci de clarté, je crois que vous pouvez faire while (true == true) dans la plupart des langues. Cela peut aider un nouveau programmeur à mieux comprendre la logique derrière cela.
Chris
9
Chris, while True==Trueest moche. C'est aussi moche que while 'apples'!='oranges':)
dheerosaur
34
Comme l'a fait remarquer l'un de mes professeurs: si vous pensez que true==truec'est une amélioration, où vous arrêtez-vous? Ce ne serait pas (true==true)==trueencore mieux?
Ken
10
@Chris, finalement, il faut savoir qu'une valeur ou une variable booléenne peut être utilisée à la place d'une expression logique, et "éventuellement" devrait l'être dès que possible.
Mark Ransom
6
@Mark finalement, il faut être conscient qu'il faut parfois un peu d'aide supplémentaire pour qu'un nouveau programmeur comprenne la logique booléenne et autres. Tout ce que j'essayais de faire, c'était de l'aider à comprendre.
Chris
53

ma question: alors que ce qui est vrai?

Tant que Truec'est True.

La boucle while s'exécutera tant que l'expression conditionnelle sera évaluée True.

Puisque Truetoujours évalué à True, la boucle s'exécutera indéfiniment, jusqu'à ce que quelque chose dans la boucle returns ou breaks.

Dagg Nabbit
la source
4
C'est python. Il n'y a pas d'expression entre parenthèses; P
Mike Axiak
heh, bon point. Je n'ai pas l'habitude de penser en Python. Bien que je suppose que vous pourriez mettre des parens autour si vous le vouliez ...
Dagg Nabbit
10

ma question: alors que ce qui est vrai?

Tout ce qui se trouve à l'intérieur du () de l'instruction while va être évalué comme un booléen. Cela signifie qu'il est converti en vrai ou faux.

Considérez dans la déclaration while(6 > 5)

Il évalue d'abord l'expression 6 > 5qui est trueainsi équivaut à direwhile(true)

Tout ce qui n'est pas FALSE, 0, une chaîne vide "", null ou undefined est susceptible d'être évalué comme vrai.

Quand j'ai commencé à programmer, j'avais l'habitude de faire des choses comme if(foo == true), je ne savais pas que c'était pratiquement la même chose que if(foo).

Alors quand tu dis c'est while(true)comme direwhile(true == true)

Donc, pour répondre à votre question: alors que VRAI est Vrai.

JD Isaacks
la source
10

tandis que Truec'est vrai - c'est-à-dire toujours. C'est une boucle infinie

Notez la distinction importante ici entre Truelequel est un mot-clé dans la langue indiquant une valeur constante d'un type particulier, et «vrai» qui est un concept mathématique.

Chris Dodd
la source
Techniquement parlant, vous vous trompez. La construction signifie "alors que vrai n'est pas faux". Vous pouvez voir la distinction si vous écrivez while(5)en C, où il n'y a pas de booléen approprié. Cela ne veut pas dire while(5==1), cela signifie while(5!=0).
Blindy
2
Je pense qu'il est plus approprié de dire «boucle indéfinie»; l'hypothèse doit être que la boucle sera interrompue par une rupture ou un retour à un moment donné. Les boucles vraiment «infinies» sont des erreurs de programmeur; Les «boucles indéfinies» sont créées par conception.
Dagg Nabbit
3
@Blindy: dans un langage faiblement typé avec casting automatique, on peut dire que x 'évalue à' y ... ce n'est pas tant que 5 n'est pas strictement égal à 0, c'est alors que 5 est vaguement égal à True.
Dagg Nabbit
@Blindy, while(5)en C signifie while 5est vrai, pas tant que c'est trueou 0, qui est quelque chose de complètement différent. 5est toujours vrai. En général, lorsque les langues ont un mot-clé true, c'est une constante qui est vraie, mais pas la seule constante qui est vraie. De même, ce falsen'est pas nécessairement la seule valeur qui soit fausse.
Chris Dodd
4

Dans ce contexte, je suppose que cela pourrait être interprété comme

do
...
while cmd  != 'e' 
Paul Boucher
la source
3

Trueest toujours True, donc while Trueboucle pour toujours.

Le whilemot clé prend une expression et effectue une boucle tant que l'expression est vraie. Trueest une expression qui est toujours vraie.

À titre d'exemple éventuellement clarifiant, considérons ce qui suit:

a = 1
result = a == 1

Ici, a == 1reviendra True, et donc mis Trueen result. Par conséquent,

a = 1
while a == 1:
  ...

est équivalent à:

while True:
  ...

à condition de ne pas modifier la valeur de l' aintérieur de la whileboucle.

Håvard S
la source
1
Truen'est pas toujours True , par exemple True = False. ;-)
jathanism
1
@ jathanism- La vérité est la vérité, Jusqu'au bout du compte.
dheerosaur le
3

Formellement, Trueest une constante intégrée Python de type booléen .

Vous pouvez utiliser des opérations booléennes sur des types booléens (à l'invite interactive python par exemple) et convertir des nombres en types booléens:

>>> print not True
False
>>> print not False
True
>>> print True or False
True
>>> print True and False
False
>>> a=bool(9)
>>> print a
True
>>> b=bool(0)
>>> print b
False
>>> b=bool(0.000000000000000000000000000000000001)
>>> print b
True

Et il y a potentiellement des "gotcha" avec ce que vous voyez et ce que voit le compilateur Python:

>>> n=0
>>> print bool(n)
False
>>> n='0'
>>> print bool(n)
True
>>> n=0.0
>>> print bool(n)
False
>>> n="0.0"
>>> print bool(n)
True

Pour savoir comment Python stocke les types booléens en interne, vous pouvez convertir les types booléens en nombres entiers et True sera 1 et False 0:

>>> print True+0
1
>>> print True+1
2
>>> print False+0
0
>>> print False+1
1

En fait, le booltype Python est une sous-classe du inttype de Python :

>>> type(True)
<type 'bool'>
>>> isinstance(True, int)
True

La partie la plus importante de votre question est "Qu'est-ce que c'est while True?" est «ce qui est vrai», et un corollaire important: qu'est-ce qui est faux?

Tout d'abord, pour chaque langue que vous apprenez, apprenez ce qu'elle considère comme «véridique» et «faux». Python considère Truth légèrement différemment de Perl Truth par exemple. D'autres langages ont des concepts légèrement différents de vrai / faux. Sachez ce que votre langage considère comme vrai et faux pour différentes opérations et contrôle de flux pour éviter de nombreux maux de tête plus tard!

Il existe de nombreux algorithmes dans lesquels vous souhaitez traiter quelque chose jusqu'à ce que vous trouviez ce que vous recherchez. D'où la boucle infinie ou la boucle indéfinie. Chaque langage a tendance à avoir son propre idiome pour ces constructions. Voici les boucles infinies courantes en C, qui fonctionnent également pour Perl:

for(;;) { /* loop until break */ }

/* or */

while (1) {
   return if (function(arg) > 3);
}

La while True:forme est courante en Python pour les boucles indéfinies avec un moyen de sortir de la boucle. Apprenez le contrôle de flux Python pour comprendre comment vous sortez des while Trueboucles. Contrairement à la plupart des langages, par exemple, Python peut avoir une elseclause sur une boucle. Il y a un exemple dans le dernier lien.

dawg
la source
1

Une whileboucle prend un argument conditionnel (ce qui signifie quelque chose qui est généralement vrai ou faux, ou qui peut être interprété comme tel), et ne s'exécute que lorsque la condition cède True.

Quant à while True? Eh bien, le vrai conditionnel le plus simple est Truelui - même! Il s'agit donc d'une boucle infinie, généralement bonne dans un jeu qui nécessite beaucoup de boucles. (De mon point de vue, cependant, il est plus courant de définir une sorte de variable "done" sur false, puis de la rendre vraie pour terminer le jeu, et la boucle ressemblerait plus while not done:ou autre.)

Platine Azure
la source
1

Dans certaines langues, True est juste et alias pour le nombre. Vous pouvez en savoir plus sur la raison en en lisant davantage sur la logique booléenne .

Copas
la source
1

Pour répondre directement à votre question: tant que la condition de boucle est True. Ce qui est toujours le cas, dans ce bit de code particulier.

Marius Gedminas
la source
0

whileles boucles continuent à boucler jusqu'à ce que la condition soit fausse. Par exemple (pseudocode):

i = 0
while i < 10
  i++

À chaque itération de la boucle, isera incrémentée de 1, jusqu'à ce qu'elle soit 10. À ce stade, la condition i < 10n'est plus vraie et la boucle se terminera.

Puisque la condition dans while Trueest explicitement et toujours true, la boucle ne se terminera jamais (jusqu'à ce qu'elle soit interrompue d'une autre manière, généralement par une construction comme breakdans le corps de la boucle).

Daniel Vandersluis
la source
0

Rien ne vaut Trueplus vite que True. Donc, c'est bien si vous utilisez à la while Trueplace de while 1==1etc.

dheerosaure
la source
0
while True:
    ...

signifie boucle infinie.

L'instruction while est souvent utilisée pour une boucle finie. Mais l'utilisation de la constante 'True' garantit la répétition de l'instruction while sans avoir besoin de contrôler la boucle (en définissant une valeur booléenne à l'intérieur de l'itération par exemple), à ​​moins que vous ne souhaitiez la rompre.

En réalité

True == (1 == 1)
Rob
la source
0

tandis que True signifie une boucle infinie, cela est généralement utilisé par un processus long. vous pouvez changer

while True:

avec

while 1:
Yuda Prawira
la source
0

Bien que la plupart de ces réponses soient correctes à des degrés divers, aucune n'est aussi succincte que je le souhaiterais.

En termes simples, utiliser while True:n'est qu'un moyen d'exécuter une boucle qui continuera à s'exécuter jusqu'à ce que vous en sortiez explicitement en utilisant breakou return. Puisque True sera toujours évalué à True, vous devez forcer la boucle à se terminer quand vous le souhaitez.

while True:
    # do stuff

    if some_condition:
        break

    # do more stuff - code here WILL NOT execute when `if some_condition:` evaluates to True

Alors que normalement une boucle serait définie pour s'exécuter jusqu'à ce que la condition while soit fausse ou qu'elle atteigne un point final prédéfini:

do_next = True

while do_next:

    # do stuff

    if some_condition:
        do_next = False

    # do more stuff - code here WILL execute even when `if some_condition:` evaluates to True

Ces deux morceaux de code font effectivement la même chose

Si la condition par rapport à laquelle votre boucle évalue est peut-être une valeur qui ne figure pas directement dans votre contrôle, telle qu'une valeur d'entrée utilisateur, alors la validation des données et la sortie explicite de la boucle sont généralement nécessaires, vous voudrez donc le faire avec l'une ou l'autre méthode .

Le while Trueformat est plus pythonique puisque vous savez que cela breakbrise la boucle à ce point précis, alors que vous do_next = Falsepourriez faire plus de choses avant la prochaine évaluation de do_next.

Eric Ressler
la source
-4

Tout peut être considéré comme vrai jusqu'à ce que le contraire soit présenté. C'est ainsi que fonctionne la dualité. C'est une façon de comparer les contraires. Le noir peut être vrai jusqu'au blanc, auquel point il est faux. Le noir peut également être faux jusqu'au blanc, auquel point il est vrai. Ce n'est pas un état mais une comparaison d'états opposés. Si l'un ou l'autre est vrai, l'autre est faux. Vrai ne signifie pas qu'il est correct ou accepté. C'est un état où le contraire est toujours faux. C'est la dualité.

émorphe
la source