Qu'est-ce que Truthy and Falsy? En quoi est-ce différent du vrai et du faux?

119

Je viens de savoir qu'il existe des valeurs Truthy et Falsy en python qui sont différentes des valeurs normales Trueet False?

Quelqu'un peut-il expliquer en profondeur ce que sont les valeurs véridiques et fausses ?

Où dois-je les utiliser?

Quelle est la différence entre la vérité et les Truevaleurs et la fausse et les Falsevaleurs?

Martineau
la source
20
Si cela bool(value)aboutit True, alors valuec'est la vérité .
wnnmaw
4
Vous avez inventé ces mots vous-même, n'est-ce pas? Quoi qu'il en soit, voir __nonzero__et__bool__
zvone
6
Les valeurs Truthy / Falsy ne sont que des commodités pour les situations où vous avez besoin d'un test binaire quelconque. Il permet un code plus simple, et un code plus simple est souvent plus facile à lire avec moins de risques de bogues.
Mark Ransom
4
@zvone Truthy and Falsy est couramment utilisé dans le code golf, si les langages de programmation n'ont pas de valeurs booléennes.
MilkyWay90
6
@zvone: «Truthy» et «falsy» sont largement utilisés pour comparer les langages de programmation, par exemple PHP vs PERL vs Python vs JS. (Absolument pas seulement coder le golf).
smci

Réponses:

77

Comme les commentaires le décrivent, il se réfère simplement aux valeurs évaluées à True ou False.

Par exemple, pour voir si une liste n'est pas vide, au lieu de vérifier comme ceci:

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

Vous pouvez simplement faire ceci:

if my_list:
   print("Not empty!")

En effet, certaines valeurs, telles que les listes vides, sont considérées comme False lorsqu'elles sont évaluées pour une valeur booléenne. Les listes non vides ont la valeur True.

De même pour l'entier 0, la chaîne vide "", et ainsi de suite, pour False, et les entiers non nuls, les chaînes non vides, et ainsi de suite, pour True.

L'idée de termes comme «véridique» et «faux» se réfère simplement aux valeurs qui sont considérées comme vraies dans des cas comme ceux décrits ci-dessus, et celles qui sont considérées comme fausses.

Par exemple, une liste vide ( []) est considérée comme "falsifiée", et une liste non vide (par exemple, [1]) est considérée comme "véridique".

Voir également cette section de la documentation .

B. Eckles
la source
ou cela signifie si ma_liste est vraie?
Je suggère d'essayer ces choses dans un shell Python et de voir par vous-même. ;) if my_listsignifie "si ma_liste n'est pas vide", et if not my_listsignifie "si ma_liste est vide".
B.Eckles
1
ok j'ai la dernière petite confusion, j'ai vu beaucoup d'endroits comme if a:ce que signifie ce type de conditions? est-ce que cela signifie si a est vrai ou si a est faux? ou cela signifie si a est vrai ou si a est faux?
1
Cela signifie "si a est vrai". Comme je l'ai décrit dans ma réponse, et comme d'autres l'ont décrit dans les commentaires et autres réponses, différentes choses sont CONSIDÉRÉES Vrai ou Faux, mais ne le sont pas réellement. Une liste vide, par exemple, est considérée comme False. C'est pourquoi if []:n'exécuterait jamais.
B.Eckles
signifie si a: signifie si a est vrai (quand a est un entier ou une chaîne) et si a: signifie faux si a est une liste vide ou un dict vide ou de fausses valeurs!
200

Toutes les valeurs sont considérées comme "véridiques", à l'exception des suivantes, qui sont "fausses":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - un vide list
  • {} - un vide dict
  • () - un vide tuple
  • '' - un vide str
  • b'' - un vide bytes
  • set() - un vide set
  • un vide range, commerange(0)
  • objets pour lesquels
    • obj.__bool__() Retour False
    • obj.__len__() Retour 0

Une valeur "véridique" satisfera le contrôle effectué par les instructions ifou while. Nous utilisons «véridique» et «faux» pour différencier les boolvaleurs Trueet False.

Test de valeur de vérité

Patrick Haugh
la source
5
Grande liste, merci. Question entièrement académique, mais savez-vous quel est l'ordre d'exécution? Je pensais que vous pouviez créer un objet où bool retourne True et len retourne 0 (ou vice versa).
Hayden Crocker
16
@HaydenCrocker Il cherche d' __bool__abord, alors __len__. Si ni l'un ni l'autre n'est défini, toutes les instances sont considérées comme "vraies". Ceci est discuté dans la documentation de la object.__bool__méthode
Patrick Haugh
3
Dans les versions Python antérieures à 3.5, les objets horaires représentant minuit UTC étaient considérés comme faux. Cet article donne un aperçu d'un rapport de bogue du problème et de la résolution éventuelle.
Jason V.
1
Fait intéressant pour le package datetime, datetime.min est véridique tandis que timedelta (0) est faux.
David Kinghorn
1
@DavidKinghorn Cela a du sens, non? La valeur minimum datetime est juste une date comme une autre, ce n'est en aucun cas comme zéro. En revanche, timedelta(0)c'est comme zéro. Cela a été évoqué quand il a été découvert que les valeurs de temps représentant minuit étaient fausses, ce qui a finalement été corrigé: lwn.net/Articles/590299
Patrick Haugh
5

Les valeurs de vérité font référence aux objets utilisés dans un contexte booléen et pas tant à la valeur booléenne qui renvoie true ou false.

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
adi1ya
la source
4

Python détermine la véracité en appliquant bool()au type, qui renvoie Trueou Falsequi est utilisé dans une expression comme ifou while.

Voici un exemple pour une classe personnalisée Vector2det son instance retournant Falselorsque la magnitude (longueur d'un vecteur) est 0, sinon 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

Remarque: si nous ne l'avions pas défini, __bool__il renverrait toujours True, car les instances d'une classe définie par l'utilisateur sont considérées comme véridiques par défaut.

Exemple tiré du livre: "Maîtrise de Python, programmation claire, concise et efficace"

user1767754
la source
2

Où devriez-vous utiliser les valeurs Truthy ou Falsy? Ce sont du sucre syntaxique , vous pouvez donc toujours les éviter, mais leur utilisation peut rendre votre code plus lisible et vous rendre plus efficace. De plus, vous les trouverez dans de nombreux exemples de code, que ce soit en python ou non, car cela est considéré comme une bonne pratique.

Comme mentionné dans les autres réponses, vous pouvez les utiliser dans les tests if et les boucles while. Voici deux autres exemples en python 3 avec des valeurs par défaut combinées avec or, sétant une variable de chaîne. Vous vous étendrez également à des situations similaires.

Sans vérité

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

avec la vérité c'est plus concis:

print(s or 'Default value')

En python 3.8, nous pouvons tirer parti de l'expression d'affectation :=

sans vérité

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

avec la vérité c'est plus court aussi

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

ou même plus court,

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

Sans l'expression d'affectation, on peut faire

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

mais pas plus court. Certaines personnes trouvent la s =...ligne insatisfaisante car elle correspond à

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

néanmoins, vous pouvez adhérer à ce style de codage si vous vous sentez à l'aise avec lui.

jlaurens
la source
-2

Falsy signifie quelque chose de vide comme une liste vide, un tuple, comme tout type de données ayant des valeurs vides ou None. Vérité signifie: sauf si Vérité

Venkatesh
la source