python - сжатые сравнения - PullRequest
       27

python - сжатые сравнения

3 голосов
/ 06 октября 2011

Я здесь новый участник, а также новичок в python. Мой вопрос заключается в следующем, действительно ли иметь такую ​​строку?

if x or y is 'whatever':

Я проверил это в интерпретаторе и получаю противоречивые результаты. Казалось бы, эта линия дает более последовательные и ожидаемые результаты

if (x or y) is 'whatever':

Или всегда лучше явно все изложить как таковое

if x is 'whatever' or y is 'whatever':

Последний всегда работает, но я просто пытаюсь сделать свой код немного более лаконичным, но при этом следую рекомендациям. Я попытался выполнить поиск, чтобы не задавать лишний вопрос, но поиск «is» или «and» и «довольно сложно». Заранее благодарим за любую помощь.

edit: Спасибо всем за быстрые ответы. Это прекрасно работает для меня, когда мне нужно "или"

if 'whatever' in [x,y]:

Но как бы я сжал это, если мне нужны 'и'?

if x == 'whatever' and y == 'whatever':

Ответы [ 4 ]

8 голосов
/ 06 октября 2011

or не работает как на английском.

x or y возвращает x, если x является значением true-ish, в противном случае возвращается y. Строки верны, если они не пусты.

Хуже того, "is" имеет более высокий приоритет, чем "или", поэтому ваше выражение совпадает с x or (y is 'whatever'). Так что, если x не пустой, он возвращает x (что будет true, поэтому будет выполняться if). Если x пуст, он будет оценивать y is 'whatever'.

Кстати: не используйте «is» для сравнения равенства значений, используйте ==.

Вы хотите это (необязательные символы):

if (x == 'whatever') or (y == 'whatever'):

или более краткий, но незнакомый:

if 'whatever' in [x, y]:
3 голосов
/ 06 октября 2011

Python не английский.

if x or y is 'whatever':

означает:

if x or (y is 'whatever'):

То, что X истинно, ИЛИ "все"

if (x or y) is 'whatever':

x or y становится либо х, либо у. Если x имеет значение true, тогда он возвращает X, в противном случае он становится Y. Затем результат этого сравнивается с «чем угодно».

Вы никогда не должны сравнивать строки с is в любом случае. Строка должна сравниваться с использованием ==. это означает что-то другое, что иногда срабатывает случайно.

Ваш фактический запрос может быть записан как:

if 'whatever' in [x,y]:

Проверяет, есть ли строка в списке [x,y].

1 голос
/ 06 октября 2011
if x or y is 'whatever' # this is akin to if x or (y is 'whatever')

if (x or y) is 'whatever': # (x or y) returns the first non-false value...

if x is 'whatever' or y is 'whatever': # this is valid and correct (aside from the fact you shouldn't be using `is`, see below)

Возможно, у вас есть

if 'whatever' in (x, y)

или, в случае более длинного списка условий, неплохо использовать функцию ' any ':

if any([condition(k) for k in list])

Но в случае разоблачения это излишне, так как вы просто хотите знать, содержится ли «что угодно» в [x, y].

UPDATE:

учтите, что 'is' фактически сравнивает адреса памяти, и (как указано здесь ) не рекомендуется использовать его в строках.

1 голос
/ 06 октября 2011

Я думаю, что это сработает:

if "whatever" in (x, y):

Хотя это странно.

...