Python 验证多个变量的值

Python 验证多个变量的值,python,Python,我的目标:用户只允许输入0或1(总共4个变量)。如果用户输入例如2、1、1、0,它应该抛出一个错误,说只允许0和1 到目前为止我所尝试的: if (firstBinary != 0 or firstBinary != 1 and secondBinary != 0 or secondBinary != 1 and thirdBinary != 0 or thirdBinary != 1 and forthBinary != 0 or forthBinary != 1):

我的目标:用户只允许输入0或1(总共4个变量)。如果用户输入例如2、1、1、0,它应该抛出一个错误,说
只允许0和1

到目前为止我所尝试的:

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时得到结果,要么在写入所有1或0时得到“仅允许0和1”


我发现这似乎是我所追求的,但它仍然不能像我希望的那样工作:

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')
此代码基本上给出了与第一个代码示例相同的结果。

使用
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"

我会把它分解为两部分,你要解决的是:

特定输入是否有效? 所有的输入都是有效的吗

>>> 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
>>>

这是由于python中的运算符优先级造成的。
运算符的优先级高于
运算符,列表如下所示:

  • 不是
  • =
    ==
  • (来源:)

    因此,python对表达式的解释如下(括号用于说明发生了什么):

    这会导致不同于您想要的逻辑。有两种可能的解决方案,第一种是添加括号,使表达式明确无误。这是相当乏味和冗长的:

    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")
    
    vars=[firstBinary,secondBinary,thirdBinary,fourthBinary]
    
    如果不是全部(0)您确定不应该缩进打印(“二进制到基数10的结果:”,allBinaries)
    吗?对不起,缩进(糟糕的英语)是什么意思?变量allbinaries只是将a、b、c、d与8、4、2、1相乘,然后将它们相加。如果这是你的意思,我的意思是在行之前添加空格,使其位于if块中哦,是的!你说得对,很抱歉这是一个错误。更正:)谢谢,简单易懂!总的来说,我认为这个答案比所有的一行程序显示出更好的风格,因为它将每个操作分离成正交函数。当然,通过快速浏览,更容易理解它的功能。(而且第一次是对的——许多其他答案必须经过编辑才能有正确的代码!)
    vars = [firstBinary, secondBinary, thirdBinary, fourthBinary]
    if not all(0 <= x <= 1 for x in vars):
        print("Only 0 or 1 allowed")
    
    values = [firstBinary, secondBinary, thirdBinary]
    if set(values) - set([0, 1]):
        print "Only 0 or 1, please"