Co w Pythonie oznacza „chociaż prawda”?

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

A CO jest prawdą?

Wydaje mi się, że powiedzenie „póki prawda” jest skrótem, ale po co? Podczas gdy zmiennej „ręka” przypisywana jest wartość? A co, jeśli zmiennej „ręka” nie przypisuje się wartości?

Baba
źródło
1
Prawda to coś w rodzaju aliasu dla 1. Rodzaj pokrewnego pytania, które zadałem, można znaleźć tutaj stackoverflow.com/questions/885908/ ...
Copas
17
@Copas, Truenie jest aliasem dla 1. Chociaż w wielu językach 1ocenia się zgodnie z prawdą w kontekście logicznym.
Adamse
2
adamse: W niektórych wersjach Pythona Truebył alias 1, nie? Chociaż tak, w najnowszych wersjach Pythona istnieje prawdziwy typ boolowski.
Ken
1
@adamse, @Ken: cytując z Co nowego w Pythonie 2.3 - PEP 285 : „Typ boolowski został dodany do Pythona 2.3. Dwie nowe stałe zostały dodane do __builtin__modułu, True i False. (Stałe True i False zostały dodane do zbudowanego -ins w Pythonie 2.2.1, ale wersje 2.2.1 są po prostu ustawiane na wartości całkowite 1 i 0 i nie są innego typu.) ".
Cristian Ciupitu
@adamse W Pythonie tak nie jest, jednak w wielu językach tak nie jest. Uznałem to za bardziej ogólne pytanie. Mówienie do początkującego, kiedy Baba powiedział, że „Prawda to rodzaj aliasu dla 1”, jest całkowicie dokładne. Zgadzam się w Pythonie True nie jest aliasem dla 1. Nie powiedziałem, że tak.
Copas

Odpowiedzi:

108

while Trueoznacza pętlę na zawsze. whileOświadczenie bierze wyrażenie i wykonuje ciało pętli natomiast ocenia wyraz (logiczna) „true”. Truezawsze oblicza wartość logiczną „prawda” i dlatego wykonuje treść pętli w nieskończoność. To idiom, do którego w końcu się przyzwyczaisz! Większość języków, z którymi możesz się spotkać, ma równoważne idiomy.

Zauważ, że większość języków ma zwykle jakiś mechanizm wczesnego wyrwania się z pętli. W przypadku Pythona jest to breakstwierdzenie w cmd == 'e'przypadku próbki w Twoim pytaniu.

Richard Cook
źródło
9
Dla jasności uważam, że możesz to zrobić w większości języków (true == true). Może to pomóc nowemu programiście w lepszym zrozumieniu logiki stojącej za tym.
Chris,
9
Chris, while True==Truejest brzydki. Jest tak brzydki jak while 'apples'!='oranges':)
dheerosaur
34
Jak zauważył jeden z moich nauczycieli: jeśli uważasz, że true==trueto poprawa, na czym się zatrzymujesz? Nie (true==true)==truebyłoby jeszcze lepiej?
Ken
10
@Chris, ostatecznie należy mieć świadomość, że wartość logiczna lub zmienna może być użyta zamiast wyrażenia logicznego i „ostatecznie” powinno nastąpić jak najszybciej.
Mark Ransom
6
@ Mark ostatecznie należy mieć świadomość, że czasami potrzeba trochę dodatkowej pomocy, aby nowy programista zrozumiał logikę boolowską i tym podobne. Chciałem tylko pomóc mu to zrozumieć.
Chris,
53

moje pytanie: podczas gdy CO jest prawdą?

Podczas True jest True.

Pętla while będzie działać tak długo, jak długo obliczane jest wyrażenie warunkowe True .

Ponieważ Truezawsze obliczana jest na True, pętla będzie działać w nieskończoność, aż do pojawienia się czegoś w pętli returns lub breaks.

Dagg Nabbit
źródło
4
To jest Python. Nie ma wyrażenia w nawiasach; P
Mike Axiak
heh, słuszna uwaga. Nie jestem przyzwyczajony do myślenia w Pythonie. Chociaż przypuszczam, że mógłbyś nałożyć na to parens, gdybyś chciał ...
Dagg Nabbit
10

moje pytanie: podczas gdy CO jest prawdą?

Wszystko wewnątrz () instrukcji while zostanie ocenione jako wartość logiczna. Oznacza to, że jest konwertowany na prawdę lub fałsz.

Rozważ w oświadczeniu while(6 > 5)

Najpierw ocenia wyrażenie, 6 > 5które jest truetak, to to samo, co powiedzeniewhile(true)

Wszystko, co nie jest FALSE, 0, pusty ciąg znaków „”, null lub undefined, zostanie prawdopodobnie ocenione jako prawda.

Kiedy zaczynałem programować, robiłem takie rzeczy jak if(foo == true), nie zdawałem sobie sprawy, że to właściwie to samo, co if(foo).

Więc kiedy mówisz, while(true)to tak jak mówiszwhile(true == true)

A więc odpowiadając na pytanie: Podczas gdy PRAWDA jest Prawdą.

JD Isaacks
źródło
10

podczas True jest prawdą - tj. zawsze. To jest nieskończona pętla

Zwróć uwagę na ważne rozróżnienie między tym, Trueco jest słowem kluczowym w języku, oznaczającym stałą wartość określonego typu, a „prawdą”, które jest pojęciem matematycznym.

Chris Dodd
źródło
Technicznie rzecz biorąc, mylisz się. Konstrukcja oznacza „gdy prawda nie jest fałszem”. Możesz zobaczyć różnicę, pisząc while(5)w języku C, gdzie nie ma odpowiednich wartości logicznych. To nie znaczy while(5==1), to znaczy while(5!=0).
Blindy
2
Myślę, że bardziej stosowne jest powiedzenie „nieskończona pętla”; należy założyć, że pętla zostanie w pewnym momencie przerwana przerwą lub powrotem. Naprawdę „nieskończone” pętle są błędem programisty; „nieskończone pętle” są tworzone zgodnie z projektem.
Dagg Nabbit,
3
@Blindy: w słabo typizowanym języku z automatycznym rzutowaniem można powiedzieć, że x 'szacuje się do' y ... to nie jest, gdy 5 nie jest dokładnie równe 0, podczas gdy 5 jest luźno równe True.
Dagg Nabbit,
@Blindy, while(5)w języku C oznacza, że 5jest prawdziwe, a nie gdy jest to truelub 0, co jest czymś zupełnie innym. 5jest zawsze prawdą. Ogólnie rzecz biorąc, gdy języki mają słowo kluczowe true, jego stała jest prawdziwa, ale nie jedyna stała, która jest prawdziwa. Podobnie falseniekoniecznie jest jedyną wartością, która jest fałszywa.
Chris Dodd,
4

W tym kontekście przypuszczam, że można to interpretować jako

do
...
while cmd  != 'e' 
Paul Butcher
źródło
3

Truejest zawsze Truetakwhile True pętla będzie trwać wiecznie.

Słowo whilekluczowe przyjmuje wyrażenie i wykonuje pętlę, gdy wyrażenie jest prawdziwe.Trueto wyrażenie, które jest zawsze prawdziwe.

Jako potencjalnie wyjaśniający przykład rozważ następujące kwestie:

a = 1
result = a == 1

Tutaj a == 1wróci True, a zatem zostanie umieszczony Truew result. W związku z tym,

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

jest równa:

while True:
  ...

pod warunkiem, że nie zmienisz wartości awewnątrz whilepętli.

Håvard S
źródło
1
Truenie zawsze True , np True = False. ;-)
jathanism 20.09.10
1
@ jathanism- Prawda jest prawdą, aż do końca rozrachunku.
dheerosaur
3

Formalnie Truejest Python wbudowaną stałą z bool typu.

Możesz używać operacji logicznych na typach boolowych (na przykład w interaktywnym pytaniu Pythona) i konwertować liczby na typy boolowe:

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

I są potencjalnie "gotcha" z tym, co widzisz i co widzi kompilator Pythona:

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

Aby podpowiedzieć, jak Python przechowuje typy bool wewnętrznie, możesz rzutować typy bool na liczby całkowite, a True okaże się 1 i False 0:

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

W rzeczywistości booltyp Pythona jest podklasą typu Pythona int:

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

Ważniejsza część twojego pytania brzmi: „Co jest while True ?” to „co jest prawdą” i ważny wniosek: co jest fałszywe?

Po pierwsze, dla każdego języka, którego się uczysz, dowiedz się, co język uważa za „prawdziwe” i „fałszywe”. Python traktuje Prawdę nieco inaczej niż na przykład Perl Truth . Inne języki mają nieco inne koncepcje prawda / fałsz. Dowiedz się, co Twój język uważa za prawdę i fałsz dla różnych operacji i kontroluj przepływ, aby później uniknąć wielu problemów!

Istnieje wiele algorytmów, w których chcesz coś przetworzyć, dopóki nie znajdziesz tego, czego szukasz. Stąd nieskończona pętla lub nieokreślona pętla. Każdy język ma swój własny idiom dla tych konstrukcji. Oto typowe nieskończone pętle C, które działają również w Perlu:

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

/* or */

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

while True:Forma jest powszechne w Pythonie nieokreślonym pętli z jakiś sposób wyłamywania pętli. Naucz się sterowania przepływem w języku Python, aby zrozumieć, w jaki sposób wychodzisz z while Truepętli. W przeciwieństwie do większości języków, na przykład Python może mieć elseklauzulę w pętli. W ostatnim linku jest przykład.

psie
źródło
1

whilePętla trwa warunkowa argument (co oznacza, że coś jest na ogół albo prawdziwe lub fałszywe, lub mogą być interpretowane jako takie), i wykonuje tylko przy rentowności stan True.

Co do while True? Cóż, najprostszy prawdziwy warunek jest Truesam w sobie! Jest to więc nieskończona pętla, zwykle dobra w grze, która wymaga wielu pętli. (Z mojej perspektywy bardziej powszechne jest jednak ustawienie jakiejś zmiennej „done” na false, a następnie ustawienie tej wartości jako true, aby zakończyć grę, a pętla będzie wyglądać bardziej jak while not done:lub cokolwiek innego.)

Platinum Azure
źródło
1

W niektórych językach True to just i alias dla liczby. Możesz dowiedzieć się więcej, dlaczego tak się dzieje, czytając więcej o logice boolowskiej .

Copas
źródło
1

Odpowiadając bezpośrednio na twoje pytanie: gdy warunek pętli jest prawdziwy. Który zawsze jest, w tym konkretnym fragmencie kodu.

Marius Gedminas
źródło
0

whilepętle są kontynuowane, dopóki warunek nie będzie fałszywy. Na przykład (pseudokod):

i = 0
while i < 10
  i++

Z każdą iteracją pętli ibędzie zwiększana o 1, aż do 10. W tym momencie warunek i < 10nie jest już prawdziwy i pętla zostanie zakończona.

Ponieważ warunek w while Truejest jawny i zawsze true, pętla nigdy się nie zakończy (dopóki nie zostanie przerwana w inny sposób, zwykle przez konstrukcję taką jak breakw treści pętli).

Daniel Vandersluis
źródło
0

Nic nie ocenia się Trueszybciej niż True. Więc dobrze, jeśli używasz while Truezamiast while 1==1itp.

dheerozaur
źródło
0
while True:
    ...

oznacza nieskończoną pętlę.

Instrukcja while jest często używana jako pętla skończona. Jednak użycie stałej „True” gwarantuje powtórzenie instrukcji while bez konieczności kontrolowania pętli (na przykład ustawiania wartości logicznej wewnątrz iteracji), chyba że chcesz ją przerwać.

w rzeczywistości

True == (1 == 1)
obrabować
źródło
0

podczas gdy prawdziwa średnia nieskończona pętla, zwykle jest używana przez długi proces. możesz się zmienić

while True:

z

while 1:
Yuda Prawira
źródło
0

Chociaż większość z tych odpowiedzi jest poprawna w różnym stopniu, żadna z nich nie jest tak zwięzła, jak bym chciał.

Mówiąc prościej, użycie while True:jest po prostu sposobem na uruchomienie pętli, która będzie działać, dopóki nie zostanie wyraźnie z niej przerwana za pomocą breaklub return. Ponieważ True zawsze oblicza wartość True, musisz wymusić zakończenie pętli, kiedy chcesz.

while True:
    # do stuff

    if some_condition:
        break

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

Podczas gdy normalnie pętla byłaby uruchamiana do momentu, gdy warunek while będzie fałszywy lub osiągnie predefiniowany punkt końcowy:

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

Te dwa fragmenty kodu skutecznie robią to samo

Jeśli warunek, względem którego ocenia pętlę, jest prawdopodobnie wartością, która nie znajduje się bezpośrednio w Twojej kontroli, na przykład wartość wprowadzona przez użytkownika, wówczas walidacja danych i jawne przerwanie pętli jest zwykle konieczne, więc chcesz to zrobić za pomocą dowolnej metody .

while TrueFormat jest bardziej pythonic ponieważ wiesz, że breakłamie pętli przy tym dokładnie momencie, podczas gdy do_next = Falsemógłby zrobić więcej rzeczy przed kolejną oceną do_next.

Eric Ressler
źródło
-4

Wszystko można uznać za Prawdę, dopóki nie zostanie przedstawione przeciwieństwo. Tak działa dualność. Jest to sposób porównywania przeciwieństw. Czarny może być prawdziwy aż do białego, w którym to momencie jest fałszywy. Czarny może być również fałszywy, dopóki biały nie jest prawdą. To nie jest stan, ale porównanie stanów przeciwnych. Jeśli jedno jest prawdziwe, drugie jest złe. Prawda nie oznacza, że ​​jest poprawna lub jest akceptowana. Jest to stan, w którym przeciwieństwo jest zawsze fałszywe. To jest dwoistość.

emorphus
źródło