我目前在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
答案 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
循环时,您没有正确地管理值。建议:
代码:
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循环上方,因此仅执行一次。