Условие 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
более читабельно и быстрее.