J'expérimente avec des booléens pour mieux les comprendre. Mon livre dit que tout type de données vide est interprété comme "faux" et tout type de données non vide est interprété comme "vrai". Quand j'ai écrit le programme suivant, j'ai pensé que j'obtiendrais une boucle infinie, mais le programme n'a rien retourné.

def main():
    while False == "":
        print("i")

main()

J'ai aussi essayé

def main():
    while True == "b":
        print("i")

main()

Je m'attendais également à ce que ce soit une boucle infinie, mais cela n'a rien retourné

2
Ovi 14 juil. 2015 à 23:10

4 réponses

Meilleure réponse

Comme d'autres le disent, '' peut être considéré comme un faux prédicat (une valeur "falsey") mais n'est pas réellement False, et une chaîne non vide est véridique mais pas réellement {{X2} }.

Mais n'essayez pas avec if False == 0: ou vous obtiendrez en effet une boucle infinie, car le type de données bool est une sous-classe du type de données int. Vous pouvez même faire des calculs avec True et False au lieu de 1 et 0 si vous le souhaitez.

1
TigerhawkT3 14 juil. 2015 à 20:16

La véracité implicite d'un objet ne signifie pas qu'il se comparera également aux littéraux True et False.

>>> False == ""
False
>>> True == "b"
False

Cela signifie simplement qu'ils ont une conversion (implicite ou explicite) en bool

>>> bool("")
False
>>> bool("b")
True

Ce qui signifie que vous pouvez utiliser la véracité implicite d'un objet dans le contexte des instructions if, any / all, etc.

if "b":

Ou

while "b":
2
CoryKramer 14 juil. 2015 à 20:12

S'il est vrai qu '"une valeur vide est traitée comme False", cela ne signifie pas que False == "" est une expression vraie. Cela signifie que ce qui suit serait une boucle infinie:

while "b":
    print("i")
2
Greg Hewgill 14 juil. 2015 à 20:12

True est un booléen, "b" est une chaîne. Ils ne sont pas égaux.

Cependant, "b" est "véridique"

>>>bool("b")
True

C'est pourquoi vous pouvez faire ce qui suit si vous désirez une boucle infinie:

while "my not empty string that is truthy":
    do.something()

# This is the same as:
while True:
    do.something()

Vous pouvez également profiter de la «véracité» du nom dans les instructions if:

if "b": # "b" is 'truthy'
    print 'this will be printed'

if "": # "" is not 'truthy'
    print 'this will not be printed'

Cela est également vrai pour les autres types:

if ['non-empty', 'list']: # Truthy
if []: # Falsey
if {'not' : 'empty dict'}: # Truthy
if {}: # Falsey

Soyez prudent avec les entiers. Sous-classes booléennes int. 0 n'est pas vrai:

if 1:
    print 'this will print'
if 0:
    print 'this will not print'
4
That1Guy 14 juil. 2015 à 20:20