Co to jest prawda i fałsz? Czym różni się od Prawda i Fałsz?

119

Właśnie dowiedziałem się, że w Pythonie istnieją wartości Truthy i Falsy, które różnią się od normalnych Truei False?

Czy ktoś może szczegółowo wyjaśnić, jakie są prawdziwe i fałszywe wartości?

Gdzie mam ich używać?

Jaka jest różnica między prawdą a Truewartościami i fałszem a Falsewartościami?

martineau
źródło
20
Jeśli bool(value)wyniki True, valueto prawda .
wnnmaw
4
Sam wymyśliłeś te słowa, prawda? W każdym razie zobacz __nonzero__i__bool__
zvone
6
Wartości prawda / fałsz są tylko udogodnieniami w sytuacjach, w których potrzebny jest jakiś test binarny. Pozwala na prostszy kod, a prostszy kod jest często łatwiejszy do odczytania z mniejszą szansą na błędy.
Mark Ransom
4
@zvone Prawda i fałsz jest powszechnie używany w golfie kodu, jeśli języki programowania nie mają wartości logicznych.
MilkyWay90
6
@zvone: „Prawda” i „fałsz” są szeroko stosowane przy porównywaniu języków programowania, np. PHP vs PERL vs Python vs JS. (Absolutnie nie tylko kod golfa).
smci

Odpowiedzi:

77

Jak opisano w komentarzach, odnosi się tylko do wartości, które są oceniane jako Prawda lub Fałsz.

Na przykład, aby sprawdzić, czy lista nie jest pusta, zamiast sprawdzać w ten sposób:

if len(my_list) != 0:
   print("Not empty!")

Możesz to po prostu zrobić:

if my_list:
   print("Not empty!")

Dzieje się tak, ponieważ niektóre wartości, takie jak puste listy, są uznawane za fałszywe, gdy są oceniane pod kątem wartości logicznej. Niepuste listy są prawdziwe.

Podobnie dla liczby całkowitej 0, pusty łańcuch „” i tak dalej, w przypadku wartości False i niezerowych liczb całkowitych, niepustych łańcuchów itd., W przypadku wartości True.

Pojęcia takie jak „prawda” i „fałsz” odnoszą się po prostu do tych wartości, które są uważane za prawdziwe w przypadkach takich jak te opisane powyżej, oraz te, które są uważane za fałszywe.

Na przykład pusta lista ( []) jest uważana za „fałszywą”, a niepusta lista (na przykład [1]) jest uważana za „prawdziwą”.

Zobacz także tę sekcję dokumentacji .

B. Eckles
źródło
lub oznacza to, że moja_lista jest prawdziwa?
Proponuję wypróbować te rzeczy w powłoce Pythona i przekonać się sam. ;) if my_listoznacza „jeśli moja_lista nie jest pusta”, a if not my_listoznacza „jeśli moja_lista jest pusta”.
B. Eckles,
1
ok, mam ostatnie małe zamieszanie, widziałem wiele miejsc, na przykład if a:co oznacza ten typ warunków? czy to znaczy, czy a jest prawdziwe, czy oznacza, że ​​a jest fałszywe? czy to znaczy, czy a jest prawdą, czy też jest fałszem?
1
To znaczy „jeśli a jest prawdziwe”. Jak opisałem w mojej odpowiedzi i jak opisali inni w komentarzach i innych odpowiedziach, różne rzeczy są UWAŻANE za Prawda lub Fałsz, ale w rzeczywistości tak nie jest. Na przykład pusta lista jest uważana za fałszywą. Dlatego if []:nigdy by nie wykonał.
B. Eckles,
oznacza, że ​​a: oznacza, że ​​a jest prawdziwe (gdy a jest liczbą całkowitą lub łańcuchem) i jeśli a: oznacza fałsz, jeśli a jest pustą listą lub pustym dict lub fałszywymi wartościami!
200

Wszystkie wartości są uważane za „prawdziwe” z wyjątkiem następujących, które są „fałszywe”:

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - pusty list
  • {} - pusty dict
  • () - pusty tuple
  • '' - pusty str
  • b'' - pusty bytes
  • set() - pusty set
  • pusty range, jakrange(0)
  • obiekty, dla których
    • obj.__bool__() zwroty False
    • obj.__len__() zwroty 0

Wartość „prawdziwa” spełni sprawdzenie przeprowadzane przez instrukcje iflub while. Używamy „prawda” i „fałsz”, aby odróżnić boolwartości Truei False.

Testowanie wartości prawdy

Patrick Haugh
źródło
5
Świetna lista, dzięki. Pytanie całkowicie akademickie, ale czy wiesz, jaka jest kolejność wykonania? Pomyślałem, że możesz stworzyć obiekt, w którym bool zwraca True, a len zwraca 0 (lub odwrotnie).
Hayden Crocker
16
@HaydenCrocker W takim razie __bool__najpierw szuka __len__. Jeśli żadne z nich nie jest zdefiniowane, wszystkie wystąpienia są uznawane za „prawdziwe”. Jest to omówione w dokumentacji object.__bool__metody
Patrick Haugh,
3
W wersjach Pythona wcześniejszych niż 3.5 obiekty czasu reprezentujące północ czasu UTC były uznawane za fałszywe. Ten artykuł zawiera omówienie raportu o błędzie i ostatecznego rozwiązania.
Jason V.
1
Co ciekawe w przypadku pakietu datetime, datetime.min jest prawdziwe, podczas gdy timedelta (0) jest fałszywe.
David Kinghorn
1
@DavidKinghorn To ma jednak sens, prawda? Minimalna wartość daty i godziny to po prostu data jak każda inna, w żaden sposób nie jest równa zero. W przeciwieństwie do timedelta(0)zera. Zostało to podniesione, gdy odkryto, że wartości czasu reprezentujące północ są fałszywe, co ostatecznie zostało naprawione: lwn.net/Articles/590299
Patrick Haugh
5

Prawdziwe wartości odnoszą się do obiektów używanych w kontekście boolowskim, a nie do wartości logicznej, która zwraca prawdę lub fałsz.

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
adi1ya
źródło
4

Python określa prawdziwość, stosując bool()się do typu, który zwraca Truelub Falsejest używany w wyrażeniu, takim jak iflub while.

Oto przykład dla klasy niestandardowej Vector2di jej instancji zwracającej się, Falsegdy wielkość (długość wektora) wynosi 0, w przeciwnym razie True.

import math
class Vector2d(object):
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

    def __abs__(self):
        return math.hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

a = Vector2d(0,0)
print(bool(a))        #False
b = Vector2d(10,0)    
print(bool(b))        #True

Uwaga: gdybyśmy nie zdefiniowali __bool__, zawsze zwracałby True, ponieważ instancje klasy zdefiniowanej przez użytkownika są domyślnie uważane za prawdziwe.

Przykład z książki: „Biegła znajomość języka Python, jasne, zwięzłe i efektywne programowanie”

user1767754
źródło
2

Gdzie należy używać wartości Prawda lub Falsy? Są to cukier syntaktyczny , więc zawsze możesz ich uniknąć, ale ich użycie może zwiększyć czytelność kodu i zwiększyć wydajność. Co więcej, znajdziesz je w wielu przykładach kodu, czy to w Pythonie, czy nie, ponieważ jest to uważane za dobrą praktykę.

Jak wspomniano w innych odpowiedziach, możesz ich używać w if testy i pętle while. Oto dwa inne przykłady w Pythonie 3 z wartościami domyślnymi połączonymi z or, sbędącymi zmienną łańcuchową. Będziesz także odnosić się do podobnych sytuacji.

Bez prawdy

if len(s) > 0:
    print(s)
else:
    print('Default value')

z prawdą jest bardziej zwięzłe:

print(s or 'Default value')

W Pythonie 3.8 możemy skorzystać z wyrażenia przypisania :=

bez prawdy

if len(s) == 0:
    s = 'Default value'
do_something(s)

z prawdą jest też krótszy

s or (s := 'Default value')
do_something(s)

lub nawet krócej,

do_something(s or (s := 'Default value'))

Bez wyrażenia przypisania można to zrobić

s = s or 'Default value'
do_something(s)

ale nie krócej. Niektórzy ludzie uważają tę s =...linię za niezadowalającą, ponieważ odpowiada

if len(s)>0:
    s = s # HERE is an extra useless assignment
else:
    s = "Default value"

niemniej jednak możesz stosować się do tego stylu kodowania, jeśli czujesz się z nim swobodnie.

jlaurens
źródło
-3

Falsy oznacza coś pustego, jak pusta lista, krotka, jak każdy typ danych mający puste wartości lub Brak. Prawda oznacza: z wyjątkiem prawdy

Venkatesh
źródło