2016-10-27 26 views
1

xとy変数と比較する関数を作成します。この関数の中には、xとyを比較して整数を返すネストされたelifがたくさんあります。問題は今、特定のelifステートメントで実行されているときに、ステートメントが正しくてもステートメントを実行しなかったことです。関数戻り値の代わりに戻り値なし

def convertTo(self, x, y): 
    if(x == 0 & y == 0): 
     return 0 
    if(x == 0 & y == 1): 
     return 1 
    if(x == 0 & y == 2): 
     return 2 
    if(x == 0 & y == 3): 
     return 3 
    if(x == 1 & y == 0): 
     return 4 # Didn't return this line even though x = 1 and y = 0 
    else 
     return None 

def main(): 
    self.convertTo(0,0) 
    self.convertTo(0,1) 
    self.convertTo(0,2) 
    self.convertTo(0,3) 
    self.convertTo(1,0) # return None? Why? 
+4

あなたがしようとした 'and'代わりに'& 'のことがありますか? –

+3

@tobias_kオペレータの優先順位が異なります。 – interjay

+0

短絡?多分?ただの質問...とにかく、戻ってきたことをどうやって知っていますか?コードは何も出力しません –

答えて

9

あなたが思っていることをしていない連鎖的な等価比較を実行しています。ビット&は、==より高い優先度を持つため、最初に実行されます。

は交換してください:

x == 1 & y == 0 
# 1 == 1 & 0 == 0 
# 1 == 0 == 0 False! 

で:

x == 1 and y == 0 

参照:PythonでOperator precedence

+2

これは、基本的に 'x ==(1&y)== 0'として解析されます。 – RemcoGerlich

+0

AKA大人用PEMDAS! – n1c9

1

、 "&" と "と" 二つの異なることを行います。 "と"あなたが使用すべきものは、 "&"はバイナリ演算子です。

場合= 0011 1100

B = 0000 1101

その後、

& B = 0000 1100

を参照してくださいhttp://www.tutorialspoint.com/python/python_basic_operators.htm

+1

それだけでは説明全体ではありません。 – RemcoGerlich

+1

しかし、それはなぜこの場合に失敗するのか説明しません。なぜなら、すべての「True&True」が依然として真であるからです。臨界点は確かに演算子の優先順位です。 –

0

あなたに代わりに&の代わりに使用する必要があります。&はビット単位です。 Pythonで複数の条件をチェーン

一般的に行われている場合、elifの - else文以下のように:

if a and b: 
    # a and b both was true 
elif a and not b: 
    # a was true, but b wasn't 
else: 
    # none of the conditions matched 
あなたのコードで

、それがあればそれぞれにreturn文のためではなかった場合は、事実同じ2つの変数をチェックしていると、2つのif文が真であると評価される可能性があります。

if a: 
    # this will run if a was true 
if b: 
    # regardless of a this will run if b was true 
else: 
    # regardless of a this will only run if b was false 

また、このを見てみましょう:https://docs.python.org/3/tutorial/controlflow.html