我正在尝试制作一个将多个变量与整数进行比较并输出三个字母的字符串的函数。我想知道是否有办法将其翻译成 Python。所以说:
x = 0 y = 1 z = 3 mylist = [] if x or y or z == 0 : mylist.append("c") if x or y or z == 1 : mylist.append("d") if x or y or z == 2 : mylist.append("e") if x or y or z == 3 : mylist.append("f")
这将返回一个列表:
["c", "d", "f"]
这样的事情可能吗?
您误解了布尔表达式的工作原理;它们不像英语句子那样工作,并猜测您在这里谈论的是所有名称的相同比较。您正在寻找:
if x == 1 or y == 1 or z == 1:
x并且y以其他方式自行评估(False如果0,True否则)。
x
y
False
0
True
您可以使用针对tuple的包含测试来缩短它:
if 1 in (x, y, z):
或者更好:
if 1 in {x, y, z}:
使用aset来利用恒定成本成员资格测试(即in,无论左侧操作数是什么,都需要固定的时间)。
set
in
当您使用 时or,python 将运算符的每一侧视为 单独 的表达式。该表达式x or y == 1首先被视为对 的布尔测试x,然后如果为 False,y == 1则测试该表达式。
or
x or y == 1
y == 1
这是由于运算符优先级。运算符的or优先级低于==测试,因此 首先 评估后者。
==
但是,即使 不是 这种情况,并且表达式x or y or z == 1实际上被解释为(x or y or z) == 1,这仍然不会像您期望的那样做。
x or y or z == 1
(x or y or z) == 1
x or y or z将评估为“真实”的第一个参数,例如 not False,数字 0 或空(有关 Python 在布尔上下文中认为 false 的详细信息,请参见布尔表达式)。
x or y or z
所以对于 values x = 2; y = 1; z = 0,x or y or z将解析为2,因为这是参数中第一个类似 true 的值。然后2 == 1会False,即使y == 1会True。
x = 2; y = 1; z = 0
2
2 == 1
反过来也一样;针对单个变量测试多个值;x == 1 or 2 or 3会因为同样的原因而失败。使用x == 1 or x == 2 or x == 3或x in {1, 2, 3}。
x == 1 or 2 or 3
x == 1 or x == 2 or x == 3
x in {1, 2, 3}