我有一个python示例代码:
输入:(x,y)
if x==0 and y==0:
print x+y+1
elif x==0 and y==y:
print x+y*y+2
elif x==x and y==0:
print x*x+y+3
else:
print x*x+y*y+4
如何直接切换到条件,如果我的输入为(x,y)=(0,0),它将输出1而不检查其他条件?
我尝试使用字典作为
输入:(x,y)
def Case1():
print x+y+1
def Case2():
print x+y*y+2
def Case3():
print x*x+y+3
def Case4():
print x*x+y*y+4
dict = {(0,0): Case1,
(0,y): Case2,
(x,0): Case3,
(x,y): Case4,
}
dict[(x,y)]()
当我用输入(x,y)=(0,0)尝试这个时,这给出了输出为4而不是1.看起来,我的代码只检查Case4。我在字典里做错了什么?
谢谢!
答案 0 :(得分:2)
您似乎不太了解Python的工作原理。字典不是模式匹配块,就像在Haskell或Erlang中一样。它是一个内部具有具体值的数据结构。您可以尝试在定义后编写print dict
并查看其中的内容。
创建dict
时,x
和y
的当前具体值用于创建密钥。如果当时x
和y
恰好为0,(0,0)
密钥将被(x,y)
替换(这就是为什么在您调用Case4
的情况下) 。
答案 1 :(得分:1)
假设x = 0且y = 0。您在dict中的最后一个条目是(x,y):Case4或0,0,替换之前的0,0。然后你查找dict [x,y],或者真的dict [0,0]调用Case4 ......无论x是什么,都会发生这种情况。
坚持原来的if
。代码很清楚,尽管你可以更简单:
if x==0 and y==0:
print 1
elif x==0:
print y*y+2
elif y==0:
print x*x+3
else:
print x*x+y*y+4
答案 2 :(得分:1)
Bogdan解释了为什么不能将变量x
和y
用作词典中的键。当它们都为零时,所有4个键在定义时都是(0,0),因此字典只包含一个案例。您可以使用x
和y
上的测试结果作为字典中的键(未经测试)来实现您想要的效果:
case_dict = {(True, True): Case1,
(True, False): Case2,
(False, True): Case3,
(False, False): Case4,
}
case_dict[(x == 0, y == 0)]()
请注意,您不应该调用变量dict
,因为这是内置类型的名称。