当在一个陈述中合并时,"和"和"或"如何工作?

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)


Ign*_*ams 8

and如果左边为真,则返回右操作数.or如果左边为假,则返回右操作数.否则它们都返回左操作数.据说他们合并了.

  • http://docs.python.org/tutorial/datastructures.html#more-on-conditions (2认同)

wes*_*cpy 5

C and X or Y 是Python用户代理的长期尝试 C ? X : Y

对于它的工作原理,在大多数情况下,除了如果XFalse-这导致了Python代码许多错误,因此在Python的常见问题,你会发现更多的正确的解决方案是(C and [X] or [Y])[0]因为有一个单一的元素,不管其评估布尔名单价值,永远True!例如:[None]TrueNone不是.上面的OP示例有效,因为字符串表示X不为空.

但是,所有这些都在Python 2.5中发生了变化,当三元或条件运算符添加到语言中时,允许您使用X if C else Y此处其他帖子中所述的清理程序.如果您看到使用较旧格式的代码,那是因为用户已经是一位长期没有采用新语法的Python程序员,他们剪切了其他旧代码,或者他们的雇主仍在使用2.4.x(或早期版本)等