如何运行循环直到达到终止条件或达到固定的迭代次数?

问题描述 投票:0回答:1

我有一个程序,可以运行一个操作固定次数,或者直到达到某个条件。实现很好,但我在获得令我满意的代码结构时遇到了困难。

我最初的逻辑归结为:

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/,老实说我不确定......)

python python-3.x loops logic
1个回答
0
投票

为什么不尝试使用普通的

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
或者您可以创建一个检查所有这些条件的函数。通过这种方式,您可以养成编写干净且可读的代码的习惯,并减少可能遇到的错误数量以及修复错误的时间(呜呼!)。

© www.soinside.com 2019 - 2024. All rights reserved.