此方法搜索第一组单词字符(即:[a-zA-Z0-9_]
),返回第一个匹配的组或None
万一失败。
def test(str):
m = re.search(r'(\w+)', str)
if m:
return m.group(1)
return None
相同的函数可以重写为:
def test2(str):
m = re.search(r'(\w+)', str)
return m and m.group(1)
这工作原理是一样的,并且是有记录的行为;作为这一页 http://docs.python.org/reference/expressions.html#and明确指出:
表达方式x and y
首先评估x
; if x
为 false,则返回其值;否则,y
进行评估并返回结果值。
然而,作为一个布尔运算符(它甚至在手册上这么说),我期望and
返回一个布尔值。结果,我被惊讶地 http://en.wikipedia.org/wiki/Principle_of_least_astonishment当我发现这是如何运作的时。
这还有哪些其他用例,和/或这种相当不直观的实现的基本原理是什么?
这还有什么其他用例,
简洁(因此一旦你习惯了它就清晰,因为毕竟它确实not完全牺牲可读性!-) 任何时候你需要检查某些东西,如果它是真的,则使用该东西,或者如果该东西是假的,则使用另一个值(这是为了and
-- 将其反转为or
——而我是very故意避免实际的关键字或类似内容True
and False
,因为我正在谈论every对象,而不仅仅是bool
!-).
任何计算机屏幕上的垂直空间都是有限的,并且,如果有选择,最好花在有用的可读性辅助工具上(文档字符串、注释、策略性地放置空行来分隔块……),而不是转向,例如,如下所示的行:
inverses = [x and 1.0/x for x in values]
分为六种,例如:
inverses = []
for x in values:
if x:
inverses.append(1.0/x)
else:
inverses.append(x)
或更狭窄的版本。
和/或这样做的理由是什么
相当不直观的实现?
远非“不直观”,初学者经常会被某些语言(如标准 Pascal)这样做的事实所绊倒。not指定评估的顺序和短路性质and
and or
; Turbo Pascal 和语言标准之间的差异之一正是 Turbo 实现的,该标准在当时使 Turbo 成为有史以来最流行的 Pascal 方言and
and or
就像后来的 Python 所做的那样(以及更早的 C 语言所做的......)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)