变量检查+在while循环中继续的干净方式

2024-07-02 12:18:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相对较大的main()函数,我需要在函数中的不同位置多次检查变量,然后决定是否相应地continue循环,如下所示:

def main():
    while True:
        ...
        if foo.check():
            reset()
            continue
        ...

foo在某种程度上充当计时员时,因此我需要在特定的时间间隔检查它。这三行在函数中出现大约3到5次

我讨厌这有多脏,有没有更干净的方法


Tags: 方法函数true间隔iffoomaindef
3条回答

您没有指定足够的信息。我有两个问题:

  1. 调用foo.check()幂等是否意味着它总是返回相同的值并且没有副作用
  2. 代码中是否有一条路径,在该路径中,您可以在不首先调用n-1th事件的情况下,在由continue语句控制的同一块中访问对foo.check()的nth调用

例如,如果答案的答案是yes,而第二个问题是no,那么您可以删除对foo.check()调用的第一次出现之外的所有内容,因为返回值显然是False,否则您将永远无法到达第二次出现

如果第一个问题的答案是肯定的,第二个问题是肯定的,那么如果对^ {CD5>}的调用是昂贵的,那么我可以考虑前面的设置:

check_result = foo.check()

然后用check_result替换对foo_check()的每个调用。但最终你还是需要做所有的检查。但在所有情况下,您都可以创建函数check_and_reset

def check_and_reset():
    if foo_check():
        reset()
        return True
    return False

然后您的代码变成:

if check_and_reset(): continue

我有两个建议:

建议1: 创建另一个函数并在任何地方调用

建议2: 把它做成一行

if foo.check():reset();continue

如果在运行一组任务时控制某些时间是一种复杂的方法,我建议在任务上引入一个循环。您甚至可以轻松地传递部分结果:

def task_a():
    ...

def task_c(some_input):
    ...

tasks = [lambda x: task_a(), task_c]
last_stage_output = None

while True:
    reset()
    for task in tasks:
        if not foo.check():
            break 
        last_stage_output = task(last_stage_output)

通过这种方式,您可以清楚地表明,这只是一系列要完成的任务,添加、删除或重新排列它们都很简单,并且时间逻辑集中在一个点上

相关问题 更多 >