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(或早期版本)等
归档时间: |
|
查看次数: |
12495 次 |
最近记录: |