避免在Python中嵌套if else语句梯子

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

当你不知道如何准确描述这个问题时,很难找到这个问题的答案......

处理相当深(但固定)的嵌套测试集(您希望按顺序运行但在第一个测试得出成功结果后立即终止)的最惯用方法是什么?

代替下面的

选项 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.

    return None

选项3

最后,我可以使每个测试成为一个单独的函数如此处所述并迭代调用它们,前提是每个测试函数具有相同的参数集。

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
python if-statement nested conditional-statements
3个回答
1
投票

您可以选择任何选项,这完全取决于您的喜好。对于选项 2,我认为拥有许多

return
并不是一个坏主意,因为它们包含在条件代码中。仅当条件为
True
时才会执行它们。

在选项 1 中,您可以决定切换到

elif results:
而不是:

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

在您的代码中,您似乎正在检查相同的

results
,看起来只有一个
if
块会执行。您应该检查某些值,例如
if results == something

最后,选项 3 看起来更干净。最后,选择您感觉最舒服的一个。


0
投票

不确定当缩进的代码只执行一次时使用 while 是否合适,但它允许在找到结果时使用break命令终止:

def make_decision():

    while True:    

        results = ... some code or function that returns a list or None
        if results is not None:
            break

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

        ...etc.

        results = ... other code or function
        break

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

    return decision

我在

这个答案
中使用for _ in (True,)

找到了另一个例子

-1
投票

抱歉,现在再看一遍就很明显了:

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
© www.soinside.com 2019 - 2024. All rights reserved.