当前位置: 首页 > 知识库问答 >
问题:

Pythonic方式避免“if x:返回x”语句

晋承运
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。我是否错过了一个简单、优雅的解决方案?顺便提一下,在这种情况下,这四种检查方法可能很昂贵,因此我不想多次调用它们。

共有3个答案

终祯
2023-03-14

不要改变它

正如其他各种答案所示,还有其他方法可以做到这一点。没有一个像原始代码那样清晰。

林建本
2023-03-14

您可以使用循环:

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

这还有一个额外的优点,即现在可以使条件的数量可变。

您可以使用map()(Python 3版本,使用Python 2中的future\u内置版本)获得第一个这样的匹配值:

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)
楚浩然
2023-03-14

除了Martijn的好答案之外,您还可以链接。这将返回第一个truthy值,如果没有truthy值,则返回无:

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

 类似资料:
  • 问题内容: 我有一个方法可以依次调用其他4种方法来检查特定条件,并且每当一个方法返回Truthy时立即返回(而不检查以下方法)。 这似乎是很多行李代码。与其执行每行2行的if语句,不如执行以下操作: 但这是无效的Python。我在这里错过了一个简单,优雅的解决方案吗?顺便说一句,在这种情况下,这四种检查方法可能很昂贵,因此我不想多次调用它们。 问题答案: 您可以使用循环: 这样做还有一个好处,就是

  • 理论上讲,总是可以到达嵌套在两个循环中的语句。 编译器不同意,并要求在循环之外使用语句。我想知道一种优雅的方法来优化这个方法,这超出了我目前的理解,我尝试的break实现似乎都不起作用。 附加的是来自赋值的一个方法,该方法生成随机整数,并返回循环遍历直到找到第二个随机整数为止的迭代,该迭代是在作为int参数传递给该方法的范围内生成的。

  • 条款29: 避免返回内部数据的句柄 请看面向对象世界里发生的一幕: 对象a:亲爱的,永远别变心! 对象b:别担心,亲爱的,我是const。 然而,和现实生活中一样,a会怀疑,"能相信b吗?" 同样地,和现实生活中一样,答案取决于b的本性:其成员函数的组成结构。 假设b是一个const string对象: class string { public: string(const char *value

  • 问题内容: 除了使用关键字调用构造函数时,Java语言中的语句可以返回值的确切情况是什么? 例: 如果我没记错的话,如果它是一个非函数原语,将被返回。否则返回。这个对吗? 换句话说,什么值可以引起? 问题答案: 确切的条件在内部属性上进行了描述,该属性由操作员使用: 来自ECMA-262第3条。版本规格: 13.2.2 调用对象的属性时,将执行以下步骤: 创建一个新的本机ECMAScript对象。

  • 请教一下,后端返回富文本中比如 <div>180<X<=360</div> 这种内容如何正常渲染?(因为<X<=360会被识别成html标签) 因为这个内容是先由后端生产出来的,应该没什么很好的办法直接用replace去锁定替换; 本来和后端商量后改为使用转义后的< 结果请求方法内自动把这个给替换了,因为用的是库,所以暂时没办法去避免这个问题 计划后面换一套请求方法,但是目前还是需要解决这个问题的

  • 问题内容: 当我打开多个流并且必须获得一个绝对事件来完成逻辑时,如何避免使用类似递归的结构。 我有几个文件必须通过tp进行一些处理。如何设置一个事件,告诉我所有这些事件何时完成?目前,我得到的是每个事件都是单独的。 我绝对可以同时开始每个视频流。我只需要以某种方式收集结局? 我可以为每个事件调用一个函数调用并对其进行计数……虽然听起来很hacky? 我觉得有办法兑现诺言,但我不知道怎么做。 问题答