Как вы избежите этого цикла? - PullRequest
0 голосов
/ 26 октября 2018

В настоящее время я учусь в 10 классе (9-й класс) и создаю программу для школы, которая преобразует двоичные числа в десятичные и наоборот на python. Мои знания в области кодирования невелики, поэтому программа может быть не настолько эффективной, как может быть, поэтому, пожалуйста, потерпите меня.

Приведенный ниже код проверяет, содержит ли пользовательский ввод только 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 голосов
/ 26 октября 2018

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

0 голосов
/ 26 октября 2018

Условие i == len(b2d_num) никогда не является True, поскольку последняя итерация цикла выполняется с i == len(b2d_num) - 1.

Например,

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

>>> print(i)
9
0 голосов
/ 26 октября 2018

Основная проблема в том, что вы никогда не устанавливаете свои флаги для выхода из цикла. Вы никогда не добьетесь того, чтобы иметь индекс 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)")
0 голосов
/ 26 октября 2018

Похоже, что у вас есть код b2d_num = input("Enter a binary number:") внутри цикла while, который будет запускать этот код каждый раз во время выполнения цикла while.

Исправить это довольно просто, поместите этот кусок кода чуть выше цикла while, чтобы он выполнялся только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...