当前位置: 首页 > 编程笔记 >

Python带有“ else”子句的循环

轩辕煜
2023-03-14
本文向大家介绍Python带有“ else”子句的循环,包括了Python带有“ else”子句的循环的使用技巧和注意事项,需要的朋友参考一下

示例

的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位,而最后一位似乎增加了小数位?感谢您提供的所有帮助 编辑 该错误 似乎仅适用于仅使用一行示例的

  • 所以程序应该是:-获取用户的输入,直到用户键入“n或N”以显示停止的标志-当用户键入“n或N”时,程序正数和负数和。 还有我得到的 这个错误信息,我不知道是什么问题。提前谢谢你!

  • 例如,我想做这样的事情: 新建Select().from(Table).where(“id in?”,list).execute()

  • 记录具有id和名称 带有@Convert的DocumentModel 记录转换器 如果recordIds有多个值(例如:docId=1),即使: 嵌套选择不工作 IN子句有和没有()不工作 子句的成员不工作 导致本机SQL直接无法工作 @公式不工作 而且问题似乎是记录应该是单引号-逗号分隔的,而不仅仅是逗号分隔的,因为它们是字符串。(本机SQL查询在这种情况下工作)

  • 问题内容: 我有一个二维布尔数组’poorSignal’,需要编写一个返回网格的方法,如果数组上的某个点为true,则显示X,如果为false,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“丢失的返回语句”。我也不确定在打印数组时’return“ \ n”是否可以添加新行。 这是一个分配问题,所以我不能直接打印它,也不能仅打印布尔值-它必须是产生网格的方法。 问题答案: 编译器无