O que significa “enquanto True” significa em 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."

Enquanto o que é verdade?

Acho que dizer 'enquanto verdadeiro' é um atalho, mas para quê? Enquanto a variável 'mão' está recebendo um valor? E se a variável 'mão' não estiver recebendo um valor?

Baba
fonte
1
True é uma espécie de apelido para 1. Uma espécie de pergunta relacionada que fiz pode ser encontrada aqui stackoverflow.com/questions/885908/…
Copas
17
@Copas, Truenão é um apelido para 1. Embora em muitas linguagens 1avalie a verdade no contexto booleano.
adamse de
2
adamse: em algumas versões do Python,True tem sido um apelido para 1, não? Embora sim, nas versões mais recentes do Python, existe um tipo booleano real.
Ken de
1
@adamse, @Ken: citando O que há de novo no Python 2.3 - PEP 285 : "Um tipo booleano foi adicionado ao Python 2.3. Duas novas constantes foram adicionadas ao __builtin__módulo, True e False. (Constantes True e False foram adicionadas ao construído -ins no Python 2.2.1, mas as versões 2.2.1 são simplesmente definidas para valores inteiros de 1 e 0 e não são de um tipo diferente.) ".
Cristian Ciupitu de
@adamse Em python não é, porém em muitas linguagens é. Eu considerei que fosse uma questão mais geral. Falar para um iniciante quando Baba disse que ele / ela era "Verdadeiro é uma espécie de pseudônimo para 1" é perfeitamente correto. Concordo em Python, True não é um alias para 1. Eu não disse que era.
Copas

Respostas:

108

while Truesignifica loop para sempre. A whileinstrução pega uma expressão e executa o corpo do loop enquanto a expressão é avaliada como (booleano) "verdadeiro". Truesempre é avaliado como booleano "verdadeiro" e, portanto, executa o corpo do loop indefinidamente. É um idioma com o qual você acabará se acostumando! A maioria das linguagens que você provavelmente encontrará têm expressões equivalentes.

Observe que a maioria das linguagens geralmente tem algum mecanismo para quebrar o loop antecipadamente. No caso do Python, é a breakdeclaração no cmd == 'e'caso do exemplo em sua pergunta.

Richard Cook
fonte
9
Para fins de clareza, acredito que você pode fazer enquanto (true == true) na maioria dos idiomas. Isso pode ajudar um novo programador a entender melhor a lógica por trás disso.
Chris de
9
Chris, while True==Trueé feio. É tão feio quanto while 'apples'!='oranges':)
dheerossauro de
34
Como um dos meus professores apontou: se você acha que true==trueé uma melhoria, onde você para? Não (true==true)==trueseria ainda melhor?
Ken de
10
@Chris, eventualmente, deve-se estar ciente de que um valor booleano ou variável pode ser usado no lugar de uma expressão lógica, e "eventualmente" deve ser o mais rápido possível.
Mark Ransom de
6
Por fim, @Mark deve-se estar ciente de que às vezes é necessário um pouco de ajuda adicional para fazer um novo programador entender a lógica booleana e similares. Tudo que eu estava tentando fazer era ajudá-lo a entender isso.
Chris
53

minha pergunta: enquanto WHAT is True?

Enquanto Trueestá True.

O loop while será executado enquanto a expressão condicional for avaliada como True.

Como Truesempre avalia como True, o loop será executado indefinidamente, até algo dentro do loop returns ou breaks.

Dagg Nabbit
fonte
4
Isso é python. Não há expressão entre parênteses; P
Mike Axiak
heh, bom ponto. Não estou acostumado a pensar em Python. Embora eu suponha que você poderia colocar parênteses em torno dele se você quisesse ...
Dagg Nabbit
10

minha pergunta: enquanto WHAT is True?

Tudo dentro de () da instrução while será avaliado como um booleano. O que significa que é convertido em verdadeiro ou falso.

Considere na declaração while(6 > 5)

Ele primeiro avalia a expressão 6 > 5que trueé o mesmo que dizerwhile(true)

Qualquer coisa que não seja FALSE, 0, uma string vazia "", nula ou indefinida provavelmente será avaliada como verdadeira.

Quando comecei a programar, costumava fazer coisas como if(foo == true), não sabia que era praticamente a mesma coisa que if(foo).

Então, quando você diz, while(true)é como se estivesse dizendowhile(true == true)

Então, para responder a sua pergunta: Enquanto TRUE é True.

JD Isaacks
fonte
10

enquanto True é verdade - ou seja, sempre. Este é um loop infinito

Observe a distinção importante aqui entre o Truequal é uma palavra-chave na linguagem que denota um valor constante de um tipo particular, e 'verdadeiro' que é um conceito matemático.

Chris Dodd
fonte
Tecnicamente falando, você está errado. A construção significa "enquanto verdadeiro não é falso". Você pode ver a diferença se escrever while(5)em C, onde não há booleanos adequados. Isso não significa while(5==1), significa while(5!=0).
Cego de
2
Acho que é mais apropriado dizer 'loop indefinido;' a suposição deve ser que o loop será interrompido por uma quebra ou retorno em algum ponto. Loops verdadeiramente 'infinitos' são erros do programador; 'loops indefinidos' são criados por design.
Dagg Nabbit de
3
@Blindy: em uma linguagem fracamente digitada com conversão automática, você pode dizer que x 'é avaliado como' y ... não é enquanto 5 não for estritamente igual a 0, é enquanto 5 é vagamente igual a True.
Dagg Nabbit de
@Blindy, while(5)em C significa while 5é true, não while its trueor 0, o que é algo completamente diferente. 5é sempre verdade. Em geral, quando os idiomas têm uma palavra-chave true, é uma constante verdadeira, mas não a única constante verdadeira. Da mesma forma, falsenão é necessariamente o único valor que é falso.
Chris Dodd
4

Neste contexto, suponho que poderia ser interpretado como

do
...
while cmd  != 'e' 
Paul Butcher
fonte
3

Trueé sempre True, então while Truefará um loop para sempre.

A whilepalavra-chave pega uma expressão e faz um loop enquanto a expressão for verdadeira.Trueé uma expressão sempre verdadeira.

Como um exemplo possivelmente esclarecedor, considere o seguinte:

a = 1
result = a == 1

Aqui, a == 1vai voltar True, e, portanto, colocar Trueem result. Conseqüentemente,

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

é equivalente a:

while True:
  ...

desde que você não altere o valor de adentro do whileloop.

Håvard S
fonte
1
Truenem sempre True , por exemplo True = False. ;-)
jatanismo de
1
@jathanism- A verdade é a verdade, Até o fim do cálculo.
dheerosaur
3

Formalmente, Trueé uma constante interna do Python do tipo bool .

Você pode usar operações booleanas em tipos booleanos (no prompt Python interativo, por exemplo) e converter números em tipos booleanos:

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

E há "pegadinhas" potencialmente com o que você vê e o que o compilador Python vê:

>>> 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 uma dica de como o Python armazena os tipos bool internamente, você pode converter tipos bool em inteiros e True será 1 e False 0:

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

Na verdade, o booltipo Python é uma subclasse do inttipo Python :

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

A parte mais importante da sua pergunta é "O que é while True ?" é 'o que é verdadeiro', e um corolário importante: o que é falso?

Primeiro, para cada idioma que você está aprendendo, aprenda o que o idioma considera 'verdadeiro' e 'falsey'. Python considera a verdade ligeiramente diferente da verdade Perl, por exemplo. Outras linguagens têm conceitos ligeiramente diferentes de verdadeiro / falso. Saiba o que sua linguagem considera Verdadeiro ou Falso para diferentes operações e controle de fluxo para evitar muitas dores de cabeça mais tarde!

Existem muitos algoritmos nos quais você deseja processar algo até encontrar o que está procurando. Daí o loop infinito ou loop indefinido. Cada idioma tende a ter seu próprio idioma para essas construções. Aqui estão os loops infinitos C comuns, que também funcionam para Perl:

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

/* or */

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

A while True:forma é comum em Python para loops indefinidos com alguma forma de quebrar o loop. Aprenda o controle de fluxo do Python para entender como você rompe os while Trueloops. Ao contrário da maioria das linguagens, por exemplo, Python pode ter uma elsecláusula em um loop. Há um exemplo no último link.

dawg
fonte
1

Um whileloop recebe um argumento condicional (significando algo que geralmente é verdadeiro ou falso, ou pode ser interpretado como tal) e só executa enquanto a condição produzTrue .

Quanto while True? Bem, a condicional verdadeira mais simples é Trueela mesma! Portanto, este é um loop infinito, geralmente bom em um jogo que requer muitos looping. (Mais comum da minha perspectiva, porém, é definir algum tipo de variável "concluída" como falsa e, em seguida, torná-la verdadeira para encerrar o jogo, e o loop pareceria mais while not done:ou algo assim .)

Platinum Azure
fonte
1

Em alguns idiomas, True é apenas um apelido para o número. Você pode aprender mais por que isso ocorre lendo mais sobre a lógica booleana .

Copas
fonte
1

Para responder diretamente à sua pergunta: enquanto a condição do loop for True. O que sempre é, neste trecho específico de código.

Marius Gedminas
fonte
0

whileos loops continuam em loop até que a condição seja falsa. Por exemplo (pseudocódigo):

i = 0
while i < 10
  i++

A cada iteração do loop, iserá incrementado em 1, até chegar a 10. Nesse ponto, a condiçãoi < 10 não é mais verdadeira, e o loop será concluído.

Como a condição in while Trueé explicitamente e sempre true, o loop nunca terminará (até que seja interrompido de alguma outra forma, geralmente por uma construção como breakdentro do corpo do loop).

Daniel Vandersluis
fonte
0

Nada é avaliado como Truemais rápido do que True. Portanto, é bom se você usar em while Truevez de while 1==1etc.

dheerossauro
fonte
0
while True:
    ...

significa loop infinito.

A instrução while é freqüentemente usada para um loop finito. Mas usar a constante 'True' garante a repetição da instrução while sem a necessidade de controlar o loop (definindo um valor booleano dentro da iteração, por exemplo), a menos que você queira quebrá-lo.

De fato

True == (1 == 1)
roubar
fonte
0

enquanto True significa loop infinito, isso geralmente usa por processo longo. você pode mudar

while True:

com

while 1:
Yuda Prawira
fonte
0

Embora a maioria dessas respostas esteja correta em vários graus, nenhuma delas é tão sucinta quanto eu gostaria.

Simplificando, using while True:é apenas uma forma de executar um loop que continuará a ser executado até que você explicitamente interrompa-o usando breakou return. Como True sempre será avaliado como True, você deve forçar o encerramento do loop quando quiser.

while True:
    # do stuff

    if some_condition:
        break

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

Embora normalmente um loop seja configurado para ser executado até que a condição while seja falsa ou atinja um ponto 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

Esses dois blocos de código fazem efetivamente a mesma coisa

Se a condição contra a qual seu loop é avaliado for possivelmente um valor que não está diretamente em seu controle, como um valor de entrada do usuário, então, validar os dados e interromper explicitamente o loop geralmente é necessário, então você deseja fazer isso com qualquer um dos métodos .

O while Trueformato é mais pythônico, pois você sabe que breakestá quebrando o loop naquele ponto exato, ao passo que do_next = Falsepoderia fazer mais coisas antes da próxima avaliação de do_next.

Eric Ressler
fonte
-4

Qualquer coisa pode ser considerada Verdadeira até que o oposto seja apresentado. É assim que a dualidade funciona. É uma forma de comparar os opostos. O preto pode ser verdadeiro até o branco, ponto em que é falso. O preto também pode ser falso até o branco, ponto em que é verdadeiro. Não é um estado, mas uma comparação de estados opostos. Se um for verdadeiro, o outro está errado. Verdadeiro não significa que seja correto ou seja aceito. É um estado em que o oposto é sempre falso. É dualidade.

emorphus
fonte