2016-09-17 13 views
3

私が後にしているもの:ユーザは0または1(合計4変数)しか入力できません。ユーザーが例えば2,1,1,0を入力すると、Only 0 and 1 allowedというエラーがスローされます。いくつかの変数の値の妥当性確認

私がこれまで試したどのような:

if (firstBinary != 0 or firstBinary != 1 and secondBinary != 0 
     or secondBinary != 1 and thirdBinary != 0 or thirdBinary != 1 
     and forthBinary != 0 or forthBinary != 1): 
    print('Only 0 and 1 allowed') 
else: 
    print('binary to base 10: result) 

問題:私は、このようなステートメントを使用する場合が、私は「私は例えば5入力、または私が手にしてもどちらかの結果を得るのみ

:0と1が、私はすべて1または0


を書いたのにもかかわらず、私は後何であったかのようだったこれを見つけたが、私はそれをしたいように、それはまだに動作しない「許可します

if 0 in {firstBinary, secondBinary, thirdBinary, forthBinary} or 1 in \ 
    {firstBinary, secondBinary, thirdBinary, forthBinary}: 
    print("Your result for binary to Base 10: ", allBinaries) 
else: 
    print('Only 0 and 1 allowed') 

このコードは、基本的に私が最初のコードサンプルで得た結果と同じ結果をもたらします。

+0

あなたは必ず 'プリント(「バイナリがするためにあなたの結果であり、 Base 10: "、allBinaries)'はインデントしてはいけませんか? –

+0

申し訳ありませんが、インデントされた(悪い英語)はどういう意味ですか?変数allbinariesは、a、b、c、dに8,4,2,1を掛け合わせて加算するだけです。これが何であれば – SunnlightBro

+0

私は行の前にスペースを追加してifブロックの内側に入れることを意味していました –

答えて

6

使用any:もちろん

v1, v2, v3, v4 = 0, 1, 1, 2 

if any(x not in [0, 1] for x in [v1, v2, v3, v4]): 
    print "bad" 

、あなたがリストを使用している場合、それはさらに良くなります

inputs = [1, 1, 0 , 2] 

if any(x not in [0, 1] for x in inputs): 
    print "bad" 
+0

ありがとう、シンプルで分かりやすい! – SunnlightBro

1

は、私はあなたがしようとしている二つの部分にそれを打破したいです解決:

特定の入力は有効ですか? 入力されたすべての入力は有効ですか?

>>> okay = [0,1,1,0] 
>>> bad = [0,1,2,3] 

>>> def validateBit(b): 
... return b in (0, 1) 

>>> def checkInput(vals): 
... return all(validateBit(b) for b in vals) 
... 
>>> checkInput(okay) 
True 
>>> checkInput(bad) 
False 
>>> 
+0

一般的に、この回答は、各操作を直交関数に分けるため、すべての1ライナーよりも優れたスタイルを示していると思います。それがどういうことかを一目瞭然に理解することは間違いありません。 (そして最初は正しかった - 他の多くの回答は正しいコードを持つために編集しなければならなかった!) – wjl

3

これは、Pythonの演算子の優先順位に起因します。 orオペレータがand演算子よりも高い優先順位であり、リストは次のようになります。

  • not
  • !=

    1. or
    2. and

    ==(出典:https://docs.python.org/3/reference/expressions.html#operator-precedence

    あなたが望むものとは異なるロジックになり

    if (firstBinary != 0 or (firstBinary != 1 and secondBinary != 0 or (secondBinary != 1 and \ 
    thirdBinary != 0 or (thirdBinary != 1 and forthBinary != 0 or (forthBinary != 1))))) 
    

    だから、Pythonはこのようなあなたの表現を(括弧は何が起こっているかを明確にしている)と解釈します。これには2つの解決策がありますが、最初は括弧を追加して式をあいまいにします。これは非常に退屈で長いったらしいです:

    if ((firstBinary != 0 or firstBinary != 1) and (secondBinary != 0 or secondBinary != 1) and \ 
    (thirdBinary != 0 or thirdBinary != 1) and (forthBinary != 0 or forthBinary != 1)) 
    

    他のアプローチは、内蔵のall機能を使用することです:

    vars = [firstBinary, secondBinary, thirdBinary, fourthBinary] 
    if not all(0 <= x <= 1 for x in vars): 
        print("Only 0 or 1 allowed") 
    
  • 0
    values = [firstBinary, secondBinary, thirdBinary] 
    if set(values) - set([0, 1]): 
        print "Only 0 or 1, please"