天道酬勤,学无止境

least-astonishment

Python中的“布尔”运算(即:和/或运算符)(“Boolean” operations in Python (ie: the and/or operators))

问题 此方法搜索第一组单词字符(即[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) 这是相同的,并且已记录为行为。 正如此页明确指出的那样: 表达式x and y首先计算x ; 如果x为false,则返回其值;如果x为false,则返回其值。 否则,将评估y并返回结果值。 但是,作为布尔运算符(甚至在手册中也是如此),我期望and返回一个布尔值。 结果,当我发现这是如何工作时,我感到非常惊讶。 有什么其他用例,和/或这种相当不直观的实现的基本原理是什么? 回答1 还有什么其他用例, 简明(因此一目了然,因此很清晰,因为毕竟它根本不会牺牲可读性!-),任何时候您都需要检查某些内容,或者使用某些内容(如果为真)或使用其他值(如果该内容为真)是错误的(这是为- and - or -颠倒它,我非常有意避免使用实际的关键字,如True和False ,因为我在谈论的是每个对象,而不仅仅是bool !-)。 在任何计算机屏幕上的垂直空间都是有限的

2021-04-15 10:25:18    分类:技术分享    python   boolean-expression   least-astonishment

“Boolean” operations in Python (ie: the and/or operators)

This method searches for the first group of word characters (ie: [a-zA-Z0-9_]), returning the first matched group or None in case of failure. def test(str): m = re.search(r'(\w+)', str) if m: return m.group(1) return None The same function can be rewritten as: def test2(str): m = re.search(r'(\w+)', str) return m and m.group(1) This works the same, and is documented behavior; as this page clearly states: The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned. However, being a boolean operator (it even says

2021-03-30 03:10:17    分类:问答    python   boolean-expression   least-astonishment

“最少惊讶”和可变的默认参数(“Least Astonishment” and the Mutable Default Argument)

问题 长时间修改Python的任何人都被以下问题咬伤(或弄成碎片): def foo(a=[]): a.append(5) return a Python新手希望此函数始终返回仅包含一个元素的列表: [5] 。 结果是非常不同的,并且非常令人惊讶(对于新手而言): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() 我的一位经理曾经第一次遇到此功能,并将其称为“严重的设计缺陷”。 我回答说,这种行为有一个基本的解释,如果您不了解内部原理,那确实是非常令人困惑和出乎意料的。 但是,我无法(对自己)回答以下问题:在函数定义而不是函数执行时绑定默认参数的原因是什么? 我怀疑经验丰富的行为是否具有实际用途(谁真正在C中使用了静态变量,却没有滋生bug?) 编辑: 巴泽克举了一个有趣的例子。 连同您的大多数评论,特别是Utaal的评论,我进一步阐述了: >>> def a(): ... print("a executed") ... return [] ... >>> >>> def b(x=a()): ... x.append(5) ... print(x) ... a executed >>> b() [5] >>> b() [5, 5] 在我看来

2021-03-26 10:59:33    分类:技术分享    python   language-design   default-parameters   least-astonishment