Что означает ошибка TypeError: unsupported operand type(s)
easy

Что означает ошибка TypeError: unsupported operand type(s)

Коварная ошибка с типами данных в Python

Ситуация: мы пишем простой скрипт на Python, который сначала спрашивает у пользователя, какую фразу ему сейчас повторить в ответ и сколько раз. Логика простая:

  1. Определяем функцию с циклом, которая в цикле выводит фразу пользователя и уменьшает счётчик.
  2. Спрашиваем, что повторить и сколько раз, и запоминаем ответы в отдельных переменных.
  3. Запускаем функцию с указанными переменными.

Всё просто, поэтому пишем код:

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)

Теперь всё работает как нужно, а ошибка исчезла:

Что делать с ошибкой TypeError: unsupported operand type(s)

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Маша Климентьева

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy