5 回答
TA贡献1856条经验 获得超5个赞
你误解了布尔表达式的工作原理; 他们不像英语句子一样工作,并猜测你在谈论所有名字的相同比较。您正在寻找:
if x == 1 or y == 1 or z == 1:
x
并y
以其他方式自行评估(False
如果0
,True
否则)。
您可以使用针对元组的包含测试来缩短它:
if 1 in (x, y, z):
或者更好的是:
if 1 in {x, y, z}:
使用aset
来利用常量成本隶属度测试(in
无论左手操作数是多少,都需要一定的时间)。
使用时or
,python将运算符的每一侧视为单独的表达式。表达式x or y == 1
首先被视为布尔测试x
,如果为False,y == 1
则测试表达式。
这是由于运营商的优先权。的or
操作者具有比较低的优先级==
的测试,因此后者被评估第一。
但是,即使不是这种情况,并且表达式x or y or z == 1
实际上被解释为(x or y or z) == 1
相反,这仍然不会按照您的预期执行。
x or y or z
将评估第一个参数'truthy',例如not False
,numeric 0或empty(有关Python在布尔上下文中认为false的详细信息,请参阅布尔表达式)。
因此对于值x = 2; y = 1; z = 0
,x or y or z
将解析为2
,因为这是参数中第一个类似真值的值。那2 == 1
就是False
,即使y == 1
会True
。
这同样适用于逆; 针对单个变量测试多个值; x == 1 or 2 or 3
因为同样的原因会失败。使用x == 1 or x == 2 or x == 3
或x in {1, 2, 3}
。
TA贡献1851条经验 获得超3个赞
使用字典结构更容易解决您的问题:
x = 0
y = 1
z = 3
d = {0: 'c', 1:'d', 2:'e', 3:'f'}
mylist = [d[k] for k in [x, y, z]]
TA贡献1827条经验 获得超4个赞
写作的直接方式x or y or z == 0
是
if any(map((lambda value: value == 0), (x,y,z))): pass # write your logic.
但我不认为,你喜欢它。:)这种方式很难看。
另一种方式(更好)是:
0 in (x, y, z)
BTW很多if
s可以写成这样的东西
my_cases = { 0: Mylist.append("c"), 1: Mylist.append("d") # ..}for key in my_cases: if key in (x,y,z): my_cases[key]() break
TA贡献2080条经验 获得超4个赞
如果你非常懒,可以将值放在数组中。如
list = []list.append(x)list.append(y)list.append(z)nums = [add numbers here]letters = [add corresponding letters here]for index in range(len(nums)): for obj in list: if obj == num[index]: MyList.append(letters[index]) break
您也可以将数字和字母放在字典中并执行它,但这可能比简单的语句更复杂。这就是你想要更加懒惰的结果:)
还有一件事,你的
if x or y or z == 0:
将编译,但不是以你想要的方式编译。当你只是在if语句中放一个变量时(例子)
if b
程序将检查变量是否为空。编写上述语句的另一种方法(更有意义)是
if bool(b)
Bool是python中的一个内置函数,它基本上执行验证布尔语句的命令(如果你不知道那是什么,那么你现在正试着在你的if语句中做:) :)
我发现的另一种懒惰方式是:
if any([x==0, y==0, z==0])
添加回答
举报