循环语句的else子句的启发和影响?

Ari*_*ide 11 python history loops if-statement

Python循环语句可能有一个else子句,当且仅当循环未被a终止时才执行该子句break.换句话说,当条件变为False(有while)或迭代器耗尽时(带for).

这个循环 - 其他构造是否源自另一种语言(理论上的或实际的)?它是否被任何较新的语言所采用?

也许我应该问问Guido的前任,但他肯定太忙了,无法进行如此徒劳的调查.;-)

相关讨论和示例: 在for循环中使用'else'的Pythonic方法

Ken*_*Ken 4

Common Lisp 的 LOOP 宏中也有类似的功能,Peter Seibel 在此处进行了描述

...LOOP 提供了两个关键字,initially 和finally,它们引入了要在循环主体之外运行的代码。

在最初或最后之后,这些子句由所有 Lisp 形式组成,直到下一个循环子句开始或循环结束。所有初始形式都组合成一个序言,该序言在所有局部循环变量初始化之后和循环体之前立即运行一次。最后的形式类似地组合成尾声,在循环体的最后一次迭代之后运行。序言和结尾代码都可以引用局部循环变量。

即使循环体迭代零次,序言也始终运行。如果发生以下任一情况,循环可以返回而不运行尾声:

  • 执行 return 子句。
  • RETURN 、 RETURN-FROM 或其他控制构造的传输是从主体内的 Lisp 形式中调用的......

例如,在链接问题中找到的 Python 示例的一部分:

for v in known_variables:
    if self.bindings[v] is cell:
        return v
else:
    raise CannotSimplify
Run Code Online (Sandbox Code Playgroud)

可能看起来像这样:

(loop for v in known-variables
  when (eq (gethash v (slot-value self bindings)) cell)
  do (return v)
  finally (signal cannot-simplify))
Run Code Online (Sandbox Code Playgroud)

另一个观察:

Common Lisp 的条件系统也是独一无二的。有一次,有人问它来自哪里,并被指给肯特·皮特曼 (Kent Pitman) 的论文,他说是从 Maclisp 那里得到的。同样,Common Lisp 看起来怪异的 FORMAT 函数显然来自 Multics 通过Dan Weinreb

共同点是,语言特征往往不会遵循最能激发该语言灵感的祖先语言,而是被喜爱它们的个人带到他们正在开发的任何新语言中。因此,如果您想找出 Python for-的实际来源else,我会查找添加它的人,并查看他们在此之前使用的语言。