Что такое правда и ложь? Чем он отличается от Истины и Ложи?

120

Я только что узнал, что в python есть значения Truthy и Falsy, которые отличаются от нормальных Trueи False?

Может кто-нибудь подробно объяснить, что такое истинные и ложные ценности?

Где мне их использовать?

В чем разница между правдой и Trueценностями и ложью и Falseценностями?

Мартино
источник
20
Если bool(value)результат True, то valueэто правда .
wnnmaw
4
Вы сами придумали эти слова, не так ли? Так или иначе, посмотри __nonzero__и__bool__
звони
6
Значения истинности / ложности - это просто удобство в ситуациях, когда вам нужен какой-то двоичный тест. Это позволяет упростить код, а более простой код часто легче читать, что снижает вероятность появления ошибок.
Марк Рэнсом,
4
@zvone Правдивость и ложность обычно используются в коде гольфа, если языки программирования не имеют логических значений.
MilkyWay90
6
@zvone: «Правда» и «ложь» широко используются при сравнении языков программирования, например, PHP против PERL против Python против JS. (Абсолютно не кодовый гольф).
smci

Ответы:

78

Как описано в комментариях, это просто относится к значениям, которые оцениваются как True или False.

Например, чтобы увидеть, не пуст ли список, вместо такой проверки:

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

Вы можете просто сделать это:

if my_list:
   print("Not empty!")

Это связано с тем, что некоторые значения, такие как пустые списки, считаются ложными при вычислении логического значения. Непустые списки верны.

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

Идея таких терминов, как «правдивость» и «ложь», просто относится к тем значениям, которые считаются Истинными в случаях, подобных описанным выше, и к тем, которые считаются ложными.

Например, пустой список ( []) считается «ложным», а непустой список (например, [1]) считается «правдивым».

См. Также этот раздел документации .

Б. Эклз
источник
или это значит, если my_list верен?
Я предлагаю попробовать эти вещи в оболочке Python и убедиться в этом сами. ;) if my_listозначает «если my_list не пуст» и if not my_listозначает «если my_list пуст».
Б. Эклс
1
хорошо, у меня последняя небольшая путаница, я видел много мест, например, if a:что означает этот тип условий? означает ли это, если а истинно, или означает, если а ложно? или это означает, если а истинно или если а ложно?
1
Это означает «если истинно». Как я описал в своем ответе и как другие описывали в комментариях и других ответах, разные вещи СЧИТАЮТСЯ истинными или ложными, но на самом деле это не так. Например, пустой список считается ложным. Вот почему if []:бы никогда не казнить.
Б. Эклс
означает, что если a: означает, что истинно (когда a является целым числом или строкой), и если a: означает ложь, если a - пустой список или пустой словарь или ложные значения!
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

«Правдивое» значение удовлетворяет проверке, выполняемой операторами ifили while. Мы используем «правду» и «ложь», чтобы отличать от boolзначений Trueи False.

Проверка истинности

Патрик Хо
источник
5
Отличный список, спасибо. Полностью академический вопрос, но знаете ли вы, в каком порядке? Думал, что можно создать объект, где bool возвращает True, а len возвращает 0 (или наоборот).
Хайден Крокер,
16
@HaydenCrocker Тогда он __bool__сначала ищет __len__. Если ни один из них не определен, все экземпляры считаются "истинными". Это обсуждается в документации по object.__bool__методу
Патрик Хо
3
В версиях Python до 3.5 объекты времени, представляющие полночь по всемирному координированному времени, считались ложными. В этой статье дается обзор отчета об ошибке и возможного решения.
Джейсон В.
1
Интересно, что для пакета datetime datetime.min является правдивым, а timedelta (0) - ложным.
Дэвид Кингхорн
1
@DavidKinghorn В этом есть смысл, правда? Минимальное значение datetime - это такая же дата, как и любая другая, это ни в коем случае не похоже на ноль. Напротив, timedelta(0)это как ноль. Это поднялось, когда было обнаружено, что значения времени, представляющие полночь, были ложными, что в конечном итоге было исправлено: lwn.net/Articles/590299
Патрик Хо
5

Истинные значения относятся к объектам, используемым в логическом контексте, а не столько к логическому значению, которое возвращает истину или ложь. Возьмите их в качестве примера:

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True
adi1ya
источник
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, поскольку экземпляры определенного пользователем класса по умолчанию считаются истинными.

Пример из книги: «Свободное владение Python, четкое, лаконичное и эффективное программирование»

user1767754
источник
2

Где следует использовать значения истинности или ложности? Это синтаксический сахар , поэтому вы всегда можете избежать их, но их использование может сделать ваш код более читабельным и повысить эффективность. Более того, вы найдете их во многих примерах кода, будь то на Python или нет, потому что это считается хорошей практикой.

Как упоминалось в других ответах, вы можете использовать их в тестах if и while. Вот два примера в Python 3 с значениями по умолчанию в сочетании с or, sбудучи строковой переменной. Вы также будете распространяться на подобные ситуации.

Без правды

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

с правдой это более кратко:

print(s or 'Default value')

В python 3.8 мы можем воспользоваться выражением присваивания :=

без правды

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

с правдами он короче тоже

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"

тем не менее, вы можете придерживаться этого стиля кодирования, если вам это удобно.

Jlaurens
источник
-3

Ложь означает что-то пустое, например пустой список, кортеж, а также любой тип данных, имеющий пустые значения или None. Истина означает: кроме правды

Венкатеш
источник