O que é Truthy e Falsy? Como é diferente de verdadeiro e falso?


119

Eu só vim saber que existem Truthy e Falsas valores em python que são diferentes do normal, Truee False?

Alguém pode explicar em profundidade o que truthy e Falsas valores são?

Onde devo usá-los?

Qual é a diferença entre verdade e Truevalores e falsidade e Falsevalores?


20
Se bool(value)resultar True, então valueé verdade .
wnnmaw

4
Você mesmo inventou essas palavras, não foi? Enfim, veja __nonzero__e__bool__
zvone

6
Valores verdadeiros / falsos são apenas conveniências para situações em que você precisa de algum tipo de teste binário. Ele permite um código mais simples, e um código mais simples é geralmente mais fácil de ler com menos chance de bugs.
Mark Ransom

4
@zvone Verdadeiro e falso é comumente usado no código de golfe, se as linguagens de programação não tiverem valores booleanos.
MilkyWay90

6
@zvone: 'Truthy' e 'falsy' são amplamente usados ​​ao comparar linguagens de programação, por exemplo, PHP vs PERL vs Python vs JS. (Absolutamente não apenas código de golfe).
smci

Respostas:


77

Conforme os comentários descritos, refere-se apenas aos valores avaliados como Verdadeiro ou Falso.

Por exemplo, para ver se uma lista não está vazia, em vez de verificar assim:

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

Você pode simplesmente fazer isso:

if my_list:
   print("Not empty!")

Isso ocorre porque alguns valores, como listas vazias, são considerados falsos quando avaliados para um valor booleano. Listas não vazias são verdadeiras.

Da mesma forma, para o inteiro 0, a string vazia "" e assim por diante, para False, e inteiros diferentes de zero, strings não vazias e assim por diante, para True.

A ideia de termos como "verdadeiro" e "falso" simplesmente se refere aos valores que são considerados verdadeiros em casos como os descritos acima, e aqueles que são considerados falsos.

Por exemplo, uma lista vazia ( []) é considerada "falsa" e uma lista não vazia (por exemplo, [1]) é considerada "verdadeira".

Veja também esta seção da documentação .


ou significa se my_list for true?

Eu sugiro tentar essas coisas em um shell Python e ver por si mesmo. ;) if my_listsignifica "se minha_lista não estiver vazia", ​​e if not my_listsignifica "se minha_lista estiver vazia".
B. Eckles,

1
ok eu tenho a última pequena confusão, eu vi muitos lugares como o if a:que significa este tipo de condições? significa se a é verdadeiro ou significa se a é falso? ou significa se a é verdadeiro ou se a é falso?

1
Significa "se a for verdadeiro". Conforme descrevi em minha resposta, e como outros descreveram em comentários e outras respostas, diferentes coisas são CONSIDERADAS como verdadeiras ou falsas, mas não são realmente. Uma lista vazia, por exemplo, é considerada False. É por isso if []:que nunca seria executado.
B. Eckles,

significa se a: significa se a é verdadeiro (quando a é inteiro ou string) e se a: significa falso se a é uma lista vazia ou dict vazio ou valores falsos!

200

Todos os valores são considerados "verdadeiros", exceto os seguintes, que são "falsos":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - um vazio list
  • {} - um vazio dict
  • () - um vazio tuple
  • '' - um vazio str
  • b'' - um vazio bytes
  • set() - um vazio set
  • um vazio range, comorange(0)
  • objetos para os quais
    • obj.__bool__() retorna False
    • obj.__len__() retorna 0

Um valor "verdadeiro" irá satisfazer a verificação realizada por instruções ifou while. Usamos "verdadeiro" e "falso" para diferenciar dos boolvalores Truee False.

Teste de valor da verdade


5
Ótima lista, obrigado. Questão totalmente acadêmica, mas você sabe qual é a ordem de execução? Estava pensando que você poderia criar um objeto onde bool retorna True e len retorna 0 (ou vice-versa).
Hayden Crocker

16
@HaydenCrocker Procure __bool__primeiro, então __len__. Se nenhum dos dois for definido, todas as instâncias serão consideradas "verdadeiras". Isso é discutido nos documentos do object.__bool__método
Patrick Haugh

3
Nas versões do Python anteriores a 3.5, os objetos de hora que representam a meia-noite UTC eram considerados falsos. Este artigo fornece uma visão geral de um relatório de bug do problema e a resolução final.
Jason V.

1
Curiosamente, para o pacote datetime, datetime.min é verdadeiro enquanto timedelta (0) é falso.
David Kinghorn de

1
@DavidKinghorn Mas isso faz sentido, certo? O valor mínimo de data e hora é apenas uma data como qualquer outra, não é igual a zero de forma alguma. Em contraste, timedelta(0)é como zero. Isso veio à tona quando foi descoberto que os valores de hora que representam meia-noite eram falsos, o que acabou sendo corrigido: lwn.net/Articles/590299
Patrick Haugh

5

Os valores verdadeiros referem-se aos objetos usados ​​em um contexto booleano e não tanto ao valor booleano que retorna verdadeiro ou falso. Veja-os como exemplo:

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

4

Python determina a veracidade aplicando bool()ao tipo, que retorna Trueou Falseque é usado em uma expressão como ifou while.

Aqui está um exemplo para uma classe personalizada Vector2de sua instância retorna Falsequando a magnitude (comprimento de um vetor) é 0, caso contrário 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 não tivéssemos definido, __bool__ele sempre retornaria True, pois as instâncias de uma classe definida pelo usuário são consideradas verdadeiras por padrão.

Exemplo do livro: "Fluente em Python, programação clara, concisa e eficaz"


2

Onde você deve usar os valores Truthy ou Falsy? Estes são açúcares sintáticos , então você sempre pode evitá-los, mas usá-los pode tornar seu código mais legível e mais eficiente. Além disso, você os encontrará em muitos exemplos de código, seja em python ou não, porque é considerada uma boa prática.

Conforme mencionado nas outras respostas, você pode usá-los em testes if e loops while. Aqui estão dois outros exemplos em python 3 com valores padrão combinados com or, ssendo uma variável de string. Você também se estenderá a situações semelhantes.

Sem verdade

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

com verdade é mais conciso:

print(s or 'Default value')

No Python 3.8, podemos tirar proveito da expressão de atribuição :=

sem verdade

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

com verdade é mais curto também

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

ou ainda mais curto,

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

Sem a expressão de atribuição, pode-se fazer

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

mas não mais curto. Algumas pessoas acham a s =...linha insatisfatória porque corresponde a

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

no entanto, você pode aderir a esse estilo de codificação se se sentir confortável com ele.


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

Se você executasse este loop, veria que while 0: = while false:

0 é considerado falso


-2

Falsy significa algo vazio como lista vazia, tupla, como qualquer tipo de dados com valores vazios ou Nenhum. Verdadeiro significa: Exceto são verdadeiros

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.