python - Python 中更好的 "return if not None"

标签 python syntax

有没有更好的方法来用python写这段代码?

result = slow_function()
if result:
    return result
[...]

函数 slow_function 可以返回值或 None 并且速度慢,所以这是不可行的:

if slow_function():
    return slow_function()

第一种方式没什么问题,但是使用临时变量对python来说似乎有点过分了。

当您使用 f 上的递归调用和本地假设来解决问题时,此代码非常有用,例如,您从列表中选择一个项目,然后检查是否有可行的解决方案,否则你必须选择另一个。比如:

def f(n):
    for x in xrange(n):
        result = slow_function(x):
        if result:
            return result
        [...]

用更惯用的东西不是更好吗:

def f(n):
    for x in xrange(n):
        return slow_function(x) if is not None

这可以扩展为检查任何类型的值。这将是一个易于阅读的 return if 语句。


代码爱好者的附加示例

假设你有一个数字列表:

lists = [[1,2,3],[4,5],[6,7,8],[9,10],...]

并且您想为每个列表选择一个项目,以便选择中最多有一个偶数。可能有很多列表,因此尝试每种组合都是浪费的,因为您已经可以看出,如果您开始选择 [1,2,4,...],则可能没有可行的解决方案。

def check(selected):
    even_numbers = filter(lambda n: (n % 2) == 0, selected)
    return len(even_numbers) < 2

def f(lists, selected=[]):
    if not lists:
        return selected

    for n in lists[0]:
        if check(selected + [n]):
            result = f(lists[1:], selected + [n])
            if result:
                return result

这样的语法不是更好吗:

def f(lists, selected=[]):
    return selected if not lists
    for n in lists[0]:
        if check(selected + [n]):
            return f(lists[1:], selected + [n]) if is not None

到目前为止,我所做的最好的事情是将函数转换为可行解决方案的生成器:

def f(lists, selected=[]):
    if not lists:
        yield selected
    else:
        for n in lists[0]:
            if check(selected + [n]):
                for solution in f(lists[1:], selected + [n]):
                    yield solution

最佳答案

在不知道您还想返回什么的情况下,有几种选择。

  1. 你可以只返回函数的结果,None 或者不:

    return slow_function()
    

    在这种情况下,您依靠调用者知道如何处理 None 值,并且实际上只是将您的逻辑转移到哪里。

  2. 如果你有一个默认值要返回而不是 None,你可以这样做:

    return slow_function() or default
    

    在上面这个中,如果 slow_functionNone (这是“假”),它将返回后一个值,否则,如果 slow_function返回一个“真实”值,它将返回。请注意,如果 slow_function 可以返回其他“虚假”值,例如 False[] 或 0,这些将被忽略。

  3. 或者,有时您拥有的是完全有效的代码。您想与一个值进行比较,如果它是值,则返回它。您拥有的代码的作用显而易见,有时这比代码的“聪明”更重要。

根据评论,如果您的代码必须在值为 None 时继续运行,那么 最明显 的方法是将其存储为临时值。但是,这不是一件坏事,因为它读取干净。

  • 计算一个值并将其存储为结果
  • 如果有有效结果,则返回。
  • 否则,继续做一些事情以获得更好的结果。

更好 通常是非常主观的,从计算的角度来看,我看不出有任何明显的方法可以改进这一点,而且正如所写的那样,它非常易于阅读,这是一个明显的优势。其他解决方案可能更短或更聪明,但人类可读性通常是代码的一个被忽视的优势。

关于python - Python 中更好的 "return if not None",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19415614/

相关文章:

java - 将 XML 位图数据转换为图像

Python Pandas 只能比较标记相同的系列对象

javascript - JavaScript 中的双引号与单引号

javascript - "condition && func()"用作语句的目的是什么?

python - 如何从 RSA key 对创建 JWK?

Python 名称可见性

python - 将 Clang 设置为 Windows 上 pip install 中使用的默认编译器

mysql - 重复键更新后的多次插入

java - Java中的<<或>>>是什么意思?

c - 为什么表达式和语句之间存在差异