Ситуация: мы пишем простой скрипт на Python, который сначала спрашивает у пользователя, какую фразу ему сейчас повторить в ответ и сколько раз. Логика простая:
- Определяем функцию с циклом, которая в цикле выводит фразу пользователя и уменьшает счётчик.
- Спрашиваем, что повторить и сколько раз, и запоминаем ответы в отдельных переменных.
- Запускаем функцию с указанными переменными.
Всё просто, поэтому пишем код:
def cat_n_times(s, n):
while s != 0:
print(n)
s = s - 1
text = input("Какую фразу нужно повторить: ")
num = input("Сколько раз: ")
cat_n_times(num, text)
❌ Но при запуске мы получаем ошибку:
TypeError: unsupported operand type(s) for -: 'str' and 'int'
Странно, но где там можно было ошибиться?
Что это значит: Python не смог вычесть из строки число, поэтому остановился с ошибкой.
Когда встречается: в ситуациях, когда программист работает со строкой как с числом. В отличие от JavaScript, Python не умеет переводить автоматически строку в число, отсюда и ошибки.
Что делать с ошибкой TypeError: unsupported operand type(s)
Чтобы исправить эту ошибку, нужно разобраться, в какой момент мы начинаем работать со строковой переменной как с числом и почему мы изначально сделали её строковой. Если это параметр функции — посмотреть, что туда передаётся и как именно появляются исходные данные. Если это операция внутри кода — отследить первое появление переменной и исправить данные на значения нужного типа (напрямую или конвертацией).
В нашем случае ошибка возникает из-за того, что функция input() в Python возвращает строковое значение, которое записывается в переменные. Для фразы, которую нужно повторить, это подходит, а для количества повторений — нет.
Чтобы количество повторений перевести из строки в число, можно использовать перевод из строкового значения в числовое командой int(num)
. Это можно сделать как с помощью отдельной переменной, так и при передаче значения в функцию. Чтобы не заводить новую переменную, пойдём по второму пути (обратите внимание на последнюю строку):
def cat_n_times(s, n):
while s != 0:
print(n)
s = s - 1
text = input("Какую фразу нужно повторить: ")
num = input("Сколько раз: ")
cat_n_times(int(num), text)
Теперь всё работает как нужно, а ошибка исчезла: