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

新手上路,请多包涵

我有一个方法可以依次调用其他 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。我在这里缺少一个简单、优雅的解决方案吗?顺便说一句,在这种情况下,这四种检查方法可能很昂贵,所以我不想多次调用它们。

原文由 Bernard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 357
2 个回答

你可以使用一个循环:

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

这具有额外的优势,您现在可以使条件的数量可变。

您可以使用 map() + filter() (Python 3 版本,使用 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)

但如果这更具可读性是值得商榷的。

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

 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)

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了 Martijn 的好答案,您可以链接 or 。这将返回第一个真值,或者 None 如果没有真值:

 def check_all_conditions():
    return check_size() or check_color() or check_tone() or check_flavor() or None

演示:

 >>> x = [] or 0 or {} or -1 or None
>>> x
-1
>>> x = [] or 0 or {} or '' or None
>>> x is None
True

原文由 timgeb 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题