你如何逃避这个while循环?

时间:2018-10-26 19:55:18

标签: python binary

我目前在10年级(9年级),我正在为学校编写一个程序,它将二进制数转换为十进制数,反之亦然。我的编码知识不是很丰富,因此该程序可能没有它所能达到的效率那么高,请耐心等待。

下面的代码正在检查用户输入是否仅包含1和0,并且不超过最大8位。当我运行它并输入一个无效的数字时,它可以正常工作并循环,但是当我输入一个有效的数字时,它会继续返回到输入命令,并要求我输入一些内容,而不是逃避循环并转到下一件事。请帮忙!

max_8bits = 1
only_bin = 1
while max_8bits > 0 or only_bin > 0:

    b2d_num = input("Enter a binary number:")

    for i in range(len(b2d_num)):
        if b2d_num[i] == "0" or b2d_num[i] == "1":
            if i == len(b2d_num):
                only_bin -= 1
        else:
            print("Only enter a binary number! (0's and 1's)")
            break

    if len(b2d_num) > 8:
        print("Only enter up to 8 bits!")
    elif len(b2d_num) <= 8:
        max_8bits -= 1

4 个答案:

答案 0 :(得分:4)

条件i == len(b2d_num)永远不会是True,因为最后一次循环迭代是使用i == len(b2d_num) - 1

例如

>>> for i in range(10):
       pass

>>> print(i)
9

答案 1 :(得分:2)

主要问题是,您永远不会设置标志来退出循环。您永远不会到达索引8处于0-7的循环中的地步。 当break退出for循环时,您没有正确地管理值。建议:

  1. 使用布尔值而不是整数:这就是您的逻辑。
  2. 简化值检查:使用内置的Python函数。

代码:

too_long = True
not_bin = True

while too_long or not_bin:

    b2d_num = input("Enter a binary number:")

    # Check input length
    too_long = len(b2d_num) > 8
    if too_long:
        print("Only enter up to 8 bits!")
        continue

    # Check input content
    not_bin = False

    for i, bit in enumerate(b2d_num):
        not_bin = not_bin or bit not in "01"

    if not_bin:
        print("Only enter a binary number! (0's and 1's)")

答案 2 :(得分:1)

由于if i == len(b2d_num):运算符不包含停止值,因此永远不会满足条件range(),因此i的最后一个值为len(b2d_num) - 1


Python语言的目标是易于阅读,您可以使用bool而不是int来改进代码。这可能是一个改进:

max_8bits = False
only_bin = False

while not (max_8bits and only_bin):
    b2d_num = input("Enter a binary number:")
    max_8bits = True
    only_bin = True

    # test first condition
    if len(b2d_num) > 8:
        max_8bits = False
        print("Only enter up to 8 bits!")

    # test second condition, but only if first condition is met
    if max_8bits:
        for char in b2d_num:
            if char not in ("0", "1"):
                only_bin = False
                print("Only enter a binary number! (0's and 1's)")
                break

您在评论中提到,您对迭代元素而不是使用位置访问的for循环犹豫不决。它们比位置访问快很多。这是一个比较:

>>> import timeit

>>> timeit.timeit('for elem in elem_list: _ = elem', 'elem_list = list(range(1000))', number=100000)
0.9983139920514077
>>> timeit.timeit('for i in range(len(elem_list)): _ = elem_list[i]', 'elem_list = list(range(1000))', number=100000)
3.1029140750179067

>>> timeit.timeit('for elem in elem_list: _ = elem', 'elem_list = list(range(10))', number=100000)
0.014086865936405957
>>> timeit.timeit('for i in range(len(elem_list)): _ = elem_list[i]', 'elem_list = list(range(10))', number=100000)
0.06772643199656159

如您所见,对列表元素进行位置访问会导致循环花费大约3倍的时间(这可能有所不同,但这是一个有力的指标)。使用for elem in elem_list更具可读性和速度。

答案 3 :(得分:0)

看来b2d_num = input("Enter a binary number:")循环中有代码while,这将导致该代码在while循环每次运行时运行。

此问题的解决方法非常简单,请将这段代码放在while循环上方,因此仅执行一次。