Python中的"布尔"操作(即:和/或运算符)

Nul*_*ion 11 python boolean-expression least-astonishment

此方法搜索第一组单词字符(即:)[a-zA-Z0-9_],返回第一个匹配的组或None出现故障.

def test(str):
    m = re.search(r'(\w+)', str)
    if m:
        return m.group(1)
    return None
Run Code Online (Sandbox Code Playgroud)

相同的功能可以改写为:

def test2(str):
    m = re.search(r'(\w+)', str)
    return m and m.group(1)
Run Code Online (Sandbox Code Playgroud)

这工作原理相同,并且是记录在案的行为; 作为此页中明确指出:

表达式x and y首先评估x; 如果x为false,则返回其值; 否则,y将评估并返回结果值.

但是,作为一个布尔运算符(它甚至在手册上都这么说),我期望and返回一个布尔值.结果,当我发现(如何)这有效时,我感到惊讶.

有什么其他用例,和/或这种相当不直观的实现的理由是什么?

Ale*_*lli 6

有什么其他用例,

简洁(因此清晰,一旦你习惯它,因为它毕竟不会牺牲可读性! - )任何时候你需要检查一些东西,如果它是真的那么使用那个东西,或者如果那个东西是另一个值是假的(这对and-扭转它or-我刻意避免实际关键字,最喜欢或TrueFalse,因为我说的每一个对象,不只是bool- !).

任何计算机屏幕上的垂直空间都是有限的,并且,根据选择,最好花费在有用的可读性辅助工具(文档字符串,注释,策略性地放置空行来分隔块,......)上,而不是转向,例如:

inverses = [x and 1.0/x for x in values]
Run Code Online (Sandbox Code Playgroud)

分为六个如:

inverses = []
for x in values:
    if x:
        inverses.append(1.0/x)
    else:
        inverses.append(x)
Run Code Online (Sandbox Code Playgroud)

或更狭窄的版本.

和/或这种相当不直观的实施的理由是什么?

远从"直观",初学者经常是由事实:一些语言(如标准帕斯卡)并绊倒没有指定评估顺序和短路的性质andor; Turbo Pascal和语言标准之间的区别之一,就在当天使Turbo成为有史以来最受欢迎的Pascal方言,正是Turbo实现的and,or就像Python后来做的那样(而C语言早先做过......) .


S.L*_*ott 5

还有什么其他用例,

没有。

这种相当不直观的实施的基本原理是什么?

“不直观”?真?我不同意。

让我们想想。

如果为假,则“ a b”被伪造a。因此,第一个假值足以知道答案。为什么要转换a为另一个布尔值呢?它已经是假的了。还有多少假False?同样是假的,对不对?

因此a,的值-当与False- 相等时-足够假,这就是整个表达式的值。没有进一步的转换或处理。做完了

a的值等于Trueb的价值的需要的一切。没有进一步的转换或处理。为什么要转换b为另一个布尔值?价值是我们需要知道的。如果类似True,那就足够了。还有多少真实True呢?

为什么要创建虚假的其他对象?

或的分析相同。

为什么要转换为布尔值?它已经足够真实或错误。它能得到多少真值?


尝试这个。

>>> False and 0
False
>>> True and 0
0
>>> (True and 0) == False
True
Run Code Online (Sandbox Code Playgroud)

(True and 0)实际上是0,它等于False。对于所有实际目的而言,这都是错误的。

如果有问题,bool(a and b)则将强制进行显式转换。