Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 11 из 20 Начальный 15 мин 100 XP

Проверки строки: isdigit, isalpha и валидация ввода

Методы-вопросы: строка состоит только из цифр? только из букв? всё в нижнем регистре? Учимся валидировать ввод пользователя одним вызовом.

Редакция Питоники

Методы этого урока не меняют строку и ничего не ищут — они задают вопросы и отвечают строго True или False. Из цифр ли строка? Из букв? Всё в нижнем регистре? Такие методы-вопросы удобны тем, что влезают прямо в условие if и делают код читаемым как предложение.

isdigit: состоит ли из цифр

isdigit отвечает True, если строка непустая и состоит только из цифр. Классический сценарий — форма или чат-бот: пользователь должен ввести число, но вводит текст. Проверка до преобразования спасает от ValueError, о котором писали в уроке про разбор строк.

валидация числа из ввода
user_input = '42'
if user_input.isdigit():
    number = int(user_input)
    print('Принято:', number * 2)
else:
    print('Нужны только цифры')

bad_input = '42 года'
print(bad_input.isdigit())
Вывод
Принято: 84
False

isalpha и isalnum: буквы и буквоцифры

isalpha — только буквы (русские тоже считаются), isalnum — буквы ИЛИ цифры (alnum = alpha + numeric). Имя пользователя, артикул товара, номер паспорта — всё это проверяется одним вызовом вместо кучи условий.

три проверки на реальных значениях
login = 'АннаСмирнова'
print(login.isalpha())

article = 'A17B'
print(article.isalnum())

login_2026 = 'Анна2026'
print(login_2026.isalpha(), login_2026.isalnum())
Вывод
True
True
False True

Регистр и пробелы: islower, isspace

islower и isupper проверяют, что все буквы в соответствующем регистре (цифры и знаки не мешают — важны только буквы). isspace отвечает, состоит ли строка целиком из «пустых» символов: пробелов, переводов строки, табуляций. Последнее полезно, чтобы отсеять ввод из одних пробелов — глазу он кажется пустым, а len у него не ноль.

регистр и «пустой» ввод
print('annasmirnova'.islower())
print('Анна2026'.isupper())

views_only = '     '
print(len(views_only), views_only.isspace())
Вывод
True
False
5 True
МетодTrue, если строкаПример
isdigitТолько цифры, непустая'42' → True, '42 года' → False
isalphaТолько буквы'Анна' → True, 'Анна1' → False
isalnumБуквы или цифры'A17' → True
islower / isupperВесь регистр нижний/верхний'мир' → True
isspaceТолько «пустые» символы' ' → True

Проверки собираются в цепочки валидации: почистить strip, проверить isdigit, преобразовать int — три строки, и ввод пользователя перестаёт быть лотереей. К концу курса эти три строки будут стоять в начале каждой функции, принимающей ввод.

Как проверить, что строка — это число: isdigit и его родственники

Методы проверки отвечают на вопросы о содержимом строки, не меняя её. isdigit() — «состоит ли строка только из цифр». isalpha() — «только из букв». isalnum() — «из букв и цифр». Все они возвращают строго True или False и влезают прямо в условие if, что делает код читаемым почти как обычную фразу.

isdigit на вводе пользователя
user_input = '42'
if user_input.isdigit():
    number = int(user_input)
    print('Принято:', number * 2)
else:
    print('Нужны только цифры')

bad_input = '42 года'
print(bad_input.isdigit())
Вывод
Принято: 84
False

Здесь видна главная практическая ценность проверки: она стоит ДО преобразования. Без неё int('42 года') бросает ValueError, и программа падает на вводе пользователя — а должна вежливо сказать «нужны только цифры». Порядок «почистить, проверить, преобразовать» — это шаблон, который стоит применять к любому внешнему вводу.

isdigit, isnumeric, isdecimal: в чём разница

В Python три метода, которые выглядят одинаково, но проверяют разное. isdigit() — самый узкий по смыслу: цифры, которые понимает int(). isnumeric() — шире: он признаёт ещё и дробные символы вроде «½» и римские цифры. isdecimal() — между ними: принимает десятичные цифры любого алфавита, но не «½» и не надстрочные «²».

три метода на трёх значениях
values = ['42', '½', '²']
for v in values:
    print(v, v.isdigit(), v.isnumeric(), v.isdecimal())
Вывод
42 True True True
½ False True False
² True True False

Вывод нагляднее таблицы: обычное «42» проходит все три проверки, «½» — только isnumeric, а надстрочная двойка «²» проходит isdigit и isnumeric, но не isdecimal. Разница видна и на восточноарабских цифрах «٤٢»: они десятичные, поэтому isdecimal их принимает. Для проверки ввода числа перед int() берите isdigit: он строже всех и не подпустит строку, которую int() потом не переварит. Впрочем, int('½') вообще выбросит ошибку — так что на практике isdigit работает как фильтр совместимости с int, а не как проверка «это число».

isalpha и isalnum: логины и артикулы

isalpha() отвечает «только буквы» — русские буквы тоже считаются, это не латин-only проверка. isalnum() — «буквы ИЛИ цифры» (alnum = alpha + numeric). Имя пользователя, артикул товара, номер паспорта — всё это проверяется одним вызовом вместо кучи условий.

isalpha и isalnum на реальных значениях
login = 'АннаСмирнова'
print(login.isalpha())

article = 'A17B'
print(article.isalnum())

login_2026 = 'Анна2026'
print(login_2026.isalpha(), login_2026.isalnum())
Вывод
True
True
False True

Здесь важная деталь про isalpha: проверка не ограничивает алфавит, но и не пропускает ничего лишнего — ни цифр, ни пробелов, ни дефисов. Логин anna-smirnova не пройдёт isalpha, хотя человек вводит вполне нормальное имя. Это не баг метода, а его граница: isalpha отвечает на вопрос про буквы, а не про допустимость логина. Для логинов с дефисом нужно отдельное правило.

МетодTrue, если строкаПример
isdigitЦифры, которые понимает int'42' → True, '42 года' → False
isnumericЛюбые числовые символы'½' → True, 'Ⅷ' → True
isdecimalДесятичные цифры любого алфавита'٤٢' → True, '²' → False
isalphaТолько буквы'Анна' → True, 'Анна1' → False
isalnumБуквы или цифры'A17' → True, 'A-17' → False
isspaceТолько «пустые» символы' ' → True
islower / isupperВесь регистр нижний/верхний'мир' → True
isidentifierМожет быть именем переменной'имя' → True, '1x' → False

Проверка безопасно: isspace и пустой ввод

isspace() отвечает, состоит ли строка целиком из «пустых» символов: пробелов, переводов строки, табуляций. Отдельный метод нужен редко, но он закрывает реальную дыру в валидации: строка из одних пробелов непуста, и len у неё не ноль — а человек считал, что ничего не ввёл.

пустая строка и строка из пробелов
empty = ''
spaces = '     '

print(bool(empty), bool(spaces))

if not spaces.strip():
    print('Реально пусто (после strip)')
Вывод
False True
Реально пусто (после strip)

Разница между bool(spaces) и bool(spaces.strip()) — это разница между «в строке есть символы» и «в строке есть СОДЕРЖИМОЕ». Второе и нужно для проверки ввода. Ещё один приём: isidentifier() спрашивает, может ли строка быть именем переменной — полезно, когда проверяете имя, которое пользователь хочет использовать как ключ или тег.

Собираем валидатор: чистка, проверка, преобразование

Проверки редко живут сами по себе. В реальном коде это три шага, и порядок между ними имеет значение: сначала чистим, потом проверяем, потом преобразуем. Если проверить до чистки, пробелы по краям убьют правильный ввод.

валидация числа из формы
def read_number(user_input):
    clean = user_input.strip()
    if not clean:
        return None
    if not clean.isdigit():
        return None
    return int(clean)

for raw in ['  42 ', '', '42 года', '0']:
    print(repr(raw), '->', read_number(raw))
Вывод
'  42 ' -> 42
'' -> None
'42 года' -> None
'0' -> 0

Обратите внимание на if not clean перед проверкой isdigit. Формально ''.isdigit() и так даёт False, так что проверка избыточна — но она объясняет намерение и защищает от другой беды: пустая строка после чистки означает, что человек ничего не ввёл, и это стоит отличить от «ввёл не число». Мой совет: если метод сам покрывает случай, всё равно оставьте явную проверку — читается код понятнее.

И последнее. Проверка isdigit спасает от ValueError на обычных данных, но не даёт полной защиты: строка «+7» или «-5» тоже не пройдёт isdigit, хотя это вполне осмысленные числа. Для таких форматов честнее try/except вокруг int(). Общее правило: проверка методом — для простых форматов, try/except — для всего остального.

Проверки почти всегда работают в паре с другими методами: strip() чистит вход перед проверкой, int() превращает результат в число, а split() разбирает строку на части — об этом подробно в уроке про split. Форматирование чисел обратно в текст разобрано в уроке про format().

Валидация ввода: собираем функцию целиком

Проверки редко живут сами по себе — они всегда часть функции, которая принимает ввод. Ниже такая функция целиком: чистит, проверяет и только потом преобразует. Порядок шагов зашит в тело функции, и это то, что делает её безопасной.

функция чтения целого числа
def read_int(user_input, default=None):
    clean = user_input.strip()
    if not clean:
        return default
    if not clean.isdigit():
        return default
    return int(clean)

print(read_int('  42 '))
print(read_int(''))
print(read_int('42 года'))
Вывод
42
None
None

Функция возвращает default вместо исключения — и это осознанный выбор. Бросать ValueError внутри функции, которая просто читает поле формы, — значит заставлять вызывающий код ловить исключение на каждый чужой ввод. Возврат значения «не получилось» удобнее: вызывающий сам решит, что показать пользователю.

И последнее. Проверка — это не только «отсечь плохое», но и «поймать хорошее». isalnum() для артикула и isidentifier() для имени — это не «защита от злодеев», а способ убедиться, что данные в нужном формате, иначе дальше по коду будет мусор. Одно и то же условие работает в обе стороны.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

value = '  7  '
clean = value.strip()
print(clean.isdigit())
print('abc123'.isalnum(), 'abc 123'.isalnum())
value = '  42  '
print(value.strip().isdigit())
Проверь себя
0 / 8

1. Что вернёт '42 года'.isdigit()?

2. Что вернёт ''.isdigit()?

3. Что вернёт 'Анна2026'.isalpha() и что isalnum()?

4. Как отсеять ввод из одних пробелов, который глазу кажется пустым?

5. Что вернёт 'Анна2026'.isupper()?

6. Что вернёт '½'.isdigit()?

7. Какой порядок действий правильный для внешнего ввода?

8. Что вернёт bool(' ')?

Карточки терминов
Запомнено: 0 / 6
Практика

Проверьте три строки из формы: age = '29', name = 'Олег2', phone = ' +7 900 '. Напечатайте для age — прошёл ли проверку isdigit, для name — isalpha, для phone — что вернёт isspace до чистки и isdigit после phone.strip().replace(' ', '').

practice.py
Вопросы и ответы по уроку

Чем isdigit отличается от isnumeric?

Оба про цифры, но isnumeric шире: принимает дробные символы вроде «½» и римские цифры. Для проверки обычных чисел перед int() берите isdigit — он строже и предсказуемее.

Как проверить, что строка — дробное число вроде '3.14'?

isdigit не подойдёт — точка не цифра. Приём: убрать одну точку replace('.', '', 1) и проверить isdigit, либо сразу попытаться float(value) в try/except — так делают в реальном коде.

Зачем проверки, если можно просто int(value) в try/except?

try/except — тоже рабочий путь. isdigit лучше читается в простых случаях и не прячет неожиданные ошибки: исключение от int(value) может быть и о чём-то другом. Для нетривиальных форматов (дробные, минус, пробелы) — try/except честнее.

Чем isdigit отличается от isnumeric и isdecimal?

isdigit — самый строгий: только цифры, которые понимает int(). isnumeric — шире, принимает дробные символы ('½') и римские цифры. isdecimal — между ними: десятичные цифры любого алфавита ('٤٢'), но не '½' и не надстрочная '²'. Для проверки пользовательского ввода перед int() берите isdigit — он не подпустит строку, которую int() потом не переварит.

Почему пустая строка не проходит isdigit?

Потому что все методы-проверки требуют наличия символов: ''.isdigit(), ''.isalpha() и все остальные дают False. Пустая строка не «состоит из цифр» — она вообще ни из чего не состоит. Если ввод может быть пустым, проверяйте это явно: if not clean: return None.

Как проверить, что строка не состоит только из пробелов?

Строкой из пробелов занимается не isspace, а обычная проверка после чистки: if not s.strip():. Разница между bool(s) и bool(s.strip()) — это разница между «есть символы» и «есть содержание». Метод isspace() тоже существует и отвечает, состоит ли строка целиком из пробелов, переводов строки и табуляций.

Понравился урок? Сошлитесь на него

«Классический сценарий — форма или чат-бот: пользователь должен ввести число, но вводит текст.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.