for var in var语句不能按预期工作

时间:2017-01-06 17:01:04

标签: python python-3.x loops if-statement binary

我正在创建二进制到十进制转换器。我试图检查用户输入的有效性,只允许程序继续,如果输入只包含零和1。这就是我到目前为止所做的:

while valueCheck == False:
    value = input ("Please enter the binary value to convert to a decimal value.")
    for i in value:
        if not (i in "01"):
            print("Please enter only zeroes and ones.")
            break
        else:
            valueCheck = True

用户输入一个输入,如果有效,则valueCheck设置为True,终止循环,程序继续。如果输入无效,valueCheck仍为False,系统将再次要求用户输入。

但是,if not检查无法按预期工作。仅当无效字符位于输入的索引0中时,它才有效。

例如:

  • 输入:5111输出:Please enter only zeroes and ones,用户再次要求输入。

  • 输入:1115输出:Please enter only zeroes and ones,程序继续输入无效字符。该计划不应该继续。

我理解这种情况正在发生,因为for循环从最左边的索引值开始并检查。这就是为什么如果第一个元素包含无效字符,输出将按预期进行。如果第一个元素包含有效字符,那么程序将移至else并终止循环?

如何使程序继续while循环,直到输入中的所有字符都只有0和1,而不管它们在value中的位置?

2 个答案:

答案 0 :(得分:2)

是的,因为您在第一次检查后将valueCheck设置为True,正如您所说。

你可以利用这里else循环中的for子句,如果没有发生break则执行,即取消else子句:

while valueCheck == False:
    value = input ("Please enter the binary value to convert to a decimal value.")
    for i in value:
        if not (i in "01"):
            print("Please enter only zeroes and ones.")
            break
    else:
        valueCheck = True

答案 1 :(得分:1)

您在处理第一个valueCheck时将True设置为1,并且永远不会更改它。我的建议是(可能不是最好的风格,但代码逻辑的变化最小):

在打破for-loop

之前,

valueCheck设置为False