2013-10-09 20 views
1

我有一個蟒示例代碼爲:如何在不檢查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。我在字典中做錯了什麼?

謝謝!

+2

你的'y == y'和'x == x'情況應該總是正確的嗎?在第二種方法中,字典中的「x」和「y」值將是字典定義時的值,而不是查找時的值。 – Blckknght

回答

1

波格丹解釋爲什麼你不能使用變量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,因爲這是內置類型的名稱。

+0

謝謝!爲我工作。 – user2766019

2

看來你並不完全理解Python的工作原理。字典不是模式匹配塊,就像你在Haskell或Erlang中一樣。它是一個具有具體值裏面的數據結構。你可以在你的定義之後嘗試寫print dict,看看裏面有什麼。

當您創建dict,目前具體值的xy用於創建密鑰。如果當時xy碰巧爲0,則(0,0)密鑰將被替換爲(x,y)(這就是爲什麼在您的情況下調用Case4)。

1

假設x = 0且y = 0。您在dict中的最終條目是(x,y):Case4或0,0,替換之前的任何0,0。然後你查找dict [x,y],或者真的dict [0,0]調用Case4 ......無論x,y如何,這都會發生。

堅持原來的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  
相關問題