Python с нуля · Глава 2 из 10

Глава 2. Переменные и базовые типы данных

Прогресс сохранится в этом браузере (войдите, чтобы синхронизировать).

Переменные

Переменная — это именованная ячейка для хранения данных. В Python переменная создаётся в момент присваивания значения через знак =:

name = "Анна"
age = 28
height = 1.75
is_admin = True

Чтобы прочитать значение, обратитесь к переменной по имени. Функция print() выведет его:

print(name)   # Анна
print(age)    # 28

Правила именования

  • Имя состоит из букв, цифр и знака _, но не может начинаться с цифры.
  • Регистр важен: name и Name — разные переменные.
  • Нельзя использовать ключевые слова Python (if, for, class, True...).
  • Стиль — snake_case: user_name, total_price, а не userName.
# Хорошо
user_name = "Анна"
total_price = 1500

# Плохо (так делать не надо)
u = "Анна"
tp = 1500

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

В Python не нужно заранее объявлять тип переменной — тип определяется по значению и может меняться в ходе программы:

x = 10          # x — целое число
x = "десять"    # теперь x — строка
x = [1, 2, 3]   # теперь x — список

Это удобно, но и опасно: можно случайно записать в переменную значение другого типа и сломать дальнейший код. Поэтому в больших проектах типы указывают явно через аннотации (подробнее — в главе про функции):

age: int = 28
name: str = "Анна"

Аннотации не ограничивают значение, но помогают редактору и другим разработчикам понять намерение.

Функция type()

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

print(type(42))        # <class 'int'>
print(type("Привет"))  # <class 'str'>
print(type(3.14))      # <class 'float'>
print(type(True))      # <class 'bool'>

Числа: int и float

Python различает два основных числовых типа:

  • int — целые числа (без точки): 42, -7, 0.
  • float — числа с плавающей точкой: 3.14, -0.001, 2.0.
population = 8_000_000_000   # подчёркивания для читаемости (Python 3.6+)
price = 19.99
negative = -273.15

Арифметика

ОператорОперацияПримерРезультат
+сложение7 + 310
-вычитание7 - 34
*умножение7 * 321
/деление7 / 23.5
//целочисленное деление7 // 23
%остаток от деления7 % 21
**возведение в степень2 ** 101024

Важный нюанс: обычное деление / всегда даёт float, даже если делится нацело:

result = 10 / 2
print(result)        # 5.0
print(type(result))  # <class 'float'>

Строки: str

Строка — последовательность символов. Создаётся в одинарных, двойных или тройных кавычках:

single = 'Привет'
double = "Мир"
# тройные кавычки — для многострочного текста
poem = '''Я выучу Python
по вечерам.'''

Длина строки — через функцию len():

print(len("Привет"))   # 6

Склеивание и повторение

first = "Анна"
last = "Смирнова"
full = first + " " + last   # "Анна Смирнова"
line = "-" * 20            # --------------------

Индексация и срезы

К символу строки обращаются по индексу (с 0). Отрицательные индексы отсчитываются с конца:

word = "Python"
print(word[0])    # P — первый символ
print(word[-1])   # n — последний
print(word[0:3])  # Pyt — символы с 0 по 2 (3 не входит)
print(word[:3])   # Pyt — с начала до 3
print(word[3:])   # hon — с 3 до конца

Строки неизменяемы: изменить символ по индексу нельзя. word[0] = "J" вызовет ошибку. Вместо этого создают новую строку.

Булевы значения: bool

Тип bool имеет всего два значения — True (истина) и False (ложь). Обратите внимание на заглавную букву — в Python это важно.

is_active = True
is_admin = False
print(type(is_active))   # <class 'bool'>

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

age = 28
print(age >= 18)      # True — совершеннолетний
print(age == 18)      # False — равенство (двойное равно!)
print(age != 30)      # True — неравенство

Специальное значение None

None — «ничего», отсутствие значения. Аналог null в других языках. Используется, когда переменная есть, но значения у неё пока нет:

result = None
print(result)        # None
print(type(result))  # <class 'NoneType'>

# Проверка на None — только через is, не через ==
if result is None:
    print("Значение ещё не задано")

Конвертация типов

Один тип можно преобразовать в другой встроенными функциями: int(), float(), str(), bool().

# str -> int
age_str = "28"
age = int(age_str)
print(age + 1)   # 29

# int -> str (нужно, например, для склейки со строкой)
count = 5
message = "Всего товаров: " + str(count)

# int -> float
price = float(100)
print(price)    # 100.0

# float -> int (дробная часть отбрасывается, без округления!)
print(int(3.9))  # 3

Что считается ложью (falsy)

При преобразовании в bool следующие значения дают False: 0, 0.0, "" (пустая строка), None, пустые коллекции. Всё остальное — True:

print(bool(0))      # False
print(bool(""))     # False
print(bool("text")) # True
print(bool(42))     # True

Ввод данных: input()

Функция input() останавливает программу и ждёт, пока пользователь наберёт текст и нажмёт Enter. Аргумент — приглашение, которое показывается перед вводом:

name = input("Как вас зовут? ")
print(f"Привет, {name}!")

Главное, что нужно запомнить: input() всегда возвращает строку — даже если пользователь ввёл число. Поэтому считать с результатом «как с числом» без конвертации не получится:

age = input("Ваш возраст: ")   # пользователь ввёл 28
print(type(age))               # <class 'str'> — это строка!

# print(age + 1)   # TypeError: can only concatenate str (not "int") to str

# Правильно — сразу приводим к нужному типу
age = int(input("Ваш возраст: "))
print(age + 1)                 # 29

Это ошибка №1 у начинающих: программа «странно себя ведёт» просто потому, что "28" и 28 — разные вещи. Для дробных чисел используйте float():

height = float(input("Ваш рост в метрах: "))   # 1.75
print(f"Через год вы будете ростом {height} м")

Если пользователь введёт не число, int() выбросит ValueError и программа упадёт. Как это перехватить — разберём в главе 8.

Кейс из реального проекта: разбор ответа API

Часто данные приходят строками (например, из HTTP-ответа или формы), а считать нужно числа. Здесь и нужна конвертация:

# Пришёл ответ от сервера в виде строк
price_str = "199.50"
quantity_str = "3"

# Превращаем строки в числа и считаем
price = float(price_str)
quantity = int(quantity_str)
total = price * quantity

print("Итого:", total, "руб.")
# Итого: 598.5 руб.

В реальном проекте значения «снаружи» (от пользователя, из сети, из файла) почти всегда нужно приводить к нужному типу и проверять. Подробнее об обработке ошибок — в главе 8.

Типичные ошибки

1. Сравнение через одно =

age = 28
# if age = 18:   # Ошибка! = это присваивание, а не сравнение
if age == 18:    # правильно
    print("Ровно 18")

2. Сложение числа и строки

age = 28
# print("Мне " + age + " лет")   # TypeError: can only concatenate str
print("Мне " + str(age) + " лет")  # правильно

В следующей главе мы изучим f-строки, которые решают эту проблему элегантнее.

3. Путаница int() и round()

print(int(2.9))     # 2 — просто отбрасывает дробь
print(round(2.9))   # 3 — математическое округление

Практика

  1. Объявите переменные с именем, возрастом и ростом. Выведите их через print().
  2. Посчитайте площадь прямоугольника со сторонами 4.5 и 3 и выведите результат.
  3. Дана строка "123". Превратите её в число, умножьте на 2 и выведите.
  4. Строку "Python" выведите задом наперёд через срез [::-1].
  5. Проверьте через type(), какой тип у выражения 10 / 2 и 10 // 2.
  6. Спросите у пользователя два числа через input(), сложите их и выведите сумму. Не забудьте про int().

Итог

Мы изучили переменные, динамическую типизацию, основные типы данных (int, float, str, bool, None), арифметику, конвертацию типов и ввод данных через input(). Запомните главное: input() всегда отдаёт строку. В следующей главе разберём операторы подробнее и научимся красиво форматировать строки через f-strings.

Содержание серии (10)
{# Звук celebration (этап 4.3):