在推导公式中使用'and'或'or'时如何理解Python列表理解?

时间:2019-05-25 08:49:48

标签: python list-comprehension

在列表理解中使用“和”或“或”,但结果无例外。为什么?

> [print(i) and print(i) for i in range(1)] 
0

> [print(i) or print(i) for i in range(1)]
0
0

2 个答案:

答案 0 :(得分:0)

andor运算符支持惰性求值或短路。

在您的第一个示例中:

[print(i) and print(i) for i in range(1)]

首先,执行print(i)并将其写入stdout。它不返回任何内容(None)。现在,python知道此表达式是and操作的一部分。由于None的布尔值是错误的,因此没有必要评估第二个print,因为第一个[print(i) or print(i) for i in range(1)] 将需要返回真实的布尔值。

第二个:

or

同一件事开始了。由于存在print,因此对第二个[None]进行评估是因为它有可能获得成功。这就是将两个0写入标准输出的原因。

由于列表理解未分配给任何内容,因此两者的实际结果都将丢失。两者的结果均为x and y。这两个逻辑运算符会检查布尔值,但也会返回涉及的对象。

对于y,对象x or y总是返回。 使用x

  • 如果x是一个“真实”对象,则返回y
  • 否则返回class ToDoModel: TABLENAME = "TODO" def __init__(self): self.conn = sqlite3.connect('todo.db') def create(self, text, description): query = f'insert into {TABLENAME} ' \ f'(Title, Description) ' \ f'values ("{text}","{description}")' result = self.conn.execute(query) return result query = f'insert into {TABLENAME}

答案 1 :(得分:0)

这与列表理解无关:

>>> print(0) and print(0)
0
>>> print(0) or print(0)
0
0

这是normal behavior of boolean operators in Python

  

表达式x和y首先计算x ;如果x为假,则返回其值

     

表达式x或y首先计算x ;如果x为true,则返回其值;否则,将评估 y 并返回结果值。

(请参阅https://en.wikipedia.org/wiki/Short-circuit_evaluation)。

如果您知道print(0)返回None

>>> print(0) is None
0
True

那:

  

以下值解释为false:False,,所有类型的数字零以及空字符串和容器

您有答案:

  • and的情况:评估print(0)(将0打印为副作用),即为假,并返回其值(None
  • or的情况:评估print(0)(打印0),即为假,然后评估第二个print(0)(打印0)返回其值( None