¿Qué significa "while True" en Python?

90
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."

Mientras que ¿QUÉ es verdad?

Creo que decir "si bien es cierto" es una abreviatura, pero ¿para qué? ¿Mientras se asigna un valor a la variable 'mano'? ¿Y si a la variable 'mano' no se le asigna un valor?

Baba
fuente
1
Verdadero es una especie de alias para 1. Una especie de pregunta relacionada que hice se puede encontrar aquí stackoverflow.com/questions/885908/…
Copas
17
@Copas, Trueno es un alias para 1. Aunque en muchos idiomas se 1evalúa la verdad en contexto booleano.
Adamse
2
Adamse: En algunas versiones de Python, Trueha sido un alias para 1, ¿no? Aunque sí, en las últimas versiones de Python hay un tipo booleano real.
Ken
1
@adamse, @Ken: citando de Novedades de Python 2.3 - PEP 285 : "Se agregó un tipo booleano a Python 2.3. Se agregaron dos nuevas constantes al __builtin__módulo, Verdadero y Falso. (Se agregaron constantes Verdadero y Falso al compilado -ins en Python 2.2.1, pero las versiones 2.2.1 simplemente se establecen en valores enteros de 1 y 0 y no son de un tipo diferente.) ".
Cristian Ciupitu
@adamse En Python no lo es, sin embargo, en muchos idiomas lo es. Lo consideré una pregunta más general. Hablarle a un principiante como Baba dijo que era "Verdadero es una especie de alias para 1" es perfectamente exacto. Estoy de acuerdo en que Python True no es un alias para 1. No dije que lo fuera.
Copas

Respuestas:

108

while Truesignifica bucle para siempre. La whiledeclaración toma una expresión y ejecuta el cuerpo del bucle mientras que la expresión se evalúa como (booleana) "verdadera". Truesiempre se evalúa como booleano "verdadero" y, por lo tanto, ejecuta el cuerpo del bucle de forma indefinida. ¡Es un idioma al que te acostumbrarás eventualmente! La mayoría de los idiomas que probablemente encontrará tienen modismos equivalentes.

Tenga en cuenta que la mayoría de los lenguajes suelen tener algún mecanismo para salir temprano del ciclo. En el caso de Python, es la breakdeclaración en el cmd == 'e'caso de la muestra en su pregunta.

Richard Cook
fuente
9
En aras de la claridad, creo que puede hacer while (verdadero == verdadero) en la mayoría de los idiomas. Esto puede ayudar a un nuevo programador a comprender mejor la lógica que hay detrás.
Chris
9
Chris, while True==Truees feo. Es tan feo como while 'apples'!='oranges':)
dheerosaur
34
Como señaló uno de mis profesores: si crees que true==truees una mejora, ¿dónde te detienes? ¿No (true==true)==truesería aún mejor?
Ken
10
@Chris, eventualmente uno debe ser consciente de que se puede usar un valor booleano o una variable en lugar de una expresión lógica, y "eventualmente" debe ser lo antes posible.
Mark Ransom
6
@Mark eventualmente uno debe ser consciente de que a veces se necesita un poco de ayuda adicional para lograr que un nuevo programador entienda la lógica booleana y cosas por el estilo. Todo lo que estaba tratando de hacer era ayudarlo a entenderlo.
Chris
53

mi pregunta: mientras que ¿QUÉ es verdad?

Mientras Truesea True.

El ciclo while se ejecutará siempre que la expresión condicional se evalúe True.

Como Truesiempre evalúa a True, el ciclo se ejecutará indefinidamente, hasta que algo dentro del ciclo returns o breaks.

Dagg Nabbit
fuente
4
Esto es Python. No hay expresión entre paréntesis; P
Mike Axiak
je, buen punto. No estoy acostumbrado a pensar en Python. Aunque supongo que podrías ponerle parens si quisieras ...
Dagg Nabbit
10

mi pregunta: mientras que ¿QUÉ es verdad?

Todo lo que esté dentro del () de la instrucción while se evaluará como booleano. Lo que significa que se convierte en verdadero o falso.

Considere en la declaración while(6 > 5)

Primero evalúa la expresión 6 > 5que es truelo mismo que decirwhile(true)

Todo lo que no sea FALSO, 0, una cadena vacía "", nula o indefinida probablemente se evaluará como verdadero.

Cuando comencé a programar, solía hacer cosas como if(foo == true), no me di cuenta de que era prácticamente lo mismo que if(foo).

Entonces, cuando dices, while(true)es como decirwhile(true == true)

Entonces, para responder su pregunta: Mientras que VERDADERO es Verdad.

JD Isaacks
fuente
10

while Truees verdadero, es decir, siempre. Este es un bucle infinito

Note la importante distinción aquí entre Truecuál es una palabra clave en el lenguaje que denota un valor constante de un tipo particular, y "verdadero", que es un concepto matemático.

Chris Dodd
fuente
Técnicamente hablando, estás equivocado. La construcción significa "mientras que verdadero no es falso". Puede ver la distinción si escribe while(5)en C, donde no hay valores booleanos adecuados. No significa while(5==1), significa while(5!=0).
Blindy
2
Creo que es más apropiado decir "bucle indefinido"; la suposición debe ser que el bucle será interrumpido por una ruptura o retorno en algún momento. Los bucles verdaderamente 'infinitos' son errores del programador; Los 'bucles indefinidos' se crean por diseño.
Dagg Nabbit
3
@Blindy: en un lenguaje de tipo débil con conversión automática, puede decir que x 'se evalúa como' y ... no es mientras 5 no es estrictamente igual a 0, es mientras que 5 es vagamente igual a Verdadero.
Dagg Nabbit
@Blindy, while(5)en C significa while 5es verdadero, no while su trueo 0, que es algo completamente diferente. 5siempre es cierto. En general, cuando los lenguajes tienen una palabra clave true, es una constante verdadera, pero no la única constante verdadera. Del mismo modo falseno es necesariamente el único valor que es falso.
Chris Dodd
4

En este contexto, supongo que podría interpretarse como

do
...
while cmd  != 'e' 
Paul carnicero
fuente
3

Truees siempre True, por lo que se while Truerepetirá para siempre.

La whilepalabra clave toma una expresión y se repite mientras la expresión es verdadera. Truees una expresión que siempre es cierta.

Como un ejemplo posiblemente aclaratorio, considere lo siguiente:

a = 1
result = a == 1

Aquí, a == 1volverá Truey, por tanto, se pondrá Trueen result. Por lo tanto,

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

es equivalente a:

while True:
  ...

siempre que no altere el valor de adentro del whileciclo.

Håvard S
fuente
1
Trueno siempre True , por ejemplo True = False. ;-)
jathanismo
1
@ jathanism- La verdad es verdad, Hasta el final del juicio.
dheerosaur
3

Formalmente, Truees una constante incorporada de Python de tipo bool .

Puede usar operaciones booleanas en tipos bool (en el indicador interactivo de Python, por ejemplo) y convertir números en tipos bool:

>>> 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

Y hay potencialmente "problemas" con lo que ves y lo que ve el compilador de 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

Como una pista de cómo Python almacena los tipos bool internamente, puede convertir los tipos bool en enteros y True resultará ser 1 y False 0:

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

De hecho, el booltipo de Python es una subclase del inttipo de Python :

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

La parte más importante de su pregunta es "¿Qué es while True?" es 'lo que es verdadero', y un corolario importante: ¿qué es falso?

Primero, para cada idioma que esté aprendiendo, aprenda lo que el idioma considera "verdadero" y "falso". Python considera Truth de forma ligeramente diferente a Perl Truth, por ejemplo. Otros lenguajes tienen conceptos ligeramente diferentes de verdadero / falso. ¡Sepa lo que su lenguaje considera verdadero y falso para diferentes operaciones y control de flujo para evitar muchos dolores de cabeza más adelante!

Hay muchos algoritmos en los que desea procesar algo hasta encontrar lo que busca. De ahí el bucle infinito o bucle indefinido. Cada idioma tiende a tener su propio idioma para estas construcciones. Aquí hay bucles infinitos de C comunes, que también funcionan para Perl:

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

/* or */

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

La while True:forma es común en Python para bucles indefinidos con alguna forma de salir del bucle. Aprenda el control de flujo de Python para comprender cómo se sale de los while Truebucles. A diferencia de la mayoría de los lenguajes, por ejemplo, Python puede tener una elsecláusula en un bucle. Hay un ejemplo en el último enlace.

perro
fuente
1

Un whilebucle toma un argumento condicional (es decir, algo que generalmente es verdadero o falso, o puede interpretarse como tal), y solo se ejecuta mientras la condición cede True.

En cuanto a while True? Bueno, ¡el condicional verdadero más simple es él Truemismo! Así que este es un bucle infinito, generalmente bueno en un juego que requiere muchos bucles. (Más común desde mi perspectiva, sin embargo, es establecer algún tipo de variable "hecho" en falso y luego convertirlo en verdadero para finalizar el juego, y el ciclo se parecería más while not done:o lo que sea).

Platino azur
fuente
1

En algunos idiomas, True es solo y un alias para el número. Puede aprender más sobre la razón de esto leyendo más sobre lógica booleana .

Copas
fuente
1

Para responder a su pregunta directamente: mientras que la condición de bucle es Verdadero. Lo que siempre es, en este fragmento de código en particular.

Marius Gedminas
fuente
0

whilelos bucles continúan en bucle hasta que la condición es falsa. Por ejemplo (pseudocódigo):

i = 0
while i < 10
  i++

Con cada iteración del ciclo, ise incrementará en 1, hasta que sea 10. En ese punto, la condición i < 10ya no es verdadera y el ciclo se completará.

Dado que la condición en while Truees explícita y siempre true, el bucle nunca terminará (hasta que se rompa de alguna otra manera, generalmente por una construcción como breakdentro del cuerpo del bucle).

Daniel Vandersluis
fuente
0

Nada se evalúa Truemás rápido que True. Entonces, es bueno si usa en while Truelugar de while 1==1etc.

dheerosaur
fuente
0
while True:
    ...

significa bucle infinito.

La instrucción while se usa a menudo para un bucle finito. Pero el uso de la constante 'Verdadero' garantiza la repetición de la instrucción while sin la necesidad de controlar el ciclo (estableciendo un valor booleano dentro de la iteración, por ejemplo), a menos que desee romperlo.

De hecho

True == (1 == 1)
robar
fuente
0

mientras que Verdadero significa bucle infinito, esto generalmente se usa mediante un proceso largo. tu puedes cambiar

while True:

con

while 1:
Yuda Prawira
fuente
0

Si bien la mayoría de estas respuestas son correctas en diversos grados, ninguna de ellas es tan sucinta como me gustaría.

En pocas palabras, usar while True:es solo una forma de ejecutar un bucle que continuará ejecutándose hasta que se salga explícitamente de él usando breako return. Dado que True siempre se evaluará como True, debe forzar el final del ciclo cuando lo desee.

while True:
    # do stuff

    if some_condition:
        break

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

Mientras que normalmente un bucle estaría configurado para ejecutarse hasta que la condición while sea falsa o alcance un punto final predefinido:

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

Esos dos fragmentos de código hacen efectivamente lo mismo

Si la condición contra la que se evalúa su ciclo es posiblemente un valor que no está directamente en su control, como un valor de entrada del usuario, entonces generalmente es necesario validar los datos y salir explícitamente del ciclo, por lo que querrá hacerlo con cualquiera de los métodos .

El while Trueformato es más pitónico ya que sabes que breakestá rompiendo el ciclo en ese punto exacto, mientras que do_next = Falsepodrías hacer más cosas antes de la próxima evaluación de do_next.

Eric Ressler
fuente
-4

Cualquier cosa puede tomarse como Verdadero hasta que se presente lo contrario. Así es como funciona la dualidad. Es una forma de comparar los opuestos. El negro puede ser verdadero hasta el blanco, momento en el que es falso. El negro también puede ser falso hasta el blanco, momento en el que es verdadero. No es un estado sino una comparación de estados opuestos. Si alguno es Verdadero, el otro está equivocado. Verdadero no significa que sea correcto o aceptado. Es un estado donde lo contrario siempre es falso. Es dualidad.

emorfo
fuente