Was bedeutet "while True" in Python?

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

Während WAS ist wahr?

Ich denke, "solange wahr ist" ist eine Abkürzung, aber wofür? Während der Variablen 'Hand' ein Wert zugewiesen wird? Und was ist, wenn der Variablen 'Hand' kein Wert zugewiesen wird?

Baba
quelle
1
True ist eine Art Alias ​​für 1. Eine ähnliche Frage, die ich gestellt habe, finden Sie hier stackoverflow.com/questions/885908/…
Copas
17
@Copas, Trueist kein Alias ​​für 1. Obwohl in vielen Sprachen 1die Wahrheit im booleschen Kontext bewertet.
Adamse
2
adamse: War in einigen Versionen von Python Trueein Alias ​​für 1, nein? Obwohl ja, in den neuesten Versionen von Python gibt es einen echten booleschen Typ.
Ken
1
@adamse, @Ken: Zitat aus den Neuerungen in Python 2.3 - PEP 285 : " Python 2.3 wurde ein boolescher Typ hinzugefügt. Dem __builtin__Modul wurden zwei neue Konstanten hinzugefügt , True und False. (True und False wurden dem Build hinzugefügt -ins in Python 2.2.1, aber die 2.2.1-Versionen werden einfach auf ganzzahlige Werte von 1 und 0 gesetzt und sind kein anderer Typ.) ".
Cristian Ciupitu
@adamse In Python ist es nicht, aber in vielen Sprachen ist es. Ich hielt es für eine allgemeinere Frage. Mit einem Anfänger zu sprechen, als Baba sagte, er / sie sei "Wahr ist eine Art Alias ​​für 1", ist vollkommen korrekt. Ich bin damit einverstanden, dass Python True kein Alias ​​für 1 ist. Ich habe nicht gesagt, dass es so ist.
Copas

Antworten:

106

while Truebedeutet Schleife für immer. Die whileAnweisung nimmt einen Ausdruck und führt den Schleifenkörper aus, während der Ausdruck (boolean) "true" ergibt. Truewertet immer als boolesches "wahr" aus und führt somit den Schleifenkörper auf unbestimmte Zeit aus. Es ist eine Redewendung, an die Sie sich irgendwann gewöhnen werden! Die meisten Sprachen, denen Sie wahrscheinlich begegnen, haben gleichwertige Redewendungen.

Beachten Sie, dass die meisten Sprachen normalerweise einen Mechanismus haben, um frühzeitig aus der Schleife auszubrechen. Im Fall von Python ist dies die breakAussage im cmd == 'e'Fall des Beispiels in Ihrer Frage.

Richard Cook
quelle
8
Aus Gründen der Klarheit glaube ich, dass Sie dies in den meisten Sprachen tun können, während (true == true). Dies kann für einen neuen Programmierer hilfreich sein, um die dahinter stehende Logik besser zu verstehen.
Chris
9
Chris while True==Trueist hässlich. Es ist so hässlich wie while 'apples'!='oranges':)
Dheerosaurier
33
Wie einer meiner Lehrer betonte: Wenn Sie denken true==true, dass dies eine Verbesserung ist, wo hören Sie auf? Wäre nicht (true==true)==truenoch besser?
Ken
10
@Chris, irgendwann sollte man sich bewusst sein, dass ein boolescher Wert oder eine Variable anstelle eines logischen Ausdrucks verwendet werden kann, und "irgendwann" sollte so schnell wie möglich sein.
Mark Ransom
6
@Mark irgendwann sollte man sich bewusst sein, dass es manchmal ein bisschen zusätzliche Hilfe braucht, um einen neuen Programmierer dazu zu bringen, die boolesche Logik und dergleichen zu verstehen. Ich versuchte ihm nur zu helfen, es zu verstehen.
Chris
51

meine frage: während WAS ist wahr?

Während Trueist True.

Die while-Schleife wird ausgeführt, solange der bedingte Ausdruck ausgewertet wird True.

Da Trueimmer ausgewertet Truewird, läuft die Schleife unbegrenzt, bis etwas innerhalb der Schleife returns oder breaks ist.

Dagg Nabbit
quelle
4
Das ist Python. Es gibt keinen Ausdruck in Klammern; P
Mike Axiak
heh, guter Punkt. Ich bin es nicht gewohnt, in Python zu denken. Obwohl ich nehme an, Sie könnten Parens
darum
10

meine frage: während WAS ist wahr?

Alles in () der while-Anweisung wird als Boolescher Wert ausgewertet. Das heißt, es wird entweder in wahr oder falsch umgewandelt.

Betrachten Sie in der Erklärung while(6 > 5)

Es wertet zuerst den Ausdruck aus, 6 > 5der trueso ist wie zu sagenwhile(true)

Alles, was nicht FALSE, 0, ein Emptry-String "", null oder undefined ist, wird wahrscheinlich mit true bewertet.

Als ich anfing zu programmieren, machte ich Dinge wie if(foo == true): Ich wusste nicht, dass das praktisch dasselbe war wie if(foo).

Also, wenn Sie sagen, es ist while(true)wie sagenwhile(true == true)

Um Ihre Frage zu beantworten: Während WAHR wahr ist.

JD Isaacks
quelle
10

während Trueist wahr - dh immer. Dies ist eine Endlosschleife

Beachten Sie hier die wichtige Unterscheidung zwischen Trueeinem Schlüsselwort in der Sprache, das einen konstanten Wert eines bestimmten Typs bezeichnet, und 'true', einem mathematischen Konzept.

Chris Dodd
quelle
Technisch gesehen liegen Sie falsch. Das Konstrukt bedeutet "während wahr nicht falsch ist". Sie können den Unterschied sehen, wenn Sie while(5)in C schreiben , wo es keine richtigen Booleschen Werte gibt. Es bedeutet nicht while(5==1), es bedeutet while(5!=0).
Blindy
2
Ich denke, es ist angemessener, "unbestimmte Schleife" zu sagen. Die Annahme muss sein, dass die Schleife irgendwann durch eine Unterbrechung oder Rückkehr unterbrochen wird. Wirklich "Endlosschleifen" sind Programmiererfehler; 'unbestimmte Schleifen' werden durch Design erstellt.
Dagg Nabbit
3
@Blindy: In einer schwach typisierten Sprache mit automatischem Casting kann man sagen, dass x 'zu' y ausgewertet wird ... es ist nicht so, dass 5 nicht streng gleich 0 ist, sondern dass 5 locker gleich True ist.
Dagg Nabbit
@Blindy while(5)bedeutet in C, dass while 5wahr ist, nicht while its trueoder 0, was etwas völlig anderes ist. 5ist immer wahr. Wenn Sprachen ein Schlüsselwort haben true, ist dies im Allgemeinen eine Konstante, die wahr ist, aber nicht die einzige Konstante, die wahr ist. Ebenso falseist nicht unbedingt der einzige Wert, der falsch ist.
Chris Dodd
4

In diesem Zusammenhang könnte es als interpretiert werden

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

Trueist immer True, so while Truewird für immer Schleife.

Das whileSchlüsselwort nimmt einen Ausdruck an und durchläuft eine Schleife, während der Ausdruck wahr ist. Trueist ein Ausdruck, der immer wahr ist.

Betrachten Sie als möglicherweise klarstellendes Beispiel Folgendes:

a = 1
result = a == 1

Hier a == 1wird zurückkehren True, und somit setzen Truein result. Daher,

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

ist äquivalent zu:

while True:
  ...

vorausgesetzt, Sie ändern den Wert ainnerhalb der whileSchleife nicht.

Håvard S.
quelle
1
Trueist nicht immer True , z True = False. ;-)
jathanism
1
@ jathanism- Wahrheit ist Wahrheit, bis zum Ende der Abrechnung.
Dheerosaurier
3

Formal Trueist eine in Python integrierte Konstante vom Typ Bool .

Sie können Boolesche Operationen für Bool-Typen verwenden (z. B. an der interaktiven Python-Eingabeaufforderung) und Zahlen in Bool-Typen konvertieren :

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

Und es gibt "Gotchas", möglicherweise mit dem, was Sie sehen und was der Python-Compiler sieht:

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

Als Hinweis darauf, wie Python Bool-Typen intern speichert, können Sie Bool-Typen in Ganzzahlen umwandeln, und True wird zu 1 und False 0:

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

Tatsächlich ist der Python- boolTyp eine Unterklasse des Python- intTyps:

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

Der wichtigere Teil Ihrer Frage ist "Was ist while True?" ist 'was ist wahr' und eine wichtige Folgerung: Was ist falsch?

Lernen Sie zunächst für jede Sprache, die Sie lernen, was die Sprache als "wahr" und "falsch" ansieht. Python hält Wahrheit etwas anders als Perl Wahrheit zum Beispiel. Andere Sprachen haben leicht unterschiedliche Konzepte von wahr / falsch. Wissen Sie, was Ihre Sprache für verschiedene Operationen und Flusskontrollen als wahr und falsch ansieht, um später viele Kopfschmerzen zu vermeiden!

Es gibt viele Algorithmen, bei denen Sie etwas verarbeiten möchten, bis Sie das finden, wonach Sie suchen. Daher die Endlosschleife oder die unbestimmte Schleife. Jede Sprache hat für diese Konstrukte ihre eigene Sprache. Hier sind gängige C-Endlosschleifen, die auch für Perl funktionieren:

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

/* or */

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

Die while True:Form ist in Python für unbestimmte Schleifen üblich, mit einer Möglichkeit, aus der Schleife auszubrechen. Lernen Sie die Python- Flusskontrolle, um zu verstehen, wie Sie aus while TrueSchleifen ausbrechen . Im Gegensatz zu den meisten Sprachen kann Python beispielsweise eine elseKlausel in einer Schleife haben. Es gibt ein Beispiel im letzten Link.

dawg
quelle
1

Eine whileSchleife verwendet ein bedingtes Argument (dh etwas, das im Allgemeinen entweder wahr oder falsch ist oder als solches interpretiert werden kann) und wird nur ausgeführt, solange die Bedingung nachgibt True.

Wie für while True? Nun, die einfachste wahre Bedingung ist Trueselbst! Dies ist also eine Endlosschleife, die normalerweise in einem Spiel gut ist, das viele Schleifen erfordert. (Aus meiner Sicht ist es jedoch üblicher, eine Art "done" -Variable auf false zu setzen und diese dann auf true zu setzen, um das Spiel zu beenden, und die Schleife würde eher so aussehen while not done:oder was auch immer.)

Platinum Azure
quelle
1

In einigen Sprachen ist True gerecht und ein Alias ​​für die Nummer. Sie können mehr darüber erfahren, indem Sie mehr über die boolesche Logik lesen .

Copas
quelle
1

Um Ihre Frage direkt zu beantworten: während die Schleifenbedingung wahr ist. Was es immer ist, in diesem speziellen Code.

Marius Gedminas
quelle
0

whileSchleifen werden so lange wiederholt, bis die Bedingung falsch ist. Zum Beispiel (Pseudocode):

i = 0
while i < 10
  i++

Bei jeder Iteration der Schleife iwird sie um 1 erhöht, bis sie 10 ist. Zu diesem Zeitpunkt ist die Bedingung i < 10nicht mehr erfüllt und die Schleife wird abgeschlossen.

Da die Bedingung in while Trueexplizit und immer ist true, wird die Schleife niemals enden (bis sie auf andere Weise unterbrochen wird, normalerweise durch ein Konstrukt wie breakinnerhalb des Schleifenkörpers).

Daniel Vandersluis
quelle
0

Nichts wird Trueschneller bewertet als True. Es ist also gut, wenn Sie while Trueanstelle von while 1==1usw. verwenden.

Dheerosaurier
quelle
0
while True:
    ...

bedeutet Endlosschleife.

Die while-Anweisung wird häufig für eine endliche Schleife verwendet. Die Verwendung der Konstante 'True' garantiert jedoch die Wiederholung der while-Anweisung, ohne dass die Schleife gesteuert werden muss (z. B. Festlegen eines booleschen Werts innerhalb der Iteration), es sei denn, Sie möchten sie unterbrechen.

Eigentlich

True == (1 == 1)
rauben
quelle
0

Während True eine Endlosschleife bedeutet, wird diese normalerweise durch einen langen Prozess verwendet. du kannst ändern

while True:

mit

while 1:
Yuda Prawira
quelle
-4

Alles kann als wahr angesehen werden, bis das Gegenteil präsentiert wird. So funktioniert Dualität. Auf diese Weise werden Gegensätze verglichen. Schwarz kann wahr sein, bis Weiß, an welchem ​​Punkt es falsch ist. Schwarz kann auch falsch sein, bis es weiß ist. Es ist kein Zustand, sondern ein Vergleich entgegengesetzter Zustände. Wenn einer wahr ist, ist der andere falsch. True bedeutet nicht, dass es korrekt ist oder akzeptiert wird. Es ist ein Zustand, in dem das Gegenteil immer falsch ist. Es ist Dualität.

Emorphus
quelle