答案 0 :(得分:2)
情况就是这样:
1 == 1 => True
True and 0 => 0
0 or 0.1 => 0.1
您可以打开REPL进行模拟。
我认为令你困惑的是你可能认为or /和操作必须返回布尔值。
但是,并非如此,他们会将实际价值返回参与比较。
答案 1 :(得分:1)
and
和or
? a and b
是一种写作a if not a else b
的奇特方式。也就是说,如果a
是假的,那就归还它,因为假的,任何东西都是假的。否则,请返回b
。
a or b
是一种写作a if a else b
的奇特方式。也就是说,如果a
是真实的,那就归还它,因为真实或任何事情都是真实的。否则,请返回b
。
因此,and
和or
不一定返回布尔值。
1 == 1 and 0 or 0.1
为(1 == 1 and 0) or 0.1
,因为and
的优先级高于or
; 1 == 1 and 0
是1 == 1 if not 1 == 1 else 0
;清楚1 == 1
,结果是0
。最后一个表达式是0 or 0.1
0 if 0 else 0.1
,而0
显然是假的,所以我们得到0.1
。
请注意,and
为falsy留下了短路(允许您执行x < len(l) and l[x] == k
和or
短路的事情。
答案 2 :(得分:0)
1==1
表示正确。
bool and a or b
与C中的bool?a:b
相似。
但现在这是一个特殊情况a = 0
,在这种情况下,b
将会返回。
此表达式bool?a:b
将失败。它将执行以下操作:
1==1
为真,a
为false.So 1==1 and a
为false
然后,false or b
是b。
答案 3 :(得分:0)
如果你曾经学过学校的操作顺序,你就知道在乘法/除法之前会对指数进行评估。
从同样的意义上说,Python有一个order of operations,其中运算符and
和or
的优先级非常低。重要的是,or
的优先级低于==
,等式比较1 == 1 and 0 or 0.1
的优先级高于两者。
>>> 1 == 1 # equality comparison evaluates to True
True
>>> True and 0 # boolean AND evaluates to 0
0
>>> 0 or 0.1 # boolean OR evaluates to 0.1
0.1
以上将按以下顺序进行评估:
SELECT person.Id, person.firstName, person.lastName, person.birthdate, gender.gender, family.id, Relationship.description
FROM person
INNER JOIN gender on person.gender = gender.Id
INNER JOIN family on person.idFamily = family.Id
INNER JOIN Relationship on person.capRelationship = Relationship.id
INNER JOIN household on family.idHousehold = household.id;