什么是;或;在Python列表中是什么意思?
我在Django源代码中找到以下行:什么是;或;在Python列表中是什么意思?,python,Python,我在Django源代码中找到以下行: actions.extend(self.get_action(action) for action in self.actions or []) self.actions或[]中的action的参数self.get\u action(action)必须是一个可计算的值,但我无法理解或[]片段可能意味着什么 没有if,因此在布尔表达式中没有使用或,这是我认为在Python中唯一熟悉的用法。Web搜索只返回布尔用法或 这是什么语法?也许这会让您更容易看到: a
actions.extend(self.get_action(action) for action in self.actions or [])
self.actions或[]中的action的参数self.get\u action(action)必须是一个可计算的值,但我无法理解或[]
片段可能意味着什么
没有if
,因此在布尔表达式中没有使用或,这是我认为在Python中唯一熟悉的用法。Web搜索只返回布尔用法或
这是什么语法?也许这会让您更容易看到:
actions.extend(self.get_action(action) for action in (self.actions or []))
self.actions
的值可能是None
,即它的类型是一个可选的[List[T]]
使用或
运算符将返回计算结果为true的第一个值,或返回计算结果的最后一个值。这使用了短路逻辑,这意味着如果有多个值链接在一起,一旦找到第一个“truthy”值,它将停止计算表达式(参见下面的示例)
<>基本语义,考虑这个例子:
>>> 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
注意,在上一个示例中,我们可以将多个或调用链接在一起
短路示例(注意,foo(2)
不会被调用!):
它本质上是这样说的:
if self.actions:
对于自我行动中的行动:
actions.extend(self.get_action(action))
否则:#为了完整性,实际上没有必要
actions.extend([])
或不是生成器表达式的特殊语法。它可以帮助您在(self.actions或[])
周围加上括号,然后检查True或[]
和False或[]
的结果。重新迭代或
是一个“短路运算符”可能更有用,因此它会在遇到计算结果为“True”的第一个操作数时停止计算其操作数,它总是返回最后一个计算的操作数值,可能是非布尔值。@fountainhead我用一个例子更新了我的答案。谢谢你指出这一点!我这辈子从来没见过这个,但这真是个好主意。谢谢
>>> def foo(i):
... print(f"foo: {i}")
... return i
...
>>> foo(0) or foo(1) or foo(2)
foo: 0
foo: 1
1