Python列表推导式中的“或”是什么意思?

我在 Django 源代码中找到了以下行:

actions.extend(self.get_action(action) for action in self.actions or [])

参数self.get_action(action) for action in self.actions or []必须是可迭代值的推导式,但我无法弄清楚该or []片段可能意味着什么。

没有if,所以or没有在布尔表达式中使用,这是我认为我在 Python 中熟悉的唯一用法。Web 搜索只返回布尔值or.

这是什么语法?

回答

也许这会让你更容易看到:

actions.extend(self.get_action(action) for action in (self.actions or []))

的值self.actions可能是None,即它的类型是Optional[List[T]]

使用or运算符将返回第一个评估为真的值,或返回它评估的最后一个值。这使用短路逻辑,这意味着如果您将多个值链接在一起,一旦找到第一个“真实”值,它将停止评估表达式(参见底部示例)。

对于基本语义,请考虑以下示例:

>>> a = None
>>> b = [1,2,3]
>>> c = a or b
>>> c 
[1,2,3]

这相当于:

a = None
b = [1,2,3]

if a:
     c = a
else:
     c = b

还有一些例子:

>>> a = 1
>>> b = 2
>>> a or b
1

>>> a = 1
>>> b = None
>>> a or b
1

>>> a = None
>>> b = 2
>>> a or b
2

>>> a = None
>>> b = None
>>> a or b
None

>>> a = None
>>> b = False
>>> a or b
False

>>> a = 0
>>> b = 0
>>> c = 1
>>> a or b or c
1

请注意,在最后一个示例中,我们能够将多个or调用链接在一起!

短路的一个例子(注意foo(2)没有被调用!):

>>> def foo(i):
...    print(f"foo: {i}")
...    return i
...
>>> foo(0) or foo(1) or foo(2)
foo: 0
foo: 1
1

  • It could be more useful to re-iterate that `or` is a "short-circuit operator", so it stops evaluating its operands upon encountering the first operand that evaluates to "true", and it always returns the last evaluated operand's value, which could be a non-boolean value.

以上是Python列表推导式中的“或”是什么意思?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>