我想了解以下声明的工作原理:
if ("ssh" or "telnet") in connection_type:
...
这似乎与以下内容类似:
if any(substr in connection_type for substr in ["ssh", "telnet"]):
...
这两个陈述之间有什么区别吗?谢谢!
答案 0 :(得分:3)
是的,有区别。
第一个似乎有效,但没有。
>>> connection_type = 'ssh'
>>> ("ssh" or "telnet") in connection_type
True
>>> connection_type = 'telnet'
>>> ("ssh" or "telnet") in connection_type
False
这是为什么? Python中的or
运算符返回操作数中的第一个True
值,如果所有操作数都计算为False
,则返回最后一个值 - 这就是它仅适用于“ssh”的原因。您可以将or
视为其他语言的三元运算符:
first or second
就像:
bool(first) ? first : second
第二个是对的。
如果connection_type
是“telnet”或“ssh”这个词,你也可以这样做:
if connection_type in ('ssh', 'telnet'):
...
如果“telnet”或“ssh”只是connection_type的子字符串,您还可以使用正则表达式:
if re.search(r'ssh|telnet', connection_type):
...
答案 1 :(得分:0)
它不起作用的原因是括号内的'或'声明 在给定内部任何内容的优先级的情况下首先执行 括号。因为两个操作数都是字符串,所以它们都是 在python中评估为true。但返回的是实际值 如果你跑,你可以看到它自己:
a=("ssh" or "telnet")
print(a)
你会得到" ssh"。这种行为被称为"短路" 从而在'或'中获得第一个真正的价值。遇到 返回(类似于'和'语句中的第一个错误值 将被退回)。一些也这样做的语言将返回这个真实的' 将其转换为实际布尔值的值(参见here) - 但不是在蟒蛇的情况下。
所以你每次都会获得第一个操作数,除非该值得到评估 在python的规则下为false(参见this) 这就是用于后续" in"的价值。 声明 - 因而也是不直观的行为。