Che cos'è la verità e la falsità? In che modo è diverso da Vero e Falso?


119

Sono appena venuto a sapere che ci sono valori Truthy e Falsy in Python che sono diversi dal normale Truee False?

Qualcuno può spiegare in profondità cosa sono i valori veri e falsi ?

Dove dovrei usarli?

Qual è la differenza tra truthy and Truevalues ​​e falsy and Falsevalues?


20
Se bool(value)risulta True, allora valueè veritiero .
wnnmaw

4
Hai inventato tu stesso quelle parole, vero? Comunque, vedi __nonzero__e__bool__
zvone

6
I valori di verità / falsità sono solo comodità per le situazioni in cui è necessario un test binario di qualche tipo. Consente un codice più semplice e il codice più semplice è spesso più facile da leggere con meno possibilità di bug.
Mark Ransom

4
@zvone Truthy and falsy è comunemente usato nel code golf, se i linguaggi di programmazione non hanno valori booleani.
MilkyWay90

6
@zvone: "Truthy" e "falsy" sono ampiamente utilizzati quando si confrontano linguaggi di programmazione, ad esempio PHP vs PERL vs Python vs JS. (Assolutamente non solo golf in codice).
smci

Risposte:


77

Come descritto nei commenti, si riferisce solo ai valori che vengono valutati come True o False.

Ad esempio, per vedere se un elenco non è vuoto, invece di controllare in questo modo:

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

Puoi semplicemente fare questo:

if my_list:
   print("Not empty!")

Questo perché alcuni valori, come gli elenchi vuoti, sono considerati falsi quando valutati per un valore booleano. Gli elenchi non vuoti sono True.

Allo stesso modo per il numero intero 0, la stringa vuota "" e così via, per False e interi diversi da zero, stringhe non vuote e così via, per True.

L'idea di termini come "veritiero" e "falso" si riferisce semplicemente a quei valori che sono considerati Veri in casi come quelli descritti sopra e quelli che sono considerati falsi.

Ad esempio, una lista vuota ( []) è considerata "falsa" e una lista non vuota (ad esempio, [1]) è considerata "veritiera".

Vedi anche questa sezione della documentazione .


o significa se my_list è vero?

Suggerisco di provare queste cose in una shell Python e di vedere di persona. ;) if my_listsignifica "se my_list non è vuoto" e if not my_listsignifica "se my_list è vuoto".
B. Eckles

1
ok ho l'ultima piccola confusione, ho visto molti posti come if a:cosa significa questo tipo di condizioni? significa se a è vero o significa se a è falso? o significa se a è vero o se a è falso?

1
Significa "se a è vero". Come ho descritto nella mia risposta, e come altri hanno descritto nei commenti e in altre risposte, cose diverse sono CONSIDERATE Vere o False, ma in realtà non lo sono. Un elenco vuoto, ad esempio, è considerato Falso. Ecco perché if []:non dovrebbe mai essere eseguito.
B. Eckles

significa se a: significa se a è vero (quando a è intero o stringa) e se a: significa falso se a è una lista vuota o dict vuoto o valori falsi!

200

Tutti i valori sono considerati "veritieri" tranne i seguenti, che sono "falsi":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - un vuoto list
  • {} - un vuoto dict
  • () - un vuoto tuple
  • '' - un vuoto str
  • b'' - un vuoto bytes
  • set() - un vuoto set
  • un vuoto range, comerange(0)
  • oggetti per i quali
    • obj.__bool__() ritorna False
    • obj.__len__() ritorna 0

Un valore "veritiero" soddisferà il controllo eseguito da ifo while. Usiamo "truthy" e "falsy" per differenziarci dai boolvalori Truee False.

Test del valore di verità


5
Ottima lista, grazie. Domanda interamente accademica, ma sai qual è l'ordine di esecuzione? Stavo pensando che potresti creare un oggetto in cui bool restituisce True e len restituisce 0 (o viceversa).
Hayden Crocker

16
@HaydenCrocker Prima cerca __bool__, quindi __len__. Se nessuno dei due è definito, tutte le istanze sono considerate "vere". Questo è discusso nella documentazione del object.__bool__metodo
Patrick Haugh

3
Nelle versioni di Python precedenti alla 3.5, gli oggetti ora che rappresentano mezzanotte UTC erano considerati False. Questo articolo fornisce una panoramica di una segnalazione di bug del problema e dell'eventuale risoluzione.
Jason V.

1
È interessante notare che per il pacchetto datetime, datetime.min è vero mentre timedelta (0) è falso.
David Kinghorn

1
@DavidKinghorn Questo ha senso, giusto? Il valore minimo di data e ora è solo una data come le altre, non è come zero in alcun modo. Al contrario, timedelta(0)è come zero. Ciò è stato sollevato quando si è scoperto che i valori temporali che rappresentano la mezzanotte erano falsi, il che alla fine è stato risolto: lwn.net/Articles/590299
Patrick Haugh

5

I valori veritieri si riferiscono agli oggetti utilizzati in un contesto booleano e non tanto al valore booleano che restituisce vero o falso. Prendiamo questi come esempio:

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True

4

Python determina la veridicità applicando bool()al tipo, che restituisce Trueo Falseche viene utilizzato in un'espressione come ifo while.

Di seguito è riportato un esempio per una classe personalizzata Vector2de la sua istanza restituisce Falsequando la magnitudine (lunghezza di un vettore) è 0, altrimenti 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

Nota: se non avessimo definito __bool__, restituirebbe sempre True, poiché le istanze di una classe definita dall'utente sono considerate true per impostazione predefinita.

Esempio tratto dal libro: "Ottima conoscenza di Python, programmazione chiara, concisa ed efficace"


2

Dove dovresti usare i valori Truthy o Falsy? Questi sono zucchero sintattico , quindi puoi sempre evitarli, ma usarli può rendere il tuo codice più leggibile e renderti più efficiente. Inoltre, li troverai in molti esempi di codice, in Python o meno, perché è considerato una buona pratica.

Come accennato nelle altre risposte, puoi usarli nei test if e nei cicli while. Ecco altri due esempi in python 3 con valori predefiniti combinati con or, sessendo una variabile stringa. Ti estenderai anche a situazioni simili.

Senza verità

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

con verità è più conciso:

print(s or 'Default value')

In python 3.8, possiamo trarre vantaggio dall'espressione di assegnazione :=

senza verità

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

con la verità è anche più breve

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

o anche più breve,

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

Senza l'espressione di assegnazione, si può fare

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

ma non più breve. Alcune persone trovano la s =...linea insoddisfacente perché corrisponde a

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

tuttavia puoi aderire a questo stile di codifica se ti senti a tuo agio.


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

Se eseguissi questo ciclo, vedresti che while 0: = while false:

0 è considerato un falso


-2

Falsy significa qualcosa di vuoto come un elenco vuoto, una tupla, come qualsiasi tipo di dati con valori vuoti o Nessuno. Verità significa: tranne che sono Verità

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.