Python 'и' могут вернуть None? - PullRequest
0 голосов
/ 09 января 2019

Я смотрю на некоторый код, который, по-видимому, работает, так как никто не жаловался на это, но меня смущает то, что они написали:

if a and b is not None:
    # do something

Я всегда думал об операторе 'and' как о чем-то, что возвращает True или False, теперь я начинаю сомневаться в себе .. Что еще это могло бы вернуть, число ... Это, вероятно, не пифония, но я что-то упускаю - как кто-то может написать что-то подобное?

Ответы [ 5 ]

0 голосов
/ 09 января 2019

Это, безусловно, верно.

Когда мы берем переменную, которой присвоено значение, и выполняем операцию AND с другой переменной с нулевым значением (в python - None), операция AND приводит к нет . Следовательно, проверка может быть сделана. Чтобы прояснить мою точку зрения, пожалуйста, обратитесь ниже.

a=2;c=None; b=11
if a and c is not None:
    print("T")
else:
    print("F")

и

print(a and c)

Результат Нет

и

print(a and b)

приводит к ненулевому значению - в нашем случае 11

0 голосов
/ 09 января 2019

Согласно [Python 3]: приоритет оператора ( выделение принадлежит мне):

Следующая таблица суммирует приоритет оператора в Python, от наименьшего приоритета (наименьшего связывания) к наивысшему приоритету (наибольший связывания) .

...
and                                                 Boolean AND
not x                                               Boolean NOT
in, not in, is, is not, <, <=, >, >=, !=, ==        Comparisons, including membership tests and identity tests
...

Тот факт, что не следует после и , означает, что он будет оценен до и (оба могут вообще не оцениваться из-за ленивая оценка - спасибо @NickA за комментарий), поэтому выражение эквивалентно (добавление скобок для ясности):

if a and (b is not None):

Также, согласно [Python 3]: проверка истинности значения :

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

ваш , если оператор совершенно OK (производит bool ).

Примеры (с использованием [Python 3]: класс bool ( [x] ) ):

>>> bool(0)
False
>>> bool(100)
True
>>> bool([])
False
>>> bool([0])
True
>>> bool(None)
False
>>> bool({})
False
>>> bool({1: 1})
True
>>> bool(None is not None)
False
>>> bool(1 is not None)
True
>>> bool(2 and 1 is not None)
True
0 голосов
/ 09 января 2019

В этом коде вы сначала оцениваете b is not None, что является логическим значением.

А затем a неявно преобразуется в логическое значение (Для list / dict, False, если оно пустое. Для числа, False, если оно равно 0)

затем вычисляется and, который всегда возвращает логическое значение.

0 голосов
/ 09 января 2019

Это означает, что если a is Truthy и b is not None, а не то, что вы думали, это значит, то есть a and b is Truthy

a = 999
b = None

if a and b is not None:
    print("a is True but b is None")
else:
    print("a is True and b is not None")
0 голосов
/ 09 января 2019

Код выше означает:

Если a (верно), И b не None, то #do something.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...