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返回一个布尔值.结果,当我发现(如何)这有效时,我感到很惊讶.
有什么其他用例,和/或这种相当不直观的实现的理由是什么?
有什么其他用例,
简洁(因此清晰,一旦你习惯它,因为它毕竟不会牺牲可读性! - )任何时候你需要检查一些东西,如果它是真的那么使用那个东西,或者如果那个东西是另一个值是假的(这对and-扭转它or-我很刻意避免实际关键字,最喜欢或True和False,因为我说的每一个对象,不只是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)
或更狭窄的版本.
和/或这种相当不直观的实施的理由是什么?
远从"直观",初学者经常是由事实:一些语言(如标准帕斯卡)并绊倒没有指定评估顺序和短路的性质and和or; Turbo Pascal和语言标准之间的区别之一,就在当天使Turbo成为有史以来最受欢迎的Pascal方言,正是Turbo实现的and,or就像Python后来做的那样(而C语言早先做过......) .
还有什么其他用例,
没有。
这种相当不直观的实施的基本原理是什么?
“不直观”?真?我不同意。
让我们想想。
如果为假,则“ a 和 b”被伪造a。因此,第一个假值足以知道答案。为什么要转换a为另一个布尔值呢?它已经是假的了。还有多少假False?同样是假的,对不对?
因此a,的值-当与False- 相等时-足够假,这就是整个表达式的值。没有进一步的转换或处理。做完了
当a的值等于True再b的价值的需要的一切。没有进一步的转换或处理。为什么要转换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)则将强制进行显式转换。
| 归档时间: |
|
| 查看次数: |
5967 次 |
| 最近记录: |