在列表理解中使用“和”或“或”,但结果无例外。为什么?
> [print(i) and print(i) for i in range(1)]
0
> [print(i) or print(i) for i in range(1)]
0
0
答案 0 :(得分:0)
and
和or
运算符支持惰性求值或短路。
在您的第一个示例中:
[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
。