如何在不检查Python中的其他条件的情况下直接切换到所需条件?

时间:2013-10-09 11:13:13

标签: python-2.7 if-statement dictionary

我有一个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。我在字典里做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

您似乎不太了解Python的工作原理。字典不是模式匹配块,就像在Haskell或Erlang中一样。它是一个内部具有具体值的数据结构。您可以尝试在定义后编写print dict并查看其中的内容。

创建dict时,xy的当前具体值用于创建密钥。如果当时xy恰好为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解释了为什么不能将变量xy用作词典中的键。当它们都为零时,所有4个键在定义时都是(0,0),因此字典只包含一个案例。您可以使用xy上的测试结果作为字典中的键(未经测试)来实现您想要的效果:

case_dict = {(True, True): Case1,
             (True, False): Case2,
             (False, True): Case3,
             (False, False): Case4,
            }  

case_dict[(x == 0, y == 0)]() 

请注意,您不应该调用变量dict,因为这是内置类型的名称。