Ограничение и проверка входов в python - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь ограничить длину своего ввода, а затем проверить, является ли он одним из трех белых символов. Борьба с финальной частью:

while True:
    try:
        letter=input("Please enter a character: ") #most intuitive way for me was the assert function but very happy to hear any other ways
        assert len(letter) !=1
    except AssertionError:
        print("Please type only ONE character")
    else:
        whitespace=["\n"," ","\t"] #i believe the list specification here makes the not in code invalid? believe the two may not be compatible but errors not reached there yet
        if whitespace not in letter:
            print("Your character in lower case is: "+str(letter).lower())
        else:
            print("You typed a white space character!")

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Я бы посоветовал вам не использовать исключения, потому что они очень нестабильны. Вместо этого я бы использовал условия if / else, например:

    letter = input('Please enter a character: ')
    if len(letter) == 1:
        if letter in '\n\t ':
            print('You typed a white space character!')
        else:
            print('Your character in lowercase is {}'.format(letter.lower()))
    else:
        print('Please type only ONE character')```
1 голос
/ 16 июня 2020

Добро пожаловать в Stackoverflow!

Похоже, ошибка находится в строке if whitespace not in letter:. На самом деле должно быть наоборот: if item not in list:. У вас есть if list not in item:.

Кроме того, это может помочь вам, если я немного переформатирую ваш код.

while True:
    letter = input('Please enter a character: ')

    if len(letter) != 1:
        print('Please type only ONE character')
        continue

    if letter in ['\n', ' ', '\t']:
        print("You typed a white space character!")
        continue

    lowercase_letter = letter.lower()
    print(f'Your character in lower case is: {lowercase_letter}')

Если вы еще не видели pylint, я бы порекомендовал вы посмотрите на это. Это поможет вам отформатировать код в соответствии со стандартом PEP8. Он также неплохо указывает на некоторые простые ошибки в вашем коде.

Исключения возникают для сообщения об ошибках вызывающим функциям, т.е. вы не можете выполнять работу, которую должна выполнять функция, потому что ввод или Состояние системы не соответствует требованиям функции.

Перехват исключений предназначен для обработки определенных c ошибок, которые вы знаете, как обрабатывать в функции более высокого уровня. Так, например, если вы пытаетесь прочитать файл, а он не существует. В вашей программе это означает, что пользователь не установил специальный флаг c в файле конфигурации ... так что вы можете перехватить это исключение и сообщить пользователю, как исправить проблему.

Поднятие Exception и перехватить его в той же функции (по крайней мере, в этом случае) - это просто очень сложный способ написания оператора if.

При написании оператора if-else неплохо попробовать и сделайте ветвь if положительной. Это означает, что избегайте if not ...: else:, если можете.

В вашем коде letter уже является строковым объектом, поэтому нет необходимости создавать новый строковый объект с str(letter). В python все является объектом, даже литералы.

Оператор continue переходит к следующей итерации l oop. Ничего после continue не выполняется в текущей итерации l oop. Вы также можете посмотреть оператор break, завершающий выполнение l oop. В качестве упражнения вы можете посмотреть на добавление дополнительной проверки в свой код, чтобы увидеть, набрал ли пользователь «выйти», а затем break. Как вы думаете, что произойдет?

if letter.lower() == 'quit':
    break

Это должно быть добавлено перед проверкой отдельных букв, иначе вы никогда не доберетесь до этой проверки.

Наконец, вместо использования конкатенации строк в вашем заявлении на печать (используя str + str). Вы можете использовать f-строки, форматировать строки, как в примере f'Hi my name is {name} and I am from {home}', где name и home - строковые переменные.

Надеюсь, это помогло!

...