Почему моя ловушка ошибок для входов не работает так, как я намереваюсь? - PullRequest
0 голосов
/ 06 июля 2018

Почему эта ловушка ошибок не работает? Я хотел сделать так, чтобы, если кто-то набирает слово или число больше 1, ошибка перехватывает и повторяет вопрос, пока вы не введете правильный соответствующий ввод. Какие-либо предложения??

valid = 0
    while valid ==0:
        x = input('Enter 4 digits for X(0 or 1): ')
        while len(x)!=4:
            print('Try Again. Remember 4 digits and only use binary 1 or 0')
            x = input('Enter 4 digits for X: ')
        valid = 1
        for i in x:
            if i !='1' and i !='0':
                print('Try Again. Remember 4 digits and only use binary 1 or 0')
                valid=0



    valid = 0
    while valid ==0:
        y = input('Enter 4 digits for Y(0 or 1): ')
        while len(y)!=4:
            print('Try Again. Remember 4 digits and only use binary 1 or 0')
            y = input('Enter 4 digits for y: ')
        valid = 1
        for i in y: 
            if i !='1' and i !='0':
                print('Try Again. Remember 4 digits and only use binary 1 or 0')
                valid=0

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Я бы предложил поместить ваш код в функции, которые помогут разбить вещи на более мелкие части, и использовать регулярное выражение, чтобы проверить, есть ли символы, отличные от 1 или 0. Вот предложение, основанное на предоставленном вами коде (Код вот для Python3 +):

import re

def check_input(input_str):
    # Regex for function, look for any single char not 1 or 0
    regex = r"[^10]"

    # Check if input is 4 bits
    if len(input_str) != 4:
        print('Sorry, input must only be 4 bits')
        return False

    # Check if characters are only 1 or 0
    if re.search(regex, input_str):
        print('Sorry, input must be composed of only 1s or 0s')
        return False

    return True

def get_binary_input():
    good_input = False
    input_str = ""
    while not good_input:
        input_str = input('Enter 4 digits for X(0 or 1): ')
        good_input = check_input(input_str)
    return input_str

def main():
    binary_str = get_binary_input()
    print('Got binary string: {}'.format(binary_str))
    return

if __name__ == '__main__':
    main()
0 голосов
/ 06 июля 2018

Вы должны проверить длину ввода с помощью оператора if вместо цикла while. Вы также можете использовать all(map('01'.__contains__, value)), чтобы проверить, состоит ли строка из символов «0» или «1». И вы можете сделать x и y набором имен переменных и выполнить итерацию по одному и тому же коду, чтобы запросить их значения с той же логикой, и назначить значение либо как глобальную переменную, либо как значения dict.

for variable in 'x', 'y':
    while True:
        value = input('Enter 4 digits for %s (0 or 1): ' % variable)
        if len(value) == 4 and all(map('01'.__contains__, value)):
            globals()[variable] = value
            break
        print('Try Again. Remember 4 digits and only use binary 1 or 0')
print(x, y)
...