oro*_*aki 7 python boolean-logic if-statement
出于某种原因,这个功能使我困惑:
def protocol(port):
return port == "443" and "https://" or "http://"
Run Code Online (Sandbox Code Playgroud)
有人可以解释幕后发生的事情的顺序,使其按照它的方式工作.
直到我尝试它才明白这一点:
要么A)
def protocol(port):
if port == "443":
if bool("https://"):
return True
elif bool("http://"):
return True
return False
Run Code Online (Sandbox Code Playgroud)
或者B)
def protocol(port):
if port == "443":
return True + "https://"
else:
return True + "http://"
Run Code Online (Sandbox Code Playgroud)
这是Python中的某种特殊情况,还是我完全误解了语句的工作原理?
Ale*_*lli 24
这是一个古老的习语; 插入括号以显示优先级,
(port == "443" and "https://") or "http://"
Run Code Online (Sandbox Code Playgroud)
x and y返回y如果x是truish,x如果x是falsish; a or b反之亦然,a如果它是真的,则返回,否则b.
因此,如果port == "443"为真,则返回该RHS and,即"https://".否则,它and是假的,所以or进入游戏并返回"http://",它的 RHS.
在现代Python中,更好的方法是翻译这个古老的习语是:
"https://" if port == "443" else "http://"
Run Code Online (Sandbox Code Playgroud)
and如果左边为真,则返回右操作数.or如果左边为假,则返回右操作数.否则它们都返回左操作数.据说他们合并了.
C and X or Y 是Python用户代理的长期尝试 C ? X : Y
对于它的工作原理,在大多数情况下,除了如果X是False-这导致了Python代码许多错误,因此在Python的常见问题,你会发现更多的正确的解决方案是(C and [X] or [Y])[0]因为有一个单一的元素,不管其评估布尔名单价值,永远True!例如:[None]是True但None不是.上面的OP示例有效,因为字符串表示X不为空.
但是,所有这些都在Python 2.5中发生了变化,当三元或条件运算符添加到语言中时,允许您使用X if C else Y此处其他帖子中所述的清理程序.如果您看到使用较旧格式的代码,那是因为用户已经是一位长期没有采用新语法的Python程序员,他们剪切了其他旧代码,或者他们的雇主仍在使用2.4.x(或早期版本)等