检查中断条件是否被触发

vis*_*tor 4 python loops break sentinel

Python 中是否有一种优雅的方法来检测最后一次迭代是否涉及中断条件或根本没有?

C++ 示例:

int k, n = 10;
for (k = 0; k < n; k++)
    if (condition) break;

if (k == n) cout << "Never broke\n";
else        cout << "Broke at " << k << '\n';
Run Code Online (Sandbox Code Playgroud)

Python 示例:

n = 10
for k in range(n):
    if condition: break

if k == n: print("Never broke")
else:      print("Broke at", k)
Run Code Online (Sandbox Code Playgroud)

在Python中,我们不知道condition最后一次迭代是否为真,因为在这两种情况下k都是9。

为什么不直接使用range(n + 1)呢?因为在某些情况下,当 k 为 n 时,我们可能会收到“索引超出范围”错误。

一种可能的解决方法是使用如下所示的哨兵值,但有更好的方法吗?

n, flag = 10, True
for k in range(n):
    if condition:
        flag = False
        break

if flag: print("Never broke")
else:    print("Broke at", k)
Run Code Online (Sandbox Code Playgroud)

kin*_*all 5

使用for/ else。这就是它的具体用途。

for k in range(n):
    if condition:
       print("Broke at", k)
       break
else:
    print("Never broke")
Run Code Online (Sandbox Code Playgroud)

  • 我总是将“for”/“else”描述为大海捞针中的针:如果你找到了针,你就“断了”,如果没有针,“else”的情况告诉你大海捞针是除了干草什么也没有。 (3认同)