当前位置: 首页 > 面试题库 >

避免“ if x:return x”语句的Python方法

龙晟睿
2023-03-14
问题内容

我有一个方法可以依次调用其他4种方法来检查特定条件,并且每当一个方法返回Truthy时立即返回(而不检查以下方法)。

def check_all_conditions():
    x = check_size()
    if x:
        return x

    x = check_color()
    if x:
        return x

    x = check_tone()
    if x:
        return x

    x = check_flavor()
    if x:
        return x
    return None

这似乎是很多行李代码。与其执行每行2行的if语句,不如执行以下操作:

x and return x

但这是无效的Python。我在这里错过了一个简单,优雅的解决方案吗?顺便说一句,在这种情况下,这四种检查方法可能很昂贵,因此我不想多次调用它们。


问题答案:

您可以使用循环:

conditions = (check_size, check_color, check_tone, check_flavor)
for condition in conditions:
    result = condition()
    if result:
        return result

这样做还有一个好处,就是您现在可以使条件数可变。

您可以使用map()+
filter()(Python
3版本,使用Python
2中的future_builtins版本)来获取第一个这样的匹配值:


try:
    # Python 2
    from future_builtins import map, filter
except ImportError:
    # Python 3
    pass

conditions = (check_size, check_color, check_tone, check_flavor)
return next(filter(None, map(lambda f: f(), conditions)), None)

但是,如果更具可读性,则值得商bat。

另一个选择是使用生成器表达式:

conditions = (check_size, check_color, check_tone, check_flavor)
checks = (condition() for condition in conditions)
return next((check for check in checks if check), None)


 类似资料:
  • 我有一个方法,按顺序调用4个其他方法来检查特定条件,并且每当返回Truthy的内容时立即返回(不检查以下内容)。 这似乎有很多行李编码。我宁愿这样做,而不是每个2行if语句: 但这是无效的Python。我是否错过了一个简单、优雅的解决方案?顺便提一下,在这种情况下,这四种检查方法可能很昂贵,因此我不想多次调用它们。

  • 问题内容: 动物 狮子 鹿 测试动物 在上面的情况下,似乎没有问题,但是如果您有很多扩展的基类扩展,那么我们也需要那么多的if块。解决这个问题? 问题答案: 避免在基类中(不 使用 诸如or 的非描述性名称)发明任何新的人工方法的一种优雅方法是 使用 访问者模式 。这是一个例子: 动物 狮子 和 鹿 游客 测试动物

  • 问题内容: 在MS2000中工作,我有一个名为JobOwners的表,该表将Jobs(JPSID)映射到拥有它们的雇员(EmpID)。它还包含他们开始拥有该工作的日期(DateStarted),他们停止拥有该工作的日期(DateEnded)以及所有权是否处于活动状态(IsActive)。看起来像这样。 尽管没有活动的重复应该没问题,但不应有活动的JPSID重复。通过一些研究,我发现可以使用CHEC

  • 问题内容: 我正在尝试编写一个Java程序,该程序根据用户选择的内容初始化某些布局。我想做的是尝试避免编写一堆if语句,以便在需要添加更多布局的情况下可以对代码进行伸缩以供将来使用。我听说实现此目标的最佳方法是使用多态性,但是我对多态性的理解仍然有些模糊。 说我要实现这种情况: 我当时在考虑为类的实现创建一个接口。令我困惑的是它在main()中是如何工作的,我是否仍然不需要条件if或switch语

  • 问题内容: 我已经编写了类似这样的方法。但是我猜这应该进行重构。谁能建议最好的方法来避免使用多个if语句? 我在这里不能使用大小写转换,因为我的“条件”是。 问题答案: 您可以使用来保存您的解决方案: 为了使此代码起作用,您需要像在类中那样进行定义和定义,如下所示:

  • 问题内容: 今天,我有一个同事建议我重构代码,以使用label语句控制通过我创建的2个嵌套的for循环的流。我以前从未使用过它们,因为我个人认为它们会降低程序的可读性。如果论点足够扎实,我愿意改变使用它们的想法。人们对标签陈述有何看法? 问题答案: 如果您可以跳过两个循环(或一个包含switch语句的循环),则许多算法的表达会更容易。不要为此感到难过。另一方面,它可能表明解决方案过于复杂。因此,退