2017-02-03 4 views
1

Я хочу, чтобы понять, как работает следующий оператор:поиск подстроки в Python

if ("ssh" or "telnet") in connection_type: 
... 

Это похоже на работу похож на:

if any(substr in connection_type for substr in ["ssh", "telnet"]): 
... 

Есть ли разница между этими двумя утверждениями? Благодаря!

+8

«Я хочу понять, как работает следующее утверждение» - это не так. Попробуйте использовать '' telnet '' в 'connection_type' и' 'ssh' 'не в' connection_type'. – user2357112

ответ

3

Да, есть разница.

Первый, похоже, работает, но нет.

>>> connection_type = 'ssh' 
>>> ("ssh" or "telnet") in connection_type 
True 

>>> connection_type = 'telnet' 
>>> ("ssh" or "telnet") in connection_type 
False 

Почему это? Оператор or в Python возвращает первое значение True среди операндов или последнего, если все они оцениваются до False - поэтому он работает только для «ssh». Вы можете думать о or как оператор троичного других языков:

first or second 

Это как:

bool(first) ? first : second 

Второй прав.

Если connection_type это целое слово «телнет» или «SSH», вы также можете сделать:

if connection_type in ('ssh', 'telnet'): 
    ... 

Если «телнет» или «SSH» являются только подстроки CONNECTION_TYPE, вы можете также использовать обычный выражение:

if re.search(r'ssh|telnet', connection_type): 
    ... 
0

причина, по которой не работает в том, что в квадратных скобках «или» заявление выполняется первым, учитывая приоритет либо в скобках. И так как оба операнда являются строками, они оба оценивают true в python. Но то, что возвращается фактическое значение само по себе, которое вы можете увидеть, если вы запустите:

a=("ssh" or "telnet") 
print(a) 

вы получите «SSH». Это поведение называется «короткое замыкание» , в результате чего возвращается первое истинное значение в «или» встреченном (аналогично будет возвращено первое ложное значение в операторе «и» ). Некоторые языки, которые также делают это, вернут это «правдивое» значение , превратив его в фактическое логическое значение (см. here) - но не в случае с питонами.

Таким образом, вы получите первый операнд каждый раз, если это значение не оценивает ложь по правилам Python (см this) и это значение, которое используется для последующего «в» заявлении - и, следовательно, неинтуитивное поведение.

Смежные вопросы