¿Qué es la verdad y la falsedad? ¿En qué se diferencia de Verdadero y Falso?

118

Acabo de saber que hay valores de Verdad y Falsa en Python que son diferentes de los normales Truey False?

¿Alguien puede explicar en profundidad qué son los valores verdaderos y falsos ?

¿Dónde debo usarlos?

¿Cuál es la diferencia entre la verdad y los Truevalores y la falsedad y los Falsevalores?

martineau
fuente
20
Si bool(value)resulta True, entonces valuees verdad .
wnnmaw
4
Tú mismo inventaste esas palabras, ¿no? De todos modos, vea __nonzero__y__bool__
zvone
6
Los valores de Verdad / Falsedad son solo conveniencias para situaciones en las que necesita una prueba binaria de algún tipo. Permite un código más simple y el código más simple a menudo es más fácil de leer con menos posibilidades de errores.
Mark Ransom
4
@zvone Truthy and falsey se usa comúnmente en code golf, si los lenguajes de programación no tienen valores booleanos.
MilkyWay90
6
@zvone: 'Truthy' y 'falsy' se usan ampliamente cuando se comparan lenguajes de programación, por ejemplo, PHP vs PERL vs Python vs JS. (Absolutamente no solo golf de código).
smci

Respuestas:

77

Como se describe en los comentarios, solo se refiere a los valores que se evalúan como Verdadero o Falso.

Por ejemplo, para ver si una lista no está vacía, en lugar de marcar así:

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

Simplemente puede hacer esto:

if my_list:
   print("Not empty!")

Esto se debe a que algunos valores, como las listas vacías, se consideran falsos cuando se evalúan para un valor booleano. Las listas que no están vacías son verdaderas.

De manera similar, para el entero 0, la cadena vacía "", etc., para Falso, y enteros distintos de cero, cadenas no vacías, etc., para Verdadero.

La idea de términos como "verdad" y "falsedad" simplemente se refiere a aquellos valores que se consideran verdaderos en casos como los descritos anteriormente, y aquellos que se consideran falsos.

Por ejemplo, una lista vacía ( []) se considera "falsa" y una lista que no está vacía (por ejemplo, [1]) se considera "veraz".

Consulte también esta sección de la documentación .

B. Eckles
fuente
o significa si my_list es verdadero?
Sugiero probar estas cosas en un shell de Python y verlo por ti mismo. ;) if my_listsignifica "si mi_lista no está vacía" y if not my_listsignifica "si mi_lista está vacía".
B. Eckles
1
ok, tengo una pequeña confusión, he visto muchos lugares como if a:¿qué significa este tipo de condiciones? ¿Significa si a es verdadero o significa si a es falso? ¿O significa si a es verdadero o si a es falso?
1
Significa "si a es verdadero". Como describí en mi respuesta, y como otros han descrito en los comentarios y otras respuestas, diferentes cosas se CONSIDERAN Verdaderas o Fallas, pero en realidad no lo son. Una lista vacía, por ejemplo, se considera falsa. Por eso if []:nunca lo ejecutaría.
B. Eckles
significa si a: significa si a es verdadero (cuando a es un número entero o una cadena) y si a: significa falso si a es una lista vacía o un dict vacío o valores falsos.
199

Todos los valores se consideran "verdaderos" excepto los siguientes, que son "falsos":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - un vacío list
  • {} - un vacío dict
  • () - un vacío tuple
  • '' - un vacío str
  • b'' - un vacío bytes
  • set() - un vacío set
  • un vacío range, comorange(0)
  • objetos para los cuales
    • obj.__bool__() devoluciones False
    • obj.__len__() devoluciones 0

Un valor "veraz" satisfará la verificación realizada por ifo whiledeclaraciones. Usamos "verdad" y "falsedad" para diferenciar de los boolvalores Truey False.

Prueba de valor de verdad

Patrick Haugh
fuente
5
Gran lista, gracias. Pregunta totalmente académica, pero ¿sabes cuál es la orden de ejecución? Estaba pensando que podría crear un objeto donde bool devuelve True y len devuelve 0 (o viceversa).
Hayden Crocker
16
@HaydenCrocker Busca __bool__primero, luego __len__. Si no se define ninguno, todas las instancias se consideran "verdaderas". Esto se discute en los documentos del object.__bool__método
Patrick Haugh
3
En las versiones de Python anteriores a la 3.5, los objetos de tiempo que representan la medianoche UTC se consideraban falsos. Este artículo ofrece una descripción general de un informe de error del problema y su eventual resolución.
Jason V.
1
Curiosamente para el paquete datetime, datetime.min es verdadero mientras que timedelta (0) es falso.
David Kinghorn
1
@DavidKinghorn Eso tiene sentido, ¿verdad? El valor mínimo de fecha y hora es solo una fecha como cualquier otra, no es como cero de ninguna manera. Por el contrario, timedelta(0)es como cero. Esto surgió cuando se descubrió que los valores de tiempo que representan la medianoche eran falsos, lo que finalmente se solucionó: lwn.net/Articles/590299
Patrick Haugh
5

Los valores de verdad se refieren a los objetos utilizados en un contexto booleano y no tanto al valor booleano que devuelve verdadero o falso. Tómelos como ejemplo:

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

Python determina la veracidad aplicándola bool()al tipo, que devuelve Trueo Falseque se usa en una expresión como ifo while.

Aquí hay un ejemplo de una clase personalizada Vector2dy su instancia regresa Falsecuando la magnitud (longitud de un vector) es 0, de lo contrario 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: Si no lo hubiéramos definido __bool__, siempre devolvería True, ya que las instancias de una clase definida por el usuario se consideran verdaderas de forma predeterminada.

Ejemplo del libro: "Fluidez en Python, programación clara, concisa y efectiva"

usuario1767754
fuente
2

¿Dónde debería usar los valores de Verdad o Falsedad? Estos son azúcar sintáctico , por lo que siempre puede evitarlos, pero usarlos puede hacer que su código sea más legible y lo hará más eficiente. Además, los encontrará en muchos ejemplos de código, ya sea en python o no, porque se considera una buena práctica.

Como se mencionó en las otras respuestas, puede usarlas en pruebas if y bucles while. Aquí hay otros dos ejemplos en pitón 3 con los valores predeterminados en combinación con or, ssiendo una variable de cadena. También se extenderá a situaciones similares.

Sin verdad

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

con la verdad es más conciso:

print(s or 'Default value')

En Python 3.8, podemos aprovechar la expresión de asignación :=

sin verdad

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

con la verdad es mas corto tambien

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

o incluso más corto,

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

Sin la expresión de asignación, uno puede hacer

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

pero no más corto. Algunas personas encuentran la s =...línea insatisfactoria porque corresponde a

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

no obstante, puede adherirse a este estilo de codificación si se siente cómodo con él.

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

Si ejecuta este bucle, verá que while 0: = while falso:

0 se considera falso

MLee
fuente
-2

Falsy significa algo vacío como una lista vacía, tupla, como cualquier tipo de datos que tenga valores vacíos o Ninguno. Verdad significa: Excepto que son Verdad

Venkatesh
fuente