2017-02-03 3 views
1

Ich möchte verstehen, wie die folgende Anweisung funktioniert:Substring Suche in Python

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

Dies scheint ähnlich zu arbeiten:

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

Gibt es einen Unterschied zwischen den beiden Aussagen? Vielen Dank!

+8

"Ich möchte verstehen, wie die folgende Aussage funktioniert" - es tut es nicht. Versuchen Sie es mit '" telnet "' in 'connection_type' und' "ssh" 'nicht in' connection_type'. – user2357112

Antwort

3

Ja, es gibt einen Unterschied.

Die erste scheint zu funktionieren, tut es aber nicht.

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

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

Warum ist das? Der or-Operator in Python gibt den ersten True-Wert unter den Operanden oder den letzten zurück, wenn alle Werte False ergeben - deshalb funktioniert es nur für "ssh". Sie können von or wie der ternäre Operator anderer Sprachen denken:

first or second 

Ist wie:

bool(first) ? first : second 

Das zweite Recht ist.

Wenn connection_type das ganze Wort „telnet“ oder „ssh“ ist, können Sie auch tun:

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

Wenn „telnet“ oder „ssh“ nur Teil von connection_type sind, können Sie auch eine regelmäßige verwenden Ausdruck:

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

der Grund ist es nicht der Fall funktioniert, dass die eingeklammert ‚oder‘ Aussage zunächst den Vorrang alles innerhalb Klammern durchgeführt wird. Und da beide Operanden Strings sind, werten beide in Python als wahr aus. Aber was zurückgegeben wird, ist der tatsächliche Wert selbst, die Sie sehen können, wenn Sie laufen:

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

Sie „ssh“ erhalten. Dieses Verhalten wird als "Kurzschließen" bezeichnet, wobei der erste wahre Wert in einem 'or' zurückgegeben wird (in ähnlicher Weise wird der erste falsche Wert in einer 'und' Anweisung zurückgegeben). Einige Sprachen, die dies auch tun, geben diesen "wahrheitsgetreuen" Wert zurück, indem sie ihn in einen tatsächlichen booleschen Wert umwandeln (siehe here) - aber nicht im Pythons-Fall.

So ist der erste Operand Sie jedes Mal bekommen, wenn dieser Wert unter Regeln der Python falsch ergibt (siehe this) und das ist der Wert, der für die nachfolgende „in“ Anweisung verwendet wird - und damit die unintuitive Verhalten.