的for和while复合语句(环路)可以可选地具有一个else条款(在实践中,这种用法是相当罕见的)。
该else子句仅在for循环通过迭代终止而终止之后执行,或者在while循环的条件表达式变为false终止之后才执行。
for i in range(3): print(i) else: print('done') i = 0 while i < 3: print(i) i += 1 else: print('done')
输出:
0 1 2 done
该else条款并没有如果,循环终止一些其他的方式(通过执行break语句或通过引发异常):
for i in range(2): print(i) if i == 1: break else: print('done')
输出:
0 1
大多数其他编程语言都缺少else循环的此可选子句。else特别是关键字的使用通常被认为是令人困惑的。
这种子句的原始概念可以追溯到Donald Knuth,else如果我们从结构化编程之前的较早版本或较低级的汇编语言中用if语句和goto语句重写循环,则关键字的含义将变得清楚。
例如:
while loop_condition(): ... if break_condition(): break ...
等效于:
# 伪码 <<start>>: if loop_condition(): ... if break_condition(): goto <<end>> ... goto <<start>> <<end>>:
如果我们else在每个子句上附加一个子句,它们将保持等效。
例如:
while loop_condition(): ... if break_condition(): break ... else: print('done')
等效于:
# 伪码 <<start>>: if loop_condition(): ... if break_condition(): goto <<end>> ... goto <<start>> else: print('done') <<end>>:
for带有else子句的循环可以用相同的方式理解。从概念上讲,只要可迭代对象或序列仍有一些剩余元素,就有一个循环条件保持为True。
for...else构造的主要用例是简洁的搜索实现,例如:
a = [1, 2, 3, 4] for i in a: if type(i) is not int: print(i) break else: print("no exception")
为了使else此构造中的混淆少一些,可以将其视为“如果没有破坏”或“如果没有发现”。
有关此问题的一些讨论可以在for ... else线程的[Python-ideas]摘要中找到,为什么python为什么在for和while循环之后使用'else'?和循环语句的其他子句
问题内容: 许多Python程序员可能没有意识到循环和循环的语法包含一个可选子句: 子句的主体是执行某些类型的清理操作的好地方,并在循环的正常终止时执行:即,使用或跳过子句退出循环;执行后退出。我知道这只是因为我只是看着它(再次),因为我永远记得 当 该子句被执行。 总是?顾名思义,在循环的“失败”上?定期终止吗?即使循环退出?我永远不能完全确定,不查它。 我将不确定性归咎于关键字的选择:我发现这
问题内容: 我有一个打开文件的代码,计算中值并将该值写入单独的文件。一些文件可能是空的,因此我编写了以下循环来检查文件是否为空,如果是,请跳过它,增加计数并返回循环。它对找到的第一个空文件执行预期的操作,但对第二个不执行预期的操作。循环在下面 输出如下 第二个问题是,t以某种方式从小数点后一位上升到15位,而最后一位似乎增加了小数位?感谢您提供的所有帮助 编辑 该错误 似乎仅适用于仅使用一行示例的
例如,我想做这样的事情: 新建Select().from(Table).where(“id in?”,list).execute()
记录具有id和名称 带有@Convert的DocumentModel 记录转换器 如果recordIds有多个值(例如:docId=1),即使: 嵌套选择不工作 IN子句有和没有()不工作 子句的成员不工作 导致本机SQL直接无法工作 @公式不工作 而且问题似乎是记录应该是单引号-逗号分隔的,而不仅仅是逗号分隔的,因为它们是字符串。(本机SQL查询在这种情况下工作)
所以程序应该是:-获取用户的输入,直到用户键入“n或N”以显示停止的标志-当用户键入“n或N”时,程序正数和负数和。 还有我得到的 这个错误信息,我不知道是什么问题。提前谢谢你!
问题内容: 我有一个二维布尔数组’poorSignal’,需要编写一个返回网格的方法,如果数组上的某个点为true,则显示X,如果为false,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“丢失的返回语句”。我也不确定在打印数组时’return“ \ n”是否可以添加新行。 这是一个分配问题,所以我不能直接打印它,也不能仅打印布尔值-它必须是产生网格的方法。 问题答案: 编译器无