Основы программирования
Переменные и типы данных
**Загадка:** В программе написано `x = 5`, потом `x = x + 1`. Сколько теперь x? Если ответ «6» - мышление уже программистское. Если «это бессмыслица, x не может равняться x+1» - добро пожаловать в мир переменных!
В математике `x = x + 1` - противоречие. В программировании - обычная операция. Разница в том, что `=` здесь означает не «равно», а **«присвоить»**.
Цели урока
- Понять что такое переменная и как она работает
- Изучить основные типы данных: числа, строки, булевы
- Научиться создавать и изменять переменные
- Понять разницу между = в математике и программировании
Предварительные знания
- Что такое программирование (урок 1)
- Установленная среда разработки (урок 2)
Instagram хранит 2 миллиарда счётчиков followers_count. Spotify держит is_premium для 600 миллионов пользователей. TikTok обновляет view_count миллионы раз в секунду. Всё это - переменные. Без них программа - калькулятор без памяти.
- **Instagram**: переменная `followers_count` хранит число подписчиков - обновляется при каждом follow
- **Игры**: `player_health = 100`, `player_score = 0` - состояние игрока в каждом кадре
- **Банки**: `balance = 15000.50` - баланс на счёте, тип float критичен для точности
- **Spotify**: `is_premium = True` - один bool определяет доступ к 80 миллионам треков
Джон Бэкус, IBM и именованная переменная
До 1957 года программисты работали с памятью напрямую. Каждое значение лежало по числовому адресу (octal 04217, decimal 2191), и код вручную жонглировал этими адресами. В 1957 IBM выпустила Fortran (Formula Translation), созданный командой Джона Бэкуса за три года. Fortran позволил писать `VELOCITY = DISTANCE / TIME` вместо LOAD-STORE машинных последовательностей. Компилятор сам подбирал адрес и следил за ним. Скептики не верили, что компилятор сравнится с человеком на ассемблере, поэтому Fortran вышел с прямым сравнением: сгенерированный код не уступал, а иногда обходил написанный руками. К 1960 году именованная переменная стала стандартом везде. ALGOL 60 добавил scope и блочную структуру, C унаследовал типы из BCPL, Python (1991) выводит их сам. Механизм Бэкуса (имя, указывающее на ячейку памяти со значением) не изменился за 70 лет.
Что такое переменная?
**Переменная** - именованная ячейка памяти. Коробка с этикеткой: на этикетке - имя переменной, внутри - значение. Python держит каждую переменную как объект в heap с reference counter - простой `x = 5` создаёт объект int, связывает имя с адресом.
Создание переменной
Синтаксис присваивания
```python # Создаём переменную age со значением 25 age = 25 # Создаём переменную name со значением "Алиса" name = "Алиса" # Выводим значения print(age) # 25 print(name) # Алиса ```
**Оператор `=`** в программировании - это НЕ равенство, а **присваивание**. `x = 5` читается как «положить 5 в коробку x» или «x становится равным 5».
Изменение переменной
Значение можно менять
```python score = 0 # Начальный счёт print(score) # 0 score = 10 # Заработали 10 очков print(score) # 10 score = score + 5 # Добавили ещё 5 print(score) # 15 ``` Последняя строка: взяли старое значение (10), прибавили 5, положили обратно (15).
Что выведет код: `x = 10; x = x * 2; print(x)`?
Правила именования
Имя переменной - как имя функции в API. Плохое имя - техдолг на годы. Google Style Guide, PEP 8, Airbnb JavaScript Style - все посвящают naming conventions целые разделы. Причина - читаемость кода важнее любой другой оптимизации.
Правила именования в Python
Что можно и нельзя
**Можно:** - Буквы (a-z, A-Z), цифры (0-9), подчёркивание (_) - Начинать с буквы или подчёркивания - Использовать любую длину **Нельзя:** - Начинать с цифры: `2name` ❌ - Использовать пробелы: `my name` ❌ - Использовать спецсимволы: `my-name`, `my@name` ❌ - Использовать ключевые слова: `if`, `for`, `class` ❌
Хорошие vs плохие имена
Стиль имеет значение
```python # Плохо - имя не обозначает назначение x = 25 a = "Алиса" temp = 100 # Хорошо - сразу ясно user_age = 25 user_name = "Алиса" max_score = 100 ```
В Python принято использовать **snake_case**: слова разделяются подчёркиванием, всё в нижнем регистре. Например: `player_score`, `is_logged_in`, `total_price`. JavaScript предпочитает camelCase - разные языки, разные конвенции.
Какое имя переменной НЕПРАВИЛЬНОЕ?
Типы данных
Данные бывают разные: числа, текст, да/нет. Python автоматически определяет **тип** по значению. Но тип - не просто метка. int занимает 28 байт в Python, float - 24 байта, bool - наследует от int. TypeScript добавил статическую типизацию поверх JavaScript именно потому, что runtime-ошибки типов стоят дорого.
| Тип | Название | Примеры |
|---|---|---|
| int | Целое число | 42, -7, 0, 1000000 |
| float | Дробное число | 3.14, -0.5, 2.0 |
| str | Строка (текст) | "Hello", 'Мир', "123" |
| bool | Логический | True, False |
Примеры типов
Как Python различает типы
```python age = 25 # int (целое) price = 99.99 # float (дробное) name = "Алиса" # str (строка) is_student = True # bool (логический) # Проверяем тип функцией type() print(type(age)) # <class 'int'> print(type(price)) # <class 'float'> print(type(name)) # <class 'str'> print(type(is_student)) # <class 'bool'> ```
**"25" и 25 - разные вещи!** Первое - строка (текст), второе - число. Строку нельзя сложить с числом: `"25" + 5` вызовет ошибку TypeError. Stripe потерял бы миллиарды, если бы Python молча конвертировал типы.
Python автоматически конвертирует "5" + 5 в 10
Python НЕ конвертирует типы автоматически - будет ошибка TypeError
Python строгий в отношении типов. Чтобы сложить строку "5" с числом 5, нужно явно: int("5") + 5 = 10 или "5" + str(5) = "55".
Какой тип у значения "3.14"?
Преобразование типов
Иногда нужно превратить строку в число или наоборот. Для этого есть функции преобразования. `input()` в Python всегда возвращает строку - даже если пользователь ввёл «42». Это архитектурное решение: функция ввода не знает, что делать с числом, поэтому отдаёт текст.
Функции преобразования
Из одного типа в другой
```python # Строка -> Число text = "42" number = int(text) # 42 (целое) decimal = float(text) # 42.0 (дробное) # Число -> Строка age = 25 age_text = str(age) # "25" # Число -> Логический bool(0) # False bool(42) # True (любое ненулевое) bool("") # False (пустая строка) bool("Hi") # True (непустая строка) ```
Зачем это нужно?
Практический пример
```python # Пользователь вводит возраст (input всегда возвращает строку!) age_input = input("Сколько лет? ") # "25" # Чтобы посчитать год рождения, нужно число age = int(age_input) birth_year = 2024 - age print("Рождён в", birth_year) ```
Не всякую строку можно превратить в число! `int("hello")` вызовет ошибку ValueError. Строка должна содержать только цифры.
Что выведет: print("Score: " + str(100))?
Где этот урок в курсе
Переменные - атом хранения. Следующие уроки добавляют операции и структуру поверх:
Ключевые идеи
- **Переменная** - именованная ячейка памяти для хранения данных
- **`=`** - оператор присваивания, не равенство: кладёт значение в коробку
- **Типы**: int (целое), float (дробное), str (строка), bool (логическое)
- **Преобразование типов**: int(), float(), str(), bool() - явно, не автоматически
- **snake_case** - стандарт именования в Python: `user_age`, `is_premium`
- Имя переменной - это API: плохое имя становится техдолгом
Вопросы для размышления
- Банковское приложение хранит баланс пользователя. Какой тип выбрать - int или float? Что произойдёт при ошибке выбора типа в финансовых вычислениях?
Связанные уроки
- se-01 — Переменные - фундамент; SE объясняет как их организовывать в модули
- alg-01-big-o — Анализ алгоритмов требует понимания типов и их стоимости в памяти
- ds-03-stacks — Стек вызовов - наглядный пример переменных в разных scope
- ct-01 — Логическое мышление помогает понять присваивание vs равенство
- arch-01-binary