检查中断条件是否被触发
Check whether break condition was triggered
在 Python 中是否有一种优雅的方法来检测中断条件是否在 last 迭代或 never完全没有?
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';
Python 示例:
n = 10
for k in range(n):
if condition: break
if k == n: print("Never broke")
else: print("Broke at", k)
在 Python 中,我们不知道 condition
在最后一次迭代中是否为真,因为在这两种情况下 k 都是 9。
为什么不直接使用 range(n + 1)
呢?因为在某些情况下,当 k 为 n.
时,我们可能会得到 "index out of range" 错误
一种可能的解决方法是使用如下所示的标记值,但是有更好的方法吗?
n, flag = 10, True
for k in range(n):
if condition:
flag = False
break
if flag: print("Never broke")
else: print("Broke at", k)
使用for
/else
。这就是它的具体用途。
for k in range(n):
if condition:
print("Broke at", k)
break
else:
print("Never broke")
不一定更好,但通常您可以将循环压缩为使用 any
或 all
(当您只关心是否找到值时)或 next
(因为当你关心找到的值时)。
例如,要找到满足某些测试的第一个项目,或者 None
如果不存在这样的项目,您可以使用双参数 next
加上生成器表达式:
needle = next((x for x in haystack if isneedle(x)), None)
if needle is not None:
... do stuff with needle ...
else:
... no needle ...
或大致等同于一个参数 next
和异常处理:
try:
needle = next(x for x in haystack if isneedle(x))
except StopIteration:
... no needle ...
else:
... do stuff with needle ...
一个现实的用例可能是通过试验除法识别素数。在那种情况下,你不关心你发现了什么因素,你只关心有一个因素,所以你可以编写一个测试函数:
num = ...
isnumprime = num >= 2 and all(num % f != 0 for f in range(2, int(num ** 0.5) + 1))
for
/else
是一个完全足够的方法来做到这一点(见其他答案),但是 any
/all
/next
(通常生成器表达式)在特定上下文中可以更清晰。
在 Python 中是否有一种优雅的方法来检测中断条件是否在 last 迭代或 never完全没有?
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';
Python 示例:
n = 10
for k in range(n):
if condition: break
if k == n: print("Never broke")
else: print("Broke at", k)
在 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)
使用for
/else
。这就是它的具体用途。
for k in range(n):
if condition:
print("Broke at", k)
break
else:
print("Never broke")
不一定更好,但通常您可以将循环压缩为使用 any
或 all
(当您只关心是否找到值时)或 next
(因为当你关心找到的值时)。
例如,要找到满足某些测试的第一个项目,或者 None
如果不存在这样的项目,您可以使用双参数 next
加上生成器表达式:
needle = next((x for x in haystack if isneedle(x)), None)
if needle is not None:
... do stuff with needle ...
else:
... no needle ...
或大致等同于一个参数 next
和异常处理:
try:
needle = next(x for x in haystack if isneedle(x))
except StopIteration:
... no needle ...
else:
... do stuff with needle ...
一个现实的用例可能是通过试验除法识别素数。在那种情况下,你不关心你发现了什么因素,你只关心有一个因素,所以你可以编写一个测试函数:
num = ...
isnumprime = num >= 2 and all(num % f != 0 for f in range(2, int(num ** 0.5) + 1))
for
/else
是一个完全足够的方法来做到这一点(见其他答案),但是 any
/all
/next
(通常生成器表达式)在特定上下文中可以更清晰。