Основы программирования

Переменные и типы данных

**Загадка:** В программе написано `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))?

Где этот урок в курсе

Переменные - атом хранения. Следующие уроки добавляют операции и структуру поверх:

  • Операторы — Когда значения сохранены, арифметика и логика работают с ними
  • Строки — str - один из четырёх базовых типов отсюда, со своим набором инструментов
  • Условия — Переменные bool управляют ветвлением if/else
  • Массивы — Когда одной переменной мало, массивы объединяют много значений под одним именем

Ключевые идеи

  • **Переменная** - именованная ячейка памяти для хранения данных
  • **`=`** - оператор присваивания, не равенство: кладёт значение в коробку
  • **Типы**: 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
Переменные и типы данных

0

1

Войти