Как узнать, что значение1 И значение2 И значение3 <значение4? - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь обдумать тестирование нескольких значений в python. Допустим, у меня есть

value1 = 7
value2 = 2
value3 = 4

, и я хочу выяснить, меньше ли они 10. С одним значением, очевидно, так же просто, как

value1 < 10

, что приводит к True. Глядя на то, как я использую and на естественном языке, я предполагаю, что тестирование для всех - это просто

value1 and value2 and value3 < 10

, и это действительно приводит к True. Однако, если я изменю value1 = 20, вышеуказанное останется верным, хотя, очевидно, это False. Таким образом, если я не нашел огромную ошибку в python, я, очевидно, не понимаю, как работает and, и, к сожалению, документы, которые я могу найти , только мне не очень помогают (это действительно сложно найдите что-нибудь в документации, выполнив поиск and ...).

(value1 < 10) and (value2 < 10) and (value3 < 10)

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

(value1 and value2 and value3) < 10    

, что также дает мне ложное True.

Ответы [ 4 ]

2 голосов
/ 07 августа 2020

Я с удовольствием отвечу на ваш вопрос.

При использовании оператора if вы должны поставить «и» между логическими выражениями, т.е. если вы проверяете такой оператор, как if someVariable и что someVariable имеет значение, отличное от None, тогда вы всегда будете получать результат 'True', поэтому вместо этого попробуйте следующее:

if val1 < 10 and val2<10 and val3<10:
    <code body>

Позвольте мне объяснить, почему это работает, пока if (val1 and ...) < 10 не работает.

Это потому, что выражение val1 and val2, например, всегда будет возвращать True, пока значение обеих переменных не None, поэтому, когда вы ' Используя выражение val1 and val2 ..., вы, по сути, просто получаете ответ как: True < 10, что дает True.

Надеюсь, этот ответ был полезен. : D

1 голос
/ 07 августа 2020

Python предоставляет полезные встроенные функции any и all, которые позволяют писать читаемый код следующим образом:

if all(v < 10 for v in (value1, value2, value3)):
    ...
1 голос
/ 07 августа 2020
Оператор

Python and имеет небольшую особенность, на которую вы наткнулись:

val = 5
print(1 and val)
print(2 and val)
print(0 and val)
print(-1 and val)
print(-2 and val)

Вывод:

5
5
0
5
5

Итак, in Python and напрямую возвращает 0, если первое выражение оценивается как 0, иначе оно возвращает второе выражение!

Итак, в вашем случае val1 and val2 and val3 будет вернуть val3, так как остальные non-zero

1 голос
/ 07 августа 2020

Уже есть хорошие объяснения того, как работает оператор and, поэтому я просто хочу добавить быстрое решение для проверки, если несколько чисел меньше другого числа:

if max(value1, value2, value3) < value4:
    print("True")

Это работает, потому что встроенная функция max возвращает наибольшее количество заданных значений. Он также работает со списком или кортежом в качестве входных данных:

number = [value1, value2, value3]
if max(numbers) < value4:
    print("True")
...