你是怎么摆脱这个while循环的?

2024-04-18 14:15:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在读10年级(9年级),我正在为学校做一个程序,在python上把二进制数转换成十进制数,反之亦然。我的编码知识不是很好,所以程序可能没有它可以,所以请与我忍受的效率。你知道吗

下面的代码正在检查用户输入是否只包含1和0,并且不超过8位的最大值。当我运行它并输入一个无效的数字时,它工作正常,循环正常,但当我输入一个有效的数字时,它会继续返回到input命令,并要求我输入一些东西,而不是跳出循环并转到下一个东西。请帮帮我!你知道吗

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

Tags: or程序numberonlyinputlenifbin
3条回答

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

例如

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

>>> print(i)
9

主要的问题是,您从未设置退出循环的标志。在0-7的循环中,永远不会有索引8。 当您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)")

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

您在一篇评论中提到,您对遍历元素而不是使用位置访问的循环犹豫不决。它们比位置访问要快得多。下面是一个比较:

>>> 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可读性更强,速度更快。你知道吗

相关问题 更多 >