Что означает ошибка TypeError: can only concatenate str (not "int") to str

Что означает ошибка TypeError: can only concatenate str (not "int") to str

Это значит, что вы пытаетесь сложить строки с числами

Программист освоил JavaScript и начал изучать Python. Чтобы освоиться в языке, он переносит проекты с одного языка на другой — убирает точки с запятой, добавляет отступы и меняет команды одного языка на такие же команды из другого языка.

Один из фрагментов его кода после перевода в Python выглядит так:

# зарплата в месяц
month = 14200
# плата за ЖКХ
regular_cost = 5800

# функция, которая считает и возвращает долю ЖКХ в бюджете
def calculate(budget,base):
    message = 'На коммунальные платежи уходит ' + base + 'р. - это ' + base/budget*100 + ' процентов от ежемесячного бюджета'
    return message
    
# отправляем в функцию переменные и выводим результат на экран
print(calculate(month,regular_cost))

Но после запуска программист получает ошибку:

❌ TypeError: can only concatenate str (not "int") to str

Странно, но в JavaScript всё работало, почему же здесь код сломался?

Что это значит: компилятор не смог соединить строки и числа, поэтому выдал ошибку.

Когда встречается: в языках со строгой типизацией, например в Python, когда у всех переменных в выражении должен быть один и тот же тип данных. А вот в JavaScript, который изучал программист до этого, типизация нестрогая, и компилятор сам мог привести все части выражения к одному типу.

Что делать с ошибкой TypeError: can only concatenate str (not "int") to str

Раз это проблема строгой типизации, то для исправления этой ошибки нужно просто привести все части к одному типу. 

В нашем случае мы хотим получить на выходе строку, поэтому все слагаемые должны быть строкового типа. Но base и base/budget*100 — это числа, поэтому просто так их сложить со строками не получится. Чтобы выйти из ситуации, явно преобразуем их в строки командой str():

message = 'На коммунальные платежи уходит ' + str(base) + 'р. - это ' + str(base/budget*100) + ' процентов от ежемесячного бюджета'

Команда str() делает так, что всё внутри неё приводится к строке и она отдаёт дальше строку. В итоге операция склейки строк проходит как ожидаемо: строка к строке даёт строку. Нет повода для беспокойства. 

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

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

Вёрстка:

Кирилл Климентьев

Соцсети:

Алина Грызлова

Любишь Python? Зарабатывай на нём!
Изучите самый модный язык программирования и станьте крутым бэкенд-разработчиком. Старт — бесплатно.
Попробовать
Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
Мегапроект: расшифровщик аудио в текст… через облако Яндекса!

Сегодня мы будем эксплуатировать чужие облака.

hard
Делаем своё расширение для браузера за 10 минут
Делаем своё расширение для браузера за 10 минут

Cнова запускаем снежинки.

medium
Непобедимый пинг-понг на JavaScript
Непобедимый пинг-понг на JavaScript

Попробуйте продержаться как можно дольше.

easy
Цветной арканоид на JavaScript
Цветной арканоид на JavaScript

Всё как на старых приставках.

hard
Как добавить кнопки «Поделиться» на страницу
Как добавить кнопки «Поделиться» на страницу

Простой рецепт от Яндекса.

easy
Как добавить плавающий блок на страницу
Как добавить плавающий блок на страницу

Иногда это и правда нужно.

easy
Что означает ошибка SyntaxError: missing ) after formal parameters

На самом деле это не просто пропущенная скобка.

easy
Улучшаем арканоид
Улучшаем арканоид

Добавляем очки, жизни и нарастание сложности.

medium
Что означает ошибка IndentationError: expected an indented block
Что означает ошибка IndentationError: expected an indented block

Самая популярная ошибка у начинающих программистов на Python.

easy
Делаем свой текстовый редактор с автосохранением

Это не так сложно, как звучит.

medium
easy