我有一个程序,可以运行固定次数的操作,或者“永远”运行操作,直到达到某个条件。实现很好,但我在获得令我满意的代码结构时遇到了困难。
我最初的逻辑归结为:
max_iterations = 5 # Either an integer or None (the number actually comes from user input)
stop_flag = False
i = 0
while not stop_flag:
do_some_operation(i)
i += 1
stop_flag = (i == max_iterations) or test_some_stop_condition()
但是我对此不太满意,我不喜欢同时存在
i
变量和 stop
标志。
可以通过将逻辑移至 while 来消除停止标志:
i = 0
while not ((i == max_iterations) or test_some_stop_condition()):
do_some_operation(i)
i += 1
但这对我来说似乎更难读。该条件现在不是特别容易理解,它已移至
while
。
itertools.count
进行迭代:
import itertools
max_iterations = 5 # Either an integer or None (the number actually comes from user input)
for i in itertools.count():
do_some_operation(i)
if (i == max_iterations) or test_some_stop_condition():
break
我对此也不是很满意,但我认为它相当干净且可读。理想情况下,我认为终止条件应该完全在
for
或 while
中,将循环体完全留给实际工作,但我想不出一种干净的方法。
有更好的解决方案吗?
一些注意事项:
i
变量是必需的,因为 do_some_operation
使用它。test_some_stop_condition()
是
True
还是
i
,
None
仍然可以返回 int
。这很好。(这个问题可能更适合https://codereview.stackexchange.com/,老实说我不确定......)
为什么不尝试使用普通的
while
循环,而不是使用 itertools
循环或 for
与 for
循环呢?既然您已经知道要执行多少次迭代,为什么不使用 range
和 for
循环?
for i in range(max_iterations + 1):
do_some_operation(i)
if test_some_stop_condition():
break
range()
返回一个数字序列,在您的情况下,它代表每个循环的迭代次数。如果只给出一个值,那么序列将自动从 0 开始并在给定值之前停止(这就是为什么我们放置 max_iterations + 1
)。简而言之,我们只是浏览一系列连续/递增的数字。
就像应该的那样,当
for
循环到达序列中的最后一个数字时,for 循环将自动结束,因此您不需要 if i == max_iterations
。
此外,即使您最终确实有多个终止条件,我建议您将它们分成单独的条件,而不是使用
or
或 或者您可以创建一个检查所有这些条件的函数。通过这种方式,您可以养成编写干净且可读的代码的习惯,并减少可能遇到的错误数量以及修复错误的时间(呜呼!)。