Введение

Python — язык с динамической типизацией, а это значит, что переменные не привязаны к конкретному типу данных раз и навсегда. Тип значения определяется автоматически в момент присваивания. Например, если вы пишете x = 10, Python понимает, что x — это целое число (int). Но уже в следующей строке вы можете присвоить этой же переменной строку — x = "десять", и это будет абсолютно допустимо.

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

В этой статье мы разберём, какие типы данных есть в Python, как узнать текущий тип переменной и как в Python изменить тип данных — от строк к числам, от чисел к логическим значениям, от списков к строкам и обратно. Покажем всё на наглядных примерах и объясним, как избежать распространённых ошибок при преобразованиях.

1. Что такое типы данных в Python

Типы данных в Python определяют, какую информацию хранит переменная и какие операции с ней можно выполнять. Например, со строками можно объединять текст, а с числами — выполнять вычисления.

Основные типы данных:

  • int — целые числа (5, -12)
  • float — числа с точкой (3.14, -0.5)
  • str — строки ("Привет")
  • bool — логические значения (True, False)
  • list — списки ([1, 2, 3])
  • tuple — кортежи ((1, 2, 3))
  • dict — словари ({"ключ": "значение"})
  • set — множества ({1, 2, 3})

Динамическая типизация

Python использует динамическую типизацию: переменной можно присвоить значение любого типа, и тип можно изменить в любой момент. Это удобно, но требует внимания — особенно при работе с вводом, преобразованием строк и чисел.

2. Как узнать и изменить тип данных

Чтобы узнать, какого типа значение хранится в переменной, используется встроенная функция type():

x = 10
print(type(x))  # <class 'int'>

Для изменения типа данных в Python применяются функции преобразования (кастинга):

  • str() — в строку
  • int() — в целое число
  • float() — в число с точкой
  • bool() — в логическое значение
  • list(), tuple(), set(), dict() — в соответствующие коллекции
str(123)      # '123'
int("456")    # 456
float("3.14") # 3.14
bool(0)       # False
list("abc")   # ['a', 'b', 'c']

3. Преобразование строк и чисел

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

str → int и str → float

Функции int() и float() позволяют превратить строку в число:

int("123")     # 123
float("3.14")  # 3.14

При попытке преобразовать некорректную строку произойдёт ошибка:

int("abc") # ValueError

Решение — использовать try/except.

int/float → str

Преобразование чисел в строку:

str(100)       # '100'
str(3.14)      # '3.14'

float → int

При преобразовании дробного числа в целое дробная часть отбрасывается:

int(9.99)      # 9

bool ↔ int/str

Булевые значения можно легко привести к числу или строке:

int(True)      # 1
str(False)     # 'False'
bool(0)        # False
bool("text")   # True

4. Особенности и подводные камни

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

Ошибки при преобразовании

ValueError — возникает, если строка не может быть преобразована:

int("abc")  # ValueError

TypeError — если передаётся неподходящий тип:

int(None)  # TypeError

Преобразование пустых значений

    Пустая строка "", пустой список [], число 0 и None при преобразовании в bool дают False:

    bool("")     # False
    bool([])     # False
    bool(None)   # False

    Ловушки

    • Строка "123abc" выглядит как число, но int("123abc") вызовет ошибку.
    • Строки с пробелами, символами или запятыми ("1 000", "3,14") нужно предварительно очищать или заменять символы.

    Работа с None

    None — специальное значение “ничего”. Преобразовать его в int или str можно, но результат зависит от функции:

    str(None)      # 'None'
    bool(None)     # False

    int(None) вызовет ошибку.

    5. Примеры и задачи для практики

    Примеры кода:

    # Строка в число
    s = "42"
    num = int(s)
    
    # Число в строку
    x = 3.14
    text = str(x)
    
    # Строка с плавающей точкой в float
    f = float("2.718")

    Задачи для практики:

    1. Пользователь вводит число — обработать и преобразовать:
    user_input = input("Введите число: ")
    try:
        number = int(user_input)
        print("Удвоенное число:", number * 2)
    except ValueError:
        print("Ошибка: введите целое число.")

    2. Считать строку и выделить из неё число:

    text = "Цена: 150 руб."
    digits = ''.join(c for c in text if c.isdigit())
    price = int(digits)
    print("Цена:", price)

    3. Список строковых чисел → список int:

    str_list = ["10", "20", "30"]
    int_list = list(map(int, str_list))
    print(int_list)  # [10, 20, 30]

    FAQ: Частые вопросы про преобразование типов в Python

    Как безопасно преобразовать строку в число?
    Используйте конструкцию try/except, чтобы избежать ошибки при вводе неправильных данных:

    s = "123"
    try:
        num = int(s)
    except ValueError:
        num = 0  # или другое значение по умолчанию

    Что произойдёт при int("12.3")?
    Будет выброшено исключение ValueError, так как "12.3" — это строка с десятичной точкой, а int() ожидает только целое:

    int("12.3")  # ValueError

    Решение — сначала преобразовать в float, потом в int:

    int(float("12.3"))  # 12

    Как из True получить 1?
    Python автоматически преобразует булевы значения в числа:

    int(True)   # 1
    int(False)  # 0

    Можно ли преобразовать список в строку?
    Да, но сначала нужно указать, как объединить элементы, если это список строк:

    lst = ["яблоко", "банан"]
    result = ", ".join(lst)  # 'яблоко, банан'

    Для чисел — предварительно привести элементы к строковому типу:

    lst = [1, 2, 3]
    result = ", ".join(map(str, lst))  # '1, 2, 3'

    Чем отличается str() от .__str__()?
    Функция str() вызывает метод .__str__() внутри себя. Но str() безопаснее, так как не требует вручную обращаться к методу:

    x = 100
    str(x)        # '100'
    x.__str__()   # тоже '100', но хуже читается

    Используйте str() — это более «питонично».

    Фото аватара

    От exrf

    Добавить комментарий