Модуль 02 — Типы, переменные, выражения

Из чего состоят данные в программе и как с ними считать

Прогресс курса Модуль 2 из 9

Что вы освоите в этом модуле

01

Переменные

Переменная — имя, закреплённое за значением. Создаётся первым присваиванием, объявлять заранее не нужно. Знак = в 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.
02

Типы данных

У каждого значения есть тип — он определяет, что со значением можно делать. Узнать тип — функция 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 — разные значения разных типов. Первое — два символа, второе — число. Цифры в кавычках остаются текстом.

03

Арифметика

ОперацияСмыслПример
+ - *Сложение, вычитание, умножение2 * 3 → 6
/Деление, результат всегда float10 / 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.

04

Дробные числа и погрешность

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.

05

Преобразование типов

Функции 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.

06

Логический тип

Сравнение даёт 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: означает «если строка не пустая».

07

f-строки и форматирование

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 руб.

Пустые строки в программе разделяют смысловые части: ввод, расчёт, вывод. Интерпретатор их пропускает.

08

Сокращённые записи присваивания

Несколько переменных можно присвоить одной строкой, а обменять значения — без временной переменной. 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 хранится с погрешностью: не сравнивать через ==, деньги — в копейках или Decimal
  • Ввод пользователя — строка: int(input(...)), float(input(...)); дробный разделитель — точка
  • f-строка с форматом: {x:.2f}, {x:>10}, {x:,}
Практические задания — на учебном портале. Задания, критерии оценивания, сдача работ и оценки преподавателя — в курсе на portal.nevabit.ru. Учётную запись выдаёт преподаватель.
Модуль 01: Первая программа Все модули Модуль 03: Условия и циклы