Из чего состоят данные в программе и как с ними считать
int, float, str, bool и значение None0.1 + 0.2 не равно 0.3, и не попадать в эту ловушкуПеременная — имя, закреплённое за значением. Создаётся первым присваиванием, объявлять заранее не нужно. Знак = в Python — не «равно», а «назвать»: вычислить правую часть и закрепить результат за именем слева.
>>> price = 450
>>> count = 3
>>> price * count
1350
>>> count = count + 1
>>> count
4
>>> total = price * count
>>> total
1800
count = count + 1 с точки зрения математики бессмысленно, а для программы естественно: взять текущее значение count, прибавить 1, результат снова назвать count. Обратите внимание: total посчитан один раз в момент присваивания. Если потом изменить price, total сам не пересчитается.
_; первой не может быть цифра: item2 можно, 2item нельзя.count и Count — разные переменные.if, for, class, None и другие.list, str, sum, input: Python позволит, но функция станет недоступна до конца программы.price, student_count, а не a, x1, data.У каждого значения есть тип — он определяет, что со значением можно делать. Узнать тип — функция type:
>>> type(42)
<class 'int'>
>>> type(3.5)
<class 'float'>
>>> type("42")
<class 'str'>
>>> type(True)
<class 'bool'>
>>> type(None)
<class 'NoneType'>
>>> x = 10
>>> x = "десять"
>>> type(x)
<class 'str'>
| Тип | Что хранит | Примеры |
|---|---|---|
int | Целое число любого размера | 0, -15, 1_000_000 |
float | Число с дробной частью | 3.5, -0.01, 1e6 |
str | Строка — текст в кавычках, одинарных или двойных | "Анна", '42', "" |
bool | Логическое значение | True, False |
NoneType | Единственное значение None — «ничего, значения нет» | None |
Тип принадлежит значению, а не переменной. В последних строках сеанса x сначала указывал на число, потом на строку — Python это разрешает (такую типизацию называют динамической). Пользоваться этим не стоит: переменная, в которой то число, то текст, — источник ошибок.
"42" и 42 — разные значения разных типов. Первое — два символа, второе — число. Цифры в кавычках остаются текстом.
| Операция | Смысл | Пример |
|---|---|---|
+ - * | Сложение, вычитание, умножение | 2 * 3 → 6 |
/ | Деление, результат всегда float | 10 / 2 → 5.0 |
// | Целочисленное деление: округление вниз | 17 // 5 → 3 |
% | Остаток от деления | 17 % 5 → 2 |
** | Возведение в степень | 2 ** 10 → 1024 |
>>> 17 / 5
3.4
>>> 17 // 5
3
>>> 17 % 5
2
>>> -17 // 5
-4
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
>>> 10 / 2
5.0
>>> 1_000_000 * 3
3000000
// округляет вниз, а не к нулю: -17 // 5 — это -4, потому что −3,4 вниз — это −4. Степень 0.5 — квадратный корень. Подчёркивания в 1_000_000 — только для удобства чтения, на значение не влияют.
Порядок действий — как в математике: сначала **, потом * / // %, потом + -. Если сомневаетесь — ставьте скобки, они ничего не стоят.
// и % вместе раскладывают величину на части. Секунды — в часы, минуты и секунды:
# Перевод секунд в часы, минуты и секунды
seconds = int(input("Секунд: "))
hours = seconds // 3600
minutes = seconds % 3600 // 60
rest = seconds % 60
print(f"{hours} ч {minutes:02d} мин {rest:02d} с")
$ python3 time_conv.py
Секунд: 7384
2 ч 03 мин 04 с
$ python3 time_conv.py
Секунд: 59
0 ч 00 мин 59 с
{minutes:02d} в f-строке — вывести целое двумя цифрами с ведущим нулём; подробно о форматах — в разделе 07.
float хранится в двоичном виде, а многие десятичные дроби в двоичной системе — бесконечные, как 1/3 в десятичной. Поэтому они хранятся с крошечной погрешностью, и она иногда видна:
>>> 0.1 + 0.2
0.30000000000000004
>>> 0.1 + 0.2 == 0.3
False
>>> round(0.1 + 0.2, 2)
0.3
>>> round(2.5)
2
>>> round(3.5)
4
>>> round(2.675, 2)
2.67
>>> 1e6
1000000.0
Отсюда три правила. Дробные числа не сравнивают через == — сравнивают округлённые значения или разницу с допуском: abs(a - b) < 1e-9. round округляет половину к чётному («банковское» округление): round(2.5) — 2, round(3.5) — 4; а 2.675 на самом деле хранится как 2,67499999…, поэтому и округлилось вниз. Деньги в серьёзных программах хранят в копейках целым числом или в типе Decimal из модуля decimal, а не в float.
Запись 1e6 — экспоненциальная форма: 1 × 10⁶. Результат всегда float.
Функции int, float, str и bool создают значение нужного типа из другого значения:
>>> int("42") + 8
50
>>> float("3.14") * 2
6.28
>>> int(3.99)
3
>>> str(2026) + " год"
'2026 год'
>>> int("4.5")
Traceback (most recent call last):
File "<python-input-4>", line 1, in <module>
int("4.5")
~~~^^^^^^^
ValueError: invalid literal for int() with base 10: '4.5'
>>> "Возраст: " + 25
Traceback (most recent call last):
File "<python-input-5>", line 1, in <module>
"Возраст: " + 25
~~~~~~~~~~~~^~~~
TypeError: can only concatenate str (not "int") to str
>>> int(" 17 ")
17
>>> float("2,5")
Traceback (most recent call last):
File "<python-input-7>", line 1, in <module>
float("2,5")
~~~~~^^^^^^^
ValueError: could not convert string to float: '2,5'
int(3.99) отбрасывает дробную часть, не округляя. int прощает пробелы по краям, но не точку: строку "4.5" сначала превращают во float. Десятичный разделитель в Python — только точка; запятая, привычная в русском тексте, вызывает ValueError. Сложить строку с числом нельзя — число сначала превращают в строку через str (или используют f-строку).
Главное применение — данные от пользователя. input возвращает строку, и сложение строк их склеивает:
a = input("Первое число: ")
b = input("Второе число: ")
print("Сумма:", a + b)
$ python3 sum_bad.py
Первое число: 2
Второе число: 3
Сумма: 23
Ошибки нет, ответ неверный — самый неприятный вид дефекта. Исправление — превратить ввод в число сразу при чтении:
a = int(input("Первое число: "))
b = int(input("Второе число: "))
print("Сумма:", a + b)
$ python3 sum_ok.py
Первое число: 2
Второе число: 3
Сумма: 5
Если пользователь введёт «два», int выбросит ValueError и программа остановится. Как перехватить ошибку и переспросить — в модулях 03 и 07.
Сравнение даёт True или False. Операции сравнения: == (равно), != (не равно), <, >, <=, >=. Не путайте == (сравнение) и = (присваивание).
>>> 5 > 3
True
>>> 5 == 5.0
True
>>> "abc" == "ABC"
False
>>> True + True
2
>>> bool(0)
False
>>> bool("")
False
>>> bool("0")
True
>>> bool([])
False
>>> bool(None)
False
bool — разновидность целого числа: True равно 1, False — 0, поэтому True + True — 2. Любое значение можно проверить на «истинность»: ложны ноль, пустая строка, пустой список, None; всё остальное истинно — включая строку "0", в которой один символ. Это пригодится в условиях модуля 03: if name: означает «если строка не пустая».
f-строка — строка с буквой f перед кавычкой. Выражение в фигурных скобках вычисляется и подставляется в текст. После двоеточия можно указать формат:
>>> name = "Анна"
>>> score = 87.456
>>> f"{name} набрала {score} баллов"
'Анна набрала 87.456 баллов'
>>> f"{name} набрала {score:.1f} баллов"
'Анна набрала 87.5 баллов'
>>> f"{1234567.891:,.2f}"
'1,234,567.89'
>>> f"[{name:>10}]"
'[ Анна]'
>>> f"[{name:<10}]"
'[Анна ]'
>>> f"[{42:05d}]"
'[00042]'
>>> f"{0.875:.0%}"
'88%'
>>> f"{2 + 2 = }"
'2 + 2 = 4'
| Формат | Что делает | Пример → результат |
|---|---|---|
.2f | Два знака после точки, с округлением | {3.14159:.2f} → 3.14 |
, | Разделитель тысяч | {1234567:,} → 1,234,567 |
>10 <10 ^10 | Ширина 10, выравнивание вправо, влево, по центру | {"Анна":>10} → Анна |
05d | Целое шириной 5 с ведущими нулями | {42:05d} → 00042 |
.0% | Доля в процентах | {0.875:.0%} → 88% |
= | Показать выражение и его значение — для отладки | {x = } → x = 5 |
Разделитель тысяч в Python — запятая, как в английском. Если в отчёте нужен пробел, заменяют после форматирования: f"{n:,}".replace(",", " ").
Ширина поля выравнивает числа в столбец, как в чеке:
# Стоимость покупки со скидкой
price = float(input("Цена за штуку, руб.: "))
count = int(input("Количество: "))
discount = int(input("Скидка, %: "))
total = price * count
saving = total * discount / 100
to_pay = total - saving
print(f"Без скидки: {total:10.2f} руб.")
print(f"Скидка: {saving:10.2f} руб.")
print(f"К оплате: {to_pay:10.2f} руб.")
$ python3 purchase.py
Цена за штуку, руб.: 249.90
Количество: 4
Скидка, %: 15
Без скидки: 999.60 руб.
Скидка: 149.94 руб.
К оплате: 849.66 руб.
Пустые строки в программе разделяют смысловые части: ввод, расчёт, вывод. Интерпретатор их пропускает.
Несколько переменных можно присвоить одной строкой, а обменять значения — без временной переменной. x += 3 — краткая запись x = x + 3; так же работают -=, *=, /=, //=, %=.
>>> a, b = 1, 2
>>> a, b = b, a
>>> print(a, b)
2 1
>>> x = 5
>>> x += 3
>>> x *= 2
>>> x
16
Операций ++ и --, как в C, в Python нет: пишут count += 1.
= — присваивание, == — сравнение; переменная создаётся первым присваиваниемint, float, str, bool, плюс None; "42" — не число/ — дробное деление, // — вниз до целого, % — остатокfloat хранится с погрешностью: не сравнивать через ==, деньги — в копейках или Decimalint(input(...)), float(input(...)); дробный разделитель — точка{x:.2f}, {x:>10}, {x:,}