Was ist Wahrheit und Falschheit? Wie unterscheidet es sich von Richtig und Falsch?

119

Ich habe gerade erfahren, dass es in Python Wahrheits- und Falschwerte gibt , die sich von den normalen Trueund False?

Kann jemand bitte ausführlich erklären, was wahrheitsgemäße und falschliche Werte sind?

Wo soll ich sie verwenden?

Was ist der Unterschied zwischen Wahrheit und TrueWerten und Falschheit und FalseWerten?

Martineau
quelle
20
Wenn dies zu bool(value)Ergebnissen führt True, valueist dies wahr .
wnnmaw
4
Du hast diese Worte selbst erfunden, oder? Wie auch immer, siehe __nonzero__und__bool__
zvone
6
Truthy / Falsy-Werte sind nur Annehmlichkeiten für Situationen, in denen Sie einen binären Test benötigen. Es ermöglicht einfacheren Code, und einfacherer Code ist oft leichter zu lesen, wobei die Wahrscheinlichkeit von Fehlern geringer ist.
Mark Ransom
4
@zvone Truthy and Falsy wird häufig im Code-Golf verwendet, wenn Programmiersprachen keine booleschen Werte haben.
MilkyWay90
6
@zvone: 'Truthy' und 'Falsy' werden häufig beim Vergleich von Programmiersprachen verwendet, z. B. PHP vs PERL vs Python vs JS. (Absolut nicht nur Code Golf).
smci

Antworten:

77

Wie in den Kommentaren beschrieben, bezieht es sich nur auf Werte, die als wahr oder falsch bewertet werden.

Um beispielsweise festzustellen, ob eine Liste nicht leer ist, anstatt Folgendes zu überprüfen:

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

Sie können dies einfach tun:

if my_list:
   print("Not empty!")

Dies liegt daran, dass einige Werte, z. B. leere Listen, bei der Auswertung für einen booleschen Wert als falsch betrachtet werden. Nicht leere Listen sind True.

In ähnlicher Weise für die Ganzzahl 0, die leere Zeichenfolge "" usw. für False und Ganzzahlen ungleich Null, nicht leere Zeichenfolgen usw. für True.

Die Idee von Begriffen wie "wahr" und "falsch" bezieht sich einfach auf jene Werte, die in Fällen wie den oben beschriebenen als wahr angesehen werden, und jene, die als falsch angesehen werden.

Beispielsweise wird eine leere Liste ( []) als "falsch" und eine nicht leere Liste (zum Beispiel [1]) als "wahr" betrachtet.

Siehe auch diesen Abschnitt der Dokumentation .

B. Eckles
quelle
oder bedeutet es, wenn my_list wahr ist?
Ich schlage vor, diese Dinge in einer Python-Shell auszuprobieren und selbst zu sehen. ;) if my_listbedeutet "wenn meine_Liste nicht leer ist" und if not my_listbedeutet "wenn meine_Liste leer ist".
B. Eckles
1
ok ich habe letzte kleine verwirrung, ich habe viele orte gesehen wie if a:was diese art von bedingungen bedeutet? ist es gemein, wenn a wahr ist oder bedeutet, wenn a falsch ist? oder bedeutet es, ob a wahr ist oder ob a falsch ist?
1
Es bedeutet "wenn a wahr ist". Wie ich in meiner Antwort beschrieben habe und wie andere in Kommentaren und anderen Antworten beschrieben haben, werden verschiedene Dinge als wahr oder falsch angesehen, aber tatsächlich nicht. Eine leere Liste wird beispielsweise als falsch angesehen. Deshalb if []:würde nie ausführen.
B. Eckles
bedeutet, wenn a: bedeutet, wenn a wahr ist (wenn a eine Ganzzahl oder eine Zeichenfolge ist) und wenn a: falsch ist, wenn a eine leere Liste oder ein leeres Diktat oder falsche Werte ist!
198

Alle Werte gelten als "wahr", mit Ausnahme der folgenden Werte, die "falsch" sind:

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - ein leeres list
  • {} - ein leeres dict
  • () - ein leeres tuple
  • '' - ein leeres str
  • b'' - ein leeres bytes
  • set() - ein leeres set
  • eine leere range, wierange(0)
  • Objekte für die
    • obj.__bool__() kehrt zurück False
    • obj.__len__() kehrt zurück 0

Ein "wahrheitsgemäßer" Wert erfüllt die von ifoder whileAnweisungen durchgeführte Prüfung . Wir verwenden "wahr" und "falsch", um von den boolWerten Trueund zu unterscheiden False.

Wahrheitswertprüfung

Patrick Haugh
quelle
5
Tolle Liste, danke. Völlig akademische Frage, aber wissen Sie, wie die Ausführungsreihenfolge lautet? Ich dachte, Sie könnten ein Objekt erstellen, bei dem bool True und len 0 zurückgibt (oder umgekehrt).
Hayden Crocker
16
@ HaydenCrocker Es sucht __bool__dann erst __len__. Wenn keine definiert ist, werden alle Instanzen als "wahr" betrachtet. Dies wird in den Dokumenten für die object.__bool__Methode diskutiert
Patrick Haugh
3
In Python-Versionen vor 3.5 wurden Zeitobjekte, die Mitternacht UTC darstellen, als falsch betrachtet. Dieser Artikel gibt einen Überblick über einen Fehlerbericht des Problems und die mögliche Lösung.
Jason V.
1
Interessanterweise ist datetime.min für das datetime-Paket wahr, während timedelta (0) falsch ist.
David Kinghorn
1
@ DavidKinghorn Das macht aber Sinn, oder? Der minimale Datum / Uhrzeit-Wert ist nur ein Datum wie jedes andere, er ist in keiner Weise wie Null. Im Gegensatz dazu timedelta(0)ist wie Null. Dies wurde angesprochen, als festgestellt wurde, dass Zeitwerte für Mitternacht falsch waren, was schließlich behoben wurde: lwn.net/Articles/590299
Patrick Haugh
5

Wahrheitswerte beziehen sich auf die in einem booleschen Kontext verwendeten Objekte und nicht so sehr auf den booleschen Wert, der true oder false zurückgibt. Nehmen Sie diese als Beispiel:

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
adi1ya
quelle
3

Python bestimmt die Wahrhaftigkeit, indem es bool()auf den Typ anwendet , der zurückgibt Trueoder Falseder in einem Ausdruck wie ifoder verwendet wird while.

Hier ist ein Beispiel für eine benutzerdefinierte Klasse Vector2d, deren Instanz zurückgegeben wird, Falsewenn andernfalls die Größe (Länge eines Vektors) 0 ist 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

Hinweis: Wenn wir nicht definiert hätten __bool__, würde immer True zurückgegeben, da Instanzen einer benutzerdefinierten Klasse standardmäßig als wahr angesehen werden.

Beispiel aus dem Buch: "Fließend in Python, klare, präzise und effektive Programmierung"

user1767754
quelle
1

Wo sollten Sie Wahrheits- oder Falschwerte verwenden? Dies sind syntaktische Zucker , so dass Sie sie immer vermeiden können, aber wenn Sie sie verwenden, können Sie Ihren Code lesbarer und effizienter machen. Darüber hinaus finden Sie sie in vielen Codebeispielen, ob in Python oder nicht, da dies als bewährte Methode angesehen wird.

Wie in den anderen Antworten erwähnt, können Sie sie in if-Tests und while-Schleifen verwenden. Hier sind zwei weitere Beispiele in Python 3 mit Standardwerten kombiniert mit or, sein String - Variable ist. Sie werden sich auch auf ähnliche Situationen erstrecken.

Ohne Wahrheit

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

mit wahrheit ist es prägnanter:

print(s or 'Default value')

In Python 3.8 können wir den Zuweisungsausdruck nutzen :=

ohne wahrheit

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

mit wahrheit ist es auch kürzer

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

oder noch kürzer,

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

Ohne den Zuweisungsausdruck kann man tun

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

aber nicht kürzer. Einige Leute finden die s =...Linie unbefriedigend, weil sie entspricht

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

Trotzdem können Sie sich an diesen Codierungsstil halten, wenn Sie sich damit wohl fühlen.

jlaurens
quelle
-1
while 0:
    print("Inside the loop.", counter)
    counter -= 1
print("Outside the loop.", counter)

Wenn Sie diese Schleife ausführen würden, würden Sie sehen, dass während 0: = während false:

0 wird als falsch angesehen

MLee
quelle
-2

Falsy bedeutet etwas Leeres wie leere Liste, Tupel, wie jeder Datentyp mit leeren Werten oder Keine. Wahrheit bedeutet: Außer Wahrheit

Venkatesh
quelle