-
RISEBY
你误解了布尔表达式的工作原理; 他们不像英语句子一样工作,并猜测你在谈论所有名字的相同比较。您正在寻找: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}。
-
皈依舞
使用字典结构更容易解决您的问题:x = 0y = 1z = 3d = {0: 'c', 1:'d', 2:'e', 3:'f'}mylist = [d[k] for k in [x, y, z]]
-
GCT1015
写作的直接方式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很多ifs可以写成这样的东西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
-
犯罪嫌疑人X
如果你非常懒,可以将值放在数组中。如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])