Булевы операции с небулевыми переменными - PullRequest
0 голосов
/ 07 мая 2020
a = 5
b = -1
c = 2

print((c) and (b<0) and (a>0))

Следующий код выводит True. Но что означает (c) and (b<0) не and и or, используемые для переменных логического типа, которые c являются целыми числами?

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

В таких языках, как C, нет логического типа или значений; вместо них используются целые числа. Ноль - это ложь, все остальные целые числа - истина.

Python обобщает это на все значения. Действительно, существует логический тип, но он является подклассом int, а True и False - это буквально значения 1 и 0 соответственно. Любое значение может быть преобразовано в логическое значение, вызвав для него bool.

>>> bool(5)
True
>>> bool(0)
False
>>> bool("foo"), bool([1,2,3])
True, True
>>> bool(""), bool([])
False, False

«Истинность» значения зависит от его типа, но грубо говоря, нули и значения, подобные пустым контейнерам, имеют значение False, а все остальные значения - True. Кроме того, and и or не обязательно возвращают логическое значение:

x and y == y if bool(x) else x
x or y == x if bool(x) else y

bool используется, чтобы определить, истинно ли x или нет, но результат является одним из два фактических значения x или y.

Используя эквивалент для and, мы можем оценить ваше выражение как

c and b<0 and a>0 == (b < 0 if bool(c) else c) and a > 0
                  == b < 0 if bool(2) else c) and a > 0
                  == (b < 0 if True else c) and a > 0
                  == b < 0 and a > 0
                  == a > 0 if bool(b < 0) else b < 0
                  == a > 0 if bool(-1 < 0) else b < 0
                  == a > 0 if bool(True) else b < 0
                  == a > 0 if True else b < 0
                  == a > 0
                  == 5 > 0
                  == True

Я не подставлял значения для a, b и c одновременно, потому что and, or и условное выражение - все lazy ; они не оценивают операнд, если это не является абсолютно необходимым, как мы вскоре увидим.

Если вы измените c = 0, в процессе оценки будет получено значение c, а не логическое значение c. Обратите внимание, что нам нужно посмотреть на значение a, потому что a > 0 никогда не вычисляется.

c and b<0 and a>0 == (b < 0 if bool(c) else c) and a > 0
                  == (b < 0 if bool(0) else c) and a > 0
                  == (b < 0 if False else c) and a > 0
                  == c and a > 0
                  == a > 0 if bool(c) else c
                  == a > 0 if bool(0) else c
                  == a > 0 if False else c
                  == c
                  == 0
1 голос
/ 07 мая 2020

Если переменная не является логическим значением и вы проверяете, True или False, python проверяет, имеет ли эта переменная значение None или нет.

Например:

    a = 'any_value'
    print(a == True)

Этот оператор печатает True.

Но:

    b = None
    print(a == True)

Результаты в False.

1 голос
/ 07 мая 2020

В python любой объект можно проверить на истинность. В случае типов numeri c истинным считается любое ненулевое значение. Вы можете увидеть значения истинности разных типов здесь .

...