×
Перевод статьи «How to Validate user input in Python».
Принимая пользовательский ввод, вы ожидаете получить данные определенного типа и вида. Например, целое число в некотором диапазоне или строку текста ограниченной длины. Но вы не можете быть уверены, что пользователь введет все правильно. Поэтому пользовательский ввод нужно проверять.
Содержание
Как проверять пользовательский вводЗапрос ввода данных, пока input не будет валиднымПроверка ввода на соответствие нескольким условиям (or)Проверка ввода на соответствие нескольким условиям (and)Принятие ввода до нажатия Enter
Как проверять пользовательский ввод
Для валидации данных, вводимых пользователем:
Используйте цикл while, который будет работать, пока пользователь не введет валидное значение.На каждой итерации проверяйте, является ли введенное значение валидным.Если значение валидно, прервите цикл while при помощи break.
# Validating integer user input
num = 0
while True:
try:
num = int(input(“Enter an integer 1-10: “))
except ValueError:
print(“Please enter a valid integer 1-10”)
continue
if num >= 1 and num <= 10:
print(f’You entered: {num}’)
break
else:
print(‘The integer must be in the range 1-10’)
# ———————————————-
# Validating string user input
password = ”
while True:
password = input(‘Enter your password: ‘)
if len(password) < 5:
print(‘Password too short’)
continue
else:
print(f’You entered {password}’)
break
print(password)
Первый пример проверяет числовой пользовательский ввод в цикле while.
Если блок try отрабатывает успешно, значит, пользователь ввел целое число.
num = 0
while True:
try:
num = int(input(“Enter an integer 1-10: “))
except ValueError:
print(“Please enter a valid integer 1-10”)
continue
if num >= 1 and num <= 10:
print(f’You entered: {num}’)
break
else:
print(‘The integer must be in the range 1-10’)
Оператор if проверяет, входит ли введенное число в диапазон 1-10. Если входит, мы прерываем цикл while.
Если введенное пользователем число не входит в указанный диапазон, запускается блок else, который выводит сообщение.
Если пользователь ввел вообще не число, запускается блок except. В нем мы используем оператор continue, чтобы снова запросить у пользователя валидные данные.
Оператор continue переводит цикл на новую итерацию.
Примечание автора. При валидации пользовательского ввода при помощи цикла while мы используем оператор continue, если ввод невалиден, например, в блоке except или if. Если ввод валиден, мы используем оператор break для выхода из цикла.
Функция input() принимает опциональный аргумент prompt, который попадает в стандартный вывод (на экран) без последующего перевода на новую строку.
Затем функция считывает стандартный ввод (с клавиатуры), преобразует его в строку и возвращает результат.
Примечание автора. Обратите внимание, что функция input() всегда возвращает именно строку, даже если пользователь вводит число.
Тот же подход можно использовать при валидации текстового ввода.
Запрос ввода данных, пока input не будет валидным
Вот пример, как запрашивать у пользователя ввод, пока он не введет значение, имеющее как минимум 5 символов.
password = ”
while True:
password = input(‘Enter your password: ‘)
if len(password) < 5:
print(‘Password too short’)
continue
else:
print(f’You entered {password}’)
break
print(password)
Цикл while работает, пока пользователь не введет значение длиной хотя бы в 5 символов.
Примечание автора. Если значение слишком короткое, мы используем continue, чтобы перейти к следующей итерации.
Для проверки нескольких условий можно использовать булевы операторы or или and.
Проверка input на соответствие нескольким условиям (or)
Давайте посмотрим, как проверить, что введенное пользователем значение имеет как минимум 5 символов или не входит в определенный список значений.
password = ”
common_passwords = [‘abcde’, ‘asdfg’]
while True:
password = input(‘Enter your password: ‘)
if len(password) < 5 or password in common_passwords:
print(‘Pick a strong password’)
continue
else:
print(f’You entered {password}’)
break
print(password)
Предложение if проверяет, не слишком ли короток пароль и не входит ли он в список распространенных паролей.
Мы используем булев оператор or, так что блок if запускается при соблюдении любого из двух условий.
Примечание автора. Если пароль меньше 5 символов или входит в список распространенных паролей, мы переходим к следующей итерации цикла при помощи continue и снова запрашиваем у пользователя ввод.
Проверка input на соответствие нескольким условиям (and)
При помощи оператора and можно проверить соблюдение всех указанных условий.
password = ”
common_passwords = [‘abcde’, ‘asdfg’]
while True:
password = input(‘Enter your password: ‘)
if len(password) > 5 and password not in common_passwords:
print(f’You entered {password}’)
break
else:
print(‘Pick a strong password’)
continue
print(password)
Мы используем оператор and, поэтому блок if запускается только при соблюдении обоих условий. Он сработает, если пароль и длиннее 5 символов, и не входит в список распространенных паролей. В таком случае мы выходим из цикла при помощи break.
Если указанные условия не соблюдаются, мы переходим к следующей итерации цикла при помощи continue.
Запрос пользовательского ввода до нажатия Enter
Чтобы принимать ввод до нажатия Enter:
Объявите переменную, которая будет хранить пустой список.Используйте цикл while для произвольного количества итераций.Добавляйте каждое значение, введенное пользователем, в список.Выйдите из цикла while, когда пользователь нажмет Enter.
# When taking strings as input
my_list = []
user_input = ”
while True:
user_input = input(‘Enter a string: ‘)
# Take input until Enter is pressed without value
if user_input == ”:
print(‘User pressed enter’)
break
my_list.append(user_input)
print(my_list)
# ———————————————
# When taking integers as input
my_list = []
user_input = ”
while True:
user_input = input(‘Enter a number: ‘)
# Take input until Enter is pressed without value
if user_input == ”:
print(‘User pressed enter’)
break
try:
my_list.append(int(user_input))
except ValueError:
print(‘Invalid number.’)
continue
print(my_list)
Примечание автора. Примеры повторяют программу и запрашивают пользовательский ввод, пока пользователь не нажмет Enter, не вводя значение.
Условие выхода может быть любым. Например, итерации могут прекратиться, когда пользователь введет слово «done» или список будет содержать как минимум 3 значения.
Первый пример принимает в качестве input строковые значения.
my_list = []
user_input = ”
while True:
user_input = input(‘Enter a string: ‘)
# Take input until Enter is pressed without value
if user_input == ”:
print(‘User pressed enter’)
break
my_list.append(user_input)
print(my_list)
Мы использовали цикл while, чтобы принимать пользовательский ввод произвольное количество раз.
Примечание автора. Единственный способ выйти из цикла while True — использовать оператор break для поднятия исключения.
Если пользователь нажмет Enter без ввода значения, мы выходим из цикла. В противном случае мы продолжаем добавлять вводимые пользователем значения в список.
Метод list.append() добавляет элементы в конец списка.
Вот пример повторения программы, запрашивающей у пользователя числовые значения.
my_list = []
user_input = ”
while True:
user_input = input(‘Enter a number: ‘)
# Take input until Enter is pressed without value
if user_input == ”:
print(‘User pressed enter’)
break
try:
my_list.append(int(user_input))
except ValueError:
print(‘Invalid number.’)
continue
print(my_list)
Как вы помните, функция input() конвертирует пользовательский ввод в строковые значения. Чтобы преобразовать их в целые числа, мы используем функцию int().
Предложения try/except используются для обработки ValueError в случае, если в функцию int() будет передано невалидное значение.
Запись Проверка пользовательского ввода в Python впервые появилась Techrocks.