Я подозреваю, что вы запутались, что
np.where(a > 4) and np.where(a > 2)
возвращает результат 2-го выражения
(array([3, 4, 5], dtype=int64),)
Это ожидаемое поведение при использовании and
.
Оценка работает следующим образом:
True and "hello"
сначала True
оценивается.Поскольку это не ложь , возвращается "hello"
.
Это отлично работает для логического сравнения, но имеет неинтуитивное поведение, когда выражения не True
или False
True and True # returns True (the 2nd `True`)
False and (lambda: "hello") # the first `False` evaluates to `False` and is returned, the lambda function is not evaluated
Аналогично, для or
, если первое выражение равно truey , второе не оценивается, но если первое значение равно falsy , то2-е возвращается.
True or (print("False")) # first expression is True, the 2nd is not evaluated
False or (print("False")) # first expression is False, 2nd expression is evaluated, but nothing is returned as the 2nd expression returns nothing
(lambda:"hello") or False # returns the lambda function
False or (lambda:"hello") # also returns "hello"
False or True # first expression is false, therefore 2nd expression is returned.
Следующие вещи оцениваются как ложь :
None
False
0
- пустой список, т. Е.
[]
или list()
- пустой дикт, т.е.
{}
или dict()
- пустой набор,то есть
set()
Несколько нелогично, np.nan
будет оцениваться как правдивый
пример:
np.nan or 100 # returns np.nan
np.nan and 100 # returns 100
в то время как этоможет показаться странным выбором дизайна, это приводит к синтаксису, как возможно следующее:
# imagine that x is a list
# it it is not empty, return it
# do something more to x before returning it
if x:
return x
x = ["goodbye", "cruel", "world", "its", "over", "walk", "on", "by"]
return x