Основы программирования
Операторы
1994 год. Intel Pentium выходит с аппаратным багом в операции деления. Результат 4195835.0 / 3145727.0 возвращал 1.333739068 вместо 1.333820449. Никто не заметил полгода. Убыток - 475 миллионов долларов на замену процессоров. Один неправильный оператор деления на кремниевом уровне - и компания в кризисе.
- **Игры**: damage = base_attack * critical_multiplier - арифметика определяет баланс
- **E-commerce**: total = price * quantity - discount - каждый символ меняет деньги
- **Безопасность**: can_access = is_authenticated and not is_banned - логика открывает двери
- **Навигация**: is_nearby = distance < 100 and traffic_level == 'low' - сравнения меняют маршруты
История операторов: от перфокарт до Python
В 1957 году команда IBM под руководством Джона Бэкуса выпустила Fortran - первый язык с математическими операторами в читаемой форме. До этого программисты писали операции в машинных кодах. Бэкус настоял на том, чтобы A = B + C выглядело как формула, а не как hex-последовательность. Компилятор Fortran генерировал код настолько эффективно, что скептики не верили - вручную так не пишут. Этот синтаксис операторов дожил до Python, JavaScript и всех современных языков.
Цели урока
- Освоить арифметические операторы (+, -, *, /, //, %, **)
- Понять операторы сравнения (==, !=, <, >, <=, >=)
- Научиться комбинировать условия через and, or, not
- Знать приоритет операторов
Предварительные знания
- Переменные и базовые типы данных (int, float, str, bool)
- Понимание присваивания через = (урок 3)
Арифметические операторы
Python поддерживает все стандартные математические операции плюс три специальных: целочисленное деление `//`, остаток `%`, и возведение в степень `**`.
| Оператор | Название | Пример | Результат |
|---|---|---|---|
| + | Сложение | 5 + 3 | 8 |
| - | Вычитание | 5 - 3 | 2 |
| * | Умножение | 5 * 3 | 15 |
| / | Деление | 7 / 2 | 3.5 |
| // | Целочисленное деление | 7 // 2 | 3 |
| % | Остаток от деления | 7 % 2 | 1 |
| ** | Возведение в степень | 2 ** 3 | 8 |
Оператор `%` - не только остаток. С его помощью проверяют чётность (`n % 2 == 0`), берут последнюю цифру числа (`n % 10`), и зацикливают индексы в массивах (`(i + 1) % size`).
Что выведет: print(17 % 5)?
Операторы сравнения
Операторы сравнения возвращают `True` или `False`. Это основа для условий, циклов и фильтрации данных.
| Оператор | Значение | Пример | Результат |
|---|---|---|---|
| == | Равно | 5 == 5 | True |
| != | Не равно | 5 != 3 | True |
| < | Меньше | 3 < 5 | True |
| > | Больше | 3 > 5 | False |
| <= | Меньше или равно | 5 <= 5 | True |
| >= | Больше или равно | 3 >= 5 | False |
`=` - это присваивание (положить значение в переменную). `==` - это сравнение (проверить равенство). Путаница между ними - одна из самых частых ошибок в Python.
Что выведет: x = 5; print(x == "5")?
Логические операторы
Логические операторы комбинируют несколько условий в одно выражение. Это прямая реализация булевой алгебры.
| Оператор | Значение | Пример | Результат |
|---|---|---|---|
| and | И (оба True) | True and True | True |
| or | ИЛИ (хотя бы один True) | True or False | True |
| not | НЕ (инверсия) | not True | False |
**Short-circuit evaluation**: Python останавливается как только результат определён. В `False and X` - X не вычисляется. В `True or X` - тоже. Это не только оптимизация, но и защита: `user and user.is_active` не бросит ошибку если `user` равен `None`.
Можно писать: if x == 1 or 2 or 3
Нужно: if x == 1 or x == 2 or x == 3 (или: if x in [1, 2, 3])
`or 2` всегда True - любое ненулевое число является truthy в Python. Выражение читается как (x == 1) or (2) or (3), и всегда возвращает True.
Что выведет: print(True or False and False)?
Составные операторы присваивания
Вместо `x = x + 5` принято писать `x += 5`. Это не просто синтаксический сахар - в некоторых структурах данных составные операторы работают быстрее.
| Оператор | Эквивалент | Пример |
|---|---|---|
| += | x = x + n | x += 5 |
| -= | x = x - n | x -= 3 |
| *= | x = x * n | x *= 2 |
| /= | x = x / n | x /= 4 |
| //= | x = x // n | x //= 3 |
| %= | x = x % n | x %= 7 |
| **= | x = x ** n | x **= 2 |
Что будет в x после: x = 10; x //= 3; x += 1?
Приоритет операторов
Как в математике, операторы Python имеют приоритет. Знание приоритетов предотвращает скрытые баги - именно такой баг и привёл к проблеме с Pentium.
При сомнении - ставить скобки. `(2 + 3) * 4` однозначно даёт 20. Скобки делают код читаемым и предотвращают ошибки, которые трудно отловить.
Что выведет: print(2 + 3 * 4 ** 2)?
Где этот урок в курсе
Операторы - инструменты, которые превращают переменные в вычисления. Дальше курс собирает из них логику и поток программы:
Главное
- **Арифметика**: +, -, *, /, //, %, ** - семь операторов для всей математики
- **// и %**: целочисленное деление и остаток - сильная пара для работы со временем и пространством
- **Сравнения**: ==, !=, <, >, <=, >= - возвращают bool, основа любой логики
- **Логика**: and (И), or (ИЛИ), not (НЕ) - булева алгебра в одну строку
- **Составные**: +=, -= и т.д. - сокращённая запись, стандарт индустрии
- **Приоритет**: ** - */% - +- - сравнения - not - and - or
Вопросы для размышления
- Почему Intel Pentium баг с делением не заметили полгода - что это говорит о тестировании граничных значений?
- Когда использовать // вместо / и почему это архитектурное решение, а не просто синтаксис?
- Почему short-circuit evaluation в and/or - это не только удобство, но и механизм защиты от ошибок?
Связанные уроки
- prog-03-variables — Без знания типов результат оператора непредсказуем (5 == '5' это False)
- prog-05-strings — Конкатенация и срезы строк расширяют те же операторы
- prog-06-conditionals — Сравнения и логические операторы это сырьё для if/else
- prog-07-loops — Условия циклов опираются на сравнения и логические операторы
- prog-09-recursion — Составные операторы вроде += основа паттерна аккумулятора
- alg-01-big-o