Переменные и типы данных в Python: практическое введение
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Представьте, что вы отправляете посылку. На бланке есть поле «Вес». Вместо числа вы пишете «тяжёлая». Система доставки падает: она не может рассчитать стоимость по слову «тяжёлая».
Именно такие проблемы в программировании решают типы данных. Тип сообщает Python, чем является значение: числом, фрагментом текста, ответом «да или нет» или вообще ничем. От того, правильно ли учтены типы, зависит, будет код работать или взорвётся.
В предыдущем уроке вы научились создавать переменные и работать со строками и числами. Теперь пойдём глубже. Вы познакомитесь со всеми основными типами данных Python, научитесь проверять типы и преобразовывать один в другой, а также обходить самые частые ошибки, связанные с типами.
Что такое типы данных в Python?
Тип данных сообщает Python, какого рода это значение. От типа зависит, какие операции с этим значением можно выполнять.
Представьте кухонную утварь. В мерный стакан наливают жидкости. На весах взвешивают твёрдые продукты. Вы же не станете насыпать муку в мерный стакан, рассчитывая узнать её точный вес. Каждый предмет предназначен для чего-то своего.
В Python пять основных типов данных, с которыми вы будете работать каждый день:
<class 'int'> <class 'float'> <class 'str'> <class 'bool'> <class 'NoneType'>
Функция type() станет вашим лучшим другом при работе с типами данных. Она точно сообщает, с каким значением вы имеете дело. Когда код не работает, проверка типов обычно быстрее всего помогает найти причину.
Целые числа и числа с плавающей точкой в Python
В Python есть два вида чисел: целые числа (int) для чисел без дробной части и числа с плавающей точкой (float) для дробных. Чаще всего о разнице можно не задумываться. Но иногда она очень важна.
Когда нужны целые числа, а когда float
Используйте целые числа, когда значение всегда целое: количество людей, очки в игре, индекс элемента в списке. Используйте float, когда важны доли: температура, проценты, денежные суммы.
<class 'int'> <class 'float'>
Подчёркивания для удобного чтения больших чисел
Большие числа трудно читать. Что записано в 1000000: миллион или десять миллионов? Python разрешает разделять разряды подчёркиваниями. Сам Python подчёркивания полностью игнорирует, они нужны только для ваших глаз.
8000000000 <class 'int'> 1250000.75
Проблема 0.1 + 0.2 в Python
Вот что удивляет почти всех, кто видит это впервые. Запустите этот код:
0.30000000000000004
Вы ожидали 0.3, а получили 0.30000000000000004. Это не ошибка Python. Такая проблема есть во всех языках программирования.
Компьютеры хранят числа в двоичном виде (единицами и нулями). Некоторые десятичные числа, например 0,1, невозможно точно записать в двоичной системе, так же как 1/3 нельзя точно записать десятичной дробью (0,333333... тянется бесконечно).
False 0.3 True
Ещё одна важная деталь: обычное деление (/) всегда даёт float, даже если оба числа целые и результат получается целым.
5.0 <class 'float'> 5 <class 'int'>
Логические значения в Python (True и False)
Логический тип (boolean) является самым простым типом данных в Python. У него всего два возможных значения: True или False. И всё.
Логические значения похожи на выключатель света: включено или выключено, да или нет. На них держится каждое решение, которое принимает ваш код. Любая инструкция if, любой цикл while, любое сравнение в итоге сводится к логическому значению.
True <class 'bool'> True False True False
Что такое истинные и ложные значения (truthy и falsy) в Python?
Любое значение в Python можно использовать как логическое. Одни значения считаются True (их называют truthy, «истинными»), другие считаются False (falsy, «ложными»). Проверить любое значение можно, передав его в bool().
False False False False False --- True True True True True
Вот полный список ложных значений. Запомните их, всё остальное истинно:
| Ложное значение | Тип | Почему оно ложное |
|---|---|---|
False | bool | Это и есть False |
0 | int | Ноль |
0.0 | float | Ноль |
"" | str | Пустая строка |
None | NoneType | Отсутствие значения |
[] | list | Пустой список |
{} | dict | Пустой словарь |
Что такое None в Python?
None означает в Python «здесь ничего нет». Это не ноль. Это не пустая строка. Это полное отсутствие значения.
Представьте анкету с полем «Второе имя». Если человек оставил его пустым, это не то же самое, что написать число 0 или пустую строку "". Второго имени у него нет, вот и всё. Это пустое поле и есть None.
None <class 'NoneType'> False False False
Как проверить значение на None в Python
Для проверки на None всегда используйте is None или is not None. Не используйте ==. Это соглашение Python, и за ним стоит настоящая техническая причина.
value = None
if value == None:
print("No value")value = None
if value is None:
print("No value")Hello, stranger! Hello, Alice!
None постоянно используется как значение по умолчанию в функциях. Это аккуратный способ сказать: «этот аргумент необязателен».
Как проверить тип переменной в Python
Для проверки типов в Python есть два инструмента: type() и isinstance(). Они похожи, но служат разным целям.
Как узнать тип значения с помощью type()
type() сообщает точный тип значения. Это отличный инструмент для отладки: когда что-то не работает, проверка типа часто сразу показывает причину.
<class 'int'> <class 'float'> <class 'str'> <class 'bool'> <class 'NoneType'> True False
Проверка типов с помощью isinstance()
isinstance() проверяет, относится ли значение к определённому типу (или к одному из нескольких типов). В реальном коде типы лучше проверять именно так: эта функция учитывает наследование и читается понятнее.
True True False True True False
Любопытный факт: в Python логический тип на самом деле является подклассом целых чисел. True втайне равно 1, а False втайне равно 0.
True True 2 10 42
Как преобразовывать типы в Python
Иногда значение хранится в одном типе, а нужно в другом. Пользователь вводит в форму свой возраст, и он приходит как строка "25", а для вычислений нужно целое число 25. Для преобразования типов в Python есть встроенные функции.
Преобразование с помощью int(), float(), str() и bool()
30 19.98 Your score: 100 42.0 3
Частые ловушки при преобразовании типов
Не всякое преобразование возможно. Если попытаться преобразовать что-то бессмысленное, Python упадёт с ошибкой ValueError.
42 3.14 100 Error: invalid literal for int() with base 10: 'hello' Error: invalid literal for int() with base 10: '3.14' 3
Преобразование в bool() подчиняется правилам истинности и ложности, которые мы разобрали выше:
True False True False False True
Присваивание в Python: несколько переменных сразу и обмен значениями
В Python есть удобные приёмы работы с переменными, которых нет в большинстве других языков. Это не фокусы ради фокусов: профессиональные разработчики пользуются ими каждый день.
Множественное присваивание в одну строку
Можно присвоить значения нескольким переменным в одной строке. Это особенно удобно, когда у вас есть группа связанных значений.
10 20 30 Alice Smith, age 25 0 0 0
Обмен значений без временной переменной
В большинстве языков, чтобы поменять местами значения двух переменных, нужна временная переменная. В Python есть способ изящнее.
a = 1
b = 2
# Need a third variable to hold the value
temp = a
a = b
b = temp
print(a, b) # 2 1a = 1
b = 2
# Python handles the swap in one step
a, b = b, a
print(a, b) # 2 1Строка a, b = b, a работает, потому что Python сначала вычисляет всю правую часть (b, a превращается в 2, 1), а затем присваивает эти значения левой части. Временная переменная не нужна.
Практические упражнения
Пора проверить свои знания! Эти упражнения охватывают всё, что было в уроке. Они идут от простых к сложным.
Помните: трудности и есть обучение. Попробуйте решить каждое упражнение, прежде чем заглядывать в подсказки. Внимательно читайте сообщения об ошибках: обычно они точно говорят, что пошло не так.
Создайте по одной переменной каждого основного типа Python и выведите её тип. Вывод должен быть в точности таким:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
<class 'NoneType'>Переменные можно назвать как угодно и дать им любые значения, главное, чтобы совпадали типы.
Переведите температуру из градусов Фаренгейта в градусы Цельсия.
Формула: **Цельсий = (Фаренгейт - 32) * 5 / 9**
Дана переменная fahrenheit со значением 98.6. Вычислите температуру по Цельсию и выведите результат в точности в таком формате:
98.6F = 37.0CНе запуская код, предскажите, что выведет каждая строка. Затем запустите его и проверьте свои ответы.
Запишите свои предположения в комментариях, затем нажмите «Запустить», чтобы проверить.
Этот код должен выводить краткую анкету пользователя, но падает с ошибкой TypeError. Исправьте код, чтобы он выводил:
Name: Alice
Age: 25
Height: 5.6 feetИсправить можно любым способом (f-строки, преобразование через str() и т. п.).
Даны две переменные: a = 10 и b = 20. Поменяйте их значения местами без временной переменной, затем выведите обе.
Ожидаемый вывод:
a = 20
b = 10Дана строка price_text со значением "49" и целое число quantity, равное 3.
1. Преобразуйте price_text в целое число
2. Вычислите общую сумму (цена, умноженная на количество)
3. Выведите результат в точности в таком формате:
3 items at $49 each = $147 totalИспользуйте исходные переменные: не вписывайте числа прямо в вызов print.
Итоги: переменные и типы данных в Python
Краткая шпаргалка по всему, что вы узнали в этом уроке:
| Тип | Пример | Что хранит |
|---|---|---|
int | 42, -7, 1_000 | Целые числа |
float | 3.14, 0.0, -2.5 | Дробные числа |
str | "hello", 'world' | Текст |
bool | True, False | Значения «да или нет» |
None | None | Отсутствие значения |
Основные инструменты:
| Инструмент | Назначение | Пример |
|---|---|---|
type(x) | Узнать тип x | type(42) → <class 'int'> |
isinstance(x, int) | Проверить, относится ли x к нужному типу | isinstance(42, int) → True |
int(), float(), str() | Преобразовать один тип в другой | int("42") → 42 |
bool() | Проверить истинность | bool("") → False |
a, b = 1, 2 | Множественное присваивание | Присвоить значения нескольким переменным сразу |
a, b = b, a | Обмен значениями | Без временной переменной |
Что дальше?
В следующем уроке, [Числа и математика](/python/numbers-and-math), вы глубже разберётесь в числах Python. Вы познакомитесь с модулем math, способами округления и форматированием чисел, а ещё научитесь писать программы, которые считают как профи.