Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是;或;在Python列表中是什么意思?_Python - Fatal编程技术网

什么是;或;在Python列表中是什么意思?

什么是;或;在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

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

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