Що таке Truthy та Falsy? Чим він відрізняється від Істинного та Неправдивого?


119

Я щойно дізнався, що в python є значення Truthy і Falsy, які відрізняються від нормальних Trueі False?

Може хто - то будь ласка , поясніть , в глибині , що truthy і falsy значення?

Де я повинен їх використовувати?

У чому різниця між truthy і Trueзначеннями і falsy і Falseцінностями?


20
Якщо це bool(value)призводить до True, то valueце є правдою .
wnnmaw

4
Ви самі вигадали ці слова, чи не так? Так чи інакше, дивіться __nonzero__і__bool__
zvone

6
Значення Truthy / Falsy - це лише зручності для ситуацій, коли потрібен якийсь бінарний тест. Це дозволяє більш простий код, а більш простий код часто легше читати, з меншими шансами на помилки.
Марк Рансом

4
@zvone Truthy and Falsy використовується в коді гольфу, якщо мови програмування не мають булевих значень.
MilkyWay90

6
@zvone: "Truthy" і "Falsy" широко використовуються при порівнянні мов програмування, наприклад, PHP vs PERL vs Python vs JS. (Зовсім не просто код гольфу).
smci

Відповіді:


77

Як описано в коментарях, воно просто посилається на значення, які оцінюються як Істинне або Неправильне.

Наприклад, щоб побачити, чи список не порожній, замість цього:

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

Ви можете просто зробити це:

if my_list:
   print("Not empty!")

Це тому, що деякі значення, такі як порожні списки, вважаються помилковими при оцінці булевого значення. Непорожні списки істинні.

Аналогічно для цілого числа 0, порожній рядок "" і так далі, для помилкових і ненульових цілих чисел, не порожніх рядків і так далі для True.

Ідея таких термінів як "truthy" та "falesy" просто стосується тих значень, які вважаються істинними у випадках, описаних вище, та тих, які вважаються помилковими.

Наприклад, порожній список ( []) вважається "хибним", а не порожній список (наприклад, [1]) вважається "правдоподібним".

Дивіться також цей розділ документації .


або це означає, якщо my_list правдивий?

Я пропоную спробувати ці речі в оболонці Python і побачити для себе. ;) if my_listозначає "якщо мій список не порожній" і if not my_listозначає "якщо мій список порожній".
Б. Еклз

1
ОК, у мене останній невеликий плутанина, я бачив багато місць, як, if a:що означає цей тип умов? це означає, якщо a є істинним, чи означає, якщо a false? або це означає, якщо a - неправда або якщо a - помилкова?

1
Це означає, "якщо a - це правда". Як я описав у своїй відповіді, і, як інші описували в коментарях та інших відповідях, різні речі ВИСЛОЖЕННЯ правдиві або помилкові, але насправді це не так. Наприклад, порожній список вважається помилковим. Ось чому if []:ніколи не страчуватимуть.
Б. Еклз

означає, якщо a: означає, якщо a є істинним (коли a є цілим чи рядком) і якщо a: означає false, якщо a порожній список або порожній dict або false значення!

200

Усі значення вважаються "правдивими", за винятком наступних, які є "хибними":

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] - порожній list
  • {} - порожній dict
  • () - порожній tuple
  • '' - порожній str
  • b'' - порожній bytes
  • set() - порожній set
  • порожній range, якrange(0)
  • об’єкти, для яких
    • obj.__bool__() повертає False
    • obj.__len__() повертає 0

Значення "truthy" буде задовольняти перевірку, виконану ifабо whileтвердженнями. Ми використовуємо "truthy" і "falesy" для відмежування від boolзначень Trueі False.

Тестування істинної цінності


5
Чудовий список, спасибі Цілком академічне запитання, але чи знаєте ви, що таке порядок виконання? Думав, що ви можете створити об’єкт, де bool повертає True та len повертає 0 (або навпаки).
Хайден Крокер

16
@HaydenCrocker Спочатку це виглядає __bool__спочатку __len__. Якщо жоден із них не визначений, всі екземпляри вважаються "справжніми". Про це йдеться в документах щодо object.__bool__методу
Патрік Хаф

3
У версіях Python до 3,5 часові об'єкти, що представляють півночі UTC, вважалися помилковими. Ця стаття надає огляд звіту про помилку та можливого вирішення.
Джейсон В.

1
Цікаво, що для пакета datetime, datetime.min є триумфом, а timedelta (0) - хибним.
Девід Кінгхорн

1
@DavidKinghorn Це має сенс, правда? Мінімальне значення дати - це просто дата, як і будь-яка інша, вона ні в якому разі не дорівнює нулю. Навпаки, timedelta(0)це як нуль. Це з'явилося, коли було виявлено, що значення часу, що представляють півночі, були хибними, що було врешті зафіксовано: lwn.net/Articles/590299
Patrick Haugh,

5

Значення Truthy посилаються на об'єкти, що використовуються в булевому контексті, і не стільки булеве значення, яке повертає істинне або хибне. Візьміть їх як приклад:

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

4

Python визначає істинність, застосовуючи bool()до типу, який повертається Trueабо Falseякий використовується у виразі, як ifабо while.

Ось приклад для користувацького класу Vector2d і його екземпляр повертається, Falseколи величина (довжина вектора) дорівнює 0, інакше 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

Примітка: Якщо ми б не визначилися, __bool__він завжди повертав би значення True, оскільки екземпляри визначеного користувачем класу вважаються truthy за замовчуванням.

Приклад з книги: "Вільне володіння Python, чітке, стисле та ефективне програмування"


2

Де слід використовувати значення Truthy або Falsy? Це синтаксичний цукор , тому ви завжди можете їх уникати, але, використовуючи їх, можна зробити ваш код більш читабельним і зробити вас ефективнішими. Більше того, ви знайдете їх у багатьох прикладах коду, будь то в python чи ні, оскільки це вважається хорошою практикою.

Як було сказано в інших відповідях, ви можете використовувати їх у тестах і циклі. Ось два інші приклади в python 3 із значеннями за замовчуванням у поєднанні з or, sбудучи строковою змінною. Ви поширитеся і на подібні ситуації.

Без правди

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

з truthy це більш стисло:

print(s or 'Default value')

У python 3.8 ми можемо скористатися виразом призначення :=

без правди

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

з truthy він також коротший

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

або навіть коротше,

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

Без виразу призначення не можна обійтися

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

але не коротше. Деякі люди вважають цей s =...рядок незадовільним, оскільки він відповідає

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

тим не менш, ви можете дотримуватися цього стилю кодування, якщо вам буде комфортно з ним.


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

Якщо ви запустили цю петлю, ви побачили б це: 0: = у той час як false:

0 вважається помилковим


-2

Falsy означає щось порожнє, як порожній список, кортеж, як і будь-який тип даних із порожніми значеннями або None. Truthy означає: крім Truthy

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.