避免在Python中嵌套if语句阶梯

时间:2018-07-07 21:41:06

标签: python if-statement nested conditional-statements

当您完全不知道如何描述该问题时,很难找到答案。

处理一组相当深(但固定)的嵌套测试的最惯用的方法是什么?这些测试要按顺序运行,但是在第一个测试成功后立即终止?

代替以下

选项1:(导致缩进过多)

def make_decision():

    results = ... some code or function that returns a list or None
    if results:
        decision = random.choice(results)
    else:
        results = ... other code or function
        if results:
            decision = random.choice(results)
        else:
            results = ... other code or function
            if results:
                decision = random.choice(results)
            else:
                results = ... other code or function
                if results:
                    decision = random.choice(results)

      ...etc.

                                else:
                                    decision = None

    print(decision)

    return decision

选项2

另一种选择是尽早从函数返回,但是我不确定分散这么多的返回值是一种好习惯,在这种情况下,我宁愿最后做最后一件事情(例如print(decision) ),然后返回:

def make_decision():

    results = ... some code or function that returns a list or None
    if results:
        return random.choice(results)

    results = ... other code or function
    if results:
        return random.choice(results)

    results = ... other code or function
    if results:
        return random.choice(results)

    ...etc.

    else:
        decision = None

    return decision

选项3

最后,只要每个测试函数具有相同的参数集,我就可以使每个测试成为一个单独的函数as described here并进行迭代调用。

def test1(args):
    ...

def test2(args):
    ...

def test3(args):
    ...

def make_decision():

    decision = None
    for test in [test1, test2, test3, ...]:
        results = test(args)
        if results:
            decision = random.choice(results)
            break

    print(decision)

    return decision

这看起来是最好的,但是我没有计划为每个测试都创建一个函数,有些测试可以用相同的函数完成,但参数不同,有些只是单行,而有些则是多行。那么,在开始循环之前,我是否必须构建函数和参数的列表?还是列出partial个函数?

欢迎提出任何更好的建议(在我继续上面的选项3之前)

更新2018-07-21:

未来的潜在选择

在我为这个问题而苦苦挣扎时,我不知道,PEP 572得到了批准(结果,范·罗瑟姆先生辞职了)。如果实施此PEP,我认为以下解决方案也是可行的:

def make_decision():

    if (results := ... some code or function) is not None:
        decision = random.choice(results)
    elif (results := ... some code or function) is not None:
        decision = random.choice(results)

    ...etc.

    else:
        decision = None

    return decision

2 个答案:

答案 0 :(得分:0)

您可以选择任何选项,这完全取决于您的偏好。对于选项2,我认为拥有许多return并不是一个坏主意,因为它们被包含在条件代码中。仅当该条件为True时,它们才会执行。

在选项1上,您可以决定切换到elif results:,而不是:

if results:
        # some code
    else:
        if results:
               # some code

在您的代码中,几乎好像您正在检查相同的results,看起来只执行一个if块。您应该检查一些值,例如if results == something

最后,选项3看起来更干净。总结一下,选择最适合自己的一种。

答案 1 :(得分:-2)

对不起,现在重新看一下就很明显了:

def make_decision():

    results = ... some code or function that returns a list or None

    if results is None:
        results = ... other code or function

    if results is None:
        results = ... other code or function

    ...etc.

    if results is None:
        decision = None
    else:
        decision = random.choice(results)
    print(decision)

    return decision