Помните, как вы первый раз пришли на новую работу? Заходите, а HR такой: "Если у тебя есть пропуск, иди налево к лифтам, если нет, топай направо к ресепшену". Вот это и есть условные операторы в программировании! Они дают твоему коду мозги, чтобы он мог решать, что делать, в зависимости от ситуации.
if и else в Python это как руль для машины. Без них твой код это просто тачка, которая едет только прямо и никуда не сворачивает. В этой статье я разберу if, else по косточкам: от самых простых случаев до всяких хитростей, которые юзают продвинутые кодеры.
Этот гайд подойдет и тем, кто только начинает ковыряться в Python, и тем, кто уже что-то умеет, но хочет подтянуть знания или найти новые фишки для своих задач.
Видеоформат Часть 1:Кратко
ifвыполняет блок, когда условие истинно,elseкогда ложно. Третье слово,elif, проверяет следующее условие, если предыдущее не сработало.- Границы блока задают отступы, а не фигурные скобки: сдвинутая строка это уже другой блок.
- В условии не обязательно писать сравнение: Python сам приводит значение к истине или лжи, и пустая строка, ноль, пустой список считаются ложью.
- Условия объединяют через
and,orиnot, причем вычисление обрывается, как только результат ясен. - Для простого выбора из двух значений есть однострочная запись:
status = "adult" if age >= 18 else "minor". - Две самые частые ошибки новичка это забытый отступ и знак
=вместо==.
Что такое условные операторы в Python?
Условные операторы в Python это как развилки на дороге: программа смотрит на условие и решает, куда ей дальше. Представьте, что вы пишете приложение для доставки еды. Если заказ сделан до десяти вечера, принимаем, а если уже ночь на дворе выводим: "Сори, кухня закрыта".
В Python для этого есть три главных слова:
if: проверяет, правда ли условие, и если да, то делает, что сказано.
else: срабатывает, когда в if все ложь.
elif: проверяет следующее условие, если предыдущее оказалось ложным. В этой статье мы сосредоточимся на паре if и else, а про третье слово есть отдельный разбор, ссылка на него в конце статьи.
Кстати, в Python есть одна фишка, которая вначале бесила: отступы. Это не просто для красоты: они реально решают, какой код к какому if относится. В других языках для этого фигурные скобки используют, а тут пробелы. Помню, как я разок забыл отступ, и программа выдала такую дичь, что я час сидел и не мог разобраться.
if условие:
# Этот код выполнится, если условие истинно
passСинтаксис и базовый пример if-оператора
Начнем с простейшего примера. Допустим, вы создаете программу для банка, которая проверяет, может ли клиент снять деньги с карты:
balance = 1500
withdrawal = 1000
if balance >= withdrawal:
print("Операция разрешена. Выдаем деньги")
balance = balance - withdrawal
print(f"Остаток на счете: {balance}")В этом примере программа проверяет, достаточно ли денег на счете. Если условие balance >= withdrawal истинно, выполняется код в блоке с отступом.
Важный момент: Python использует концепцию "truthiness" и "falsiness". Некоторые значения считаются ложными даже без явного сравнения:
# Ложные значения (falsy)
if 0:
print("Не выполнится")
if "":
print("Пустая строка - тоже не выполнится")
if []:
print("Пустой список - не выполнится")
# Истинные значения (truthy)
if 1:
print("Выполнится!")
if "Привет":
print("Непустая строка - выполнится!")
if [1, 2, 3]:
print("Непустой список - выполнится!")Список ложных значений в Python короткий, и его проще один раз запомнить целиком. Ложью считается только вот это:
| Значение | Что это |
|---|---|
False |
сам логический ноль |
None |
отсутствие значения |
0, 0.0 |
нулевые числа любого типа |
"" |
пустая строка |
[] |
пустой список |
() |
пустой кортеж |
{} |
пустой словарь |
set() |
пустое множество |
Все остальное истинно, включая строку из одного пробела, строку "0" и список [0]: они непустые, а значит для if истинны. Полное правило описано в документации Python.
If...Else: Двустороннее принятие решений
В реальной жизни у нас редко бывает только один вариант развития событий. Обычно есть план А и план Б. То же самое в программировании: часто нужно предусмотреть альтернативу.
Вернемся к примеру с банкоматом, но теперь добавим обработку случая, когда денег недостаточно:
balance = 500
withdrawal = 1000
if balance >= withdrawal:
print("Операция разрешена. Выдаем деньги")
balance = balance - withdrawal
else:
print("Недостаточно средств на счете")
print(f"Ваш баланс: {balance}, запрошенная сумма: {withdrawal}")Блок else выполняется только тогда, когда условие в if оказывается ложным. Это гарантирует, что программа обработает любую ситуацию.
Практический пример: проверка возраста для покупки алкоголя:
age = int(input("Введите ваш возраст: "))
if age >= 21:
print("Добро пожаловать! Вы можете совершить покупку")
else:
print("Извините, продажа алкоголя лицам младше 21 года запрещена")Вложенные If-операторы
Иногда логика программы требует проверки условий внутри других условий. Это как матрешка: условие внутри условия. Вложенные if Python позволяют создавать сложную логику.
Пример: система скидок в интернет-магазине:
customer_type = "premium"
order_amount = 150
is_birthday = True
if customer_type == "premium":
print("Клиент категории Premium")
if order_amount >= 100:
discount = 0.15 # 15% скидка
print("Применена скидка 15% за крупную покупку")
if is_birthday:
discount += 0.05 # дополнительная скидка в день рождения
print("Дополнительная скидка 5% в честь дня рождения!")
else:
discount = 0.10 # 10% скидка для премиум-клиентов
print("Применена скидка 10% для Premium-клиента")
else:
if order_amount >= 200:
discount = 0.05 # 5% скидка для крупных заказов
print("Применена скидка 5% за крупную покупку")
else:
discount = 0 # без скидки
print("Скидка не применяется")
final_amount = order_amount * (1 - discount)
print(f"К оплате: {final_amount:.2f} руб.")Однако будьте осторожны: слишком глубокая вложенность делает код сложным для понимания. Если вложенность превышает 3-4 уровня, стоит подумать о рефакторинге кода.
Логические операторы в условных конструкциях
Логические операторы Python позволяют объединять несколько условий в одном выражении. Это как составление сложных предложений в русском языке с союзами "и", "или", "не".
Оператор AND
Оператор and возвращает True только когда ОБА условия истинны:
username = "admin"
password = "secret123"
is_logged_in = False
if username == "admin" and password == "secret123":
is_logged_in = True
print("Добро пожаловать в систему!")
else:
print("Неверные учетные данные")Оператор OR
Оператор or возвращает True, если истинно ХОТЯ БЫ одно условие:
day = "Saturday"
is_holiday = True
if day == "Saturday" or day == "Sunday" or is_holiday:
print("Сегодня выходной!")
else:
print("Рабочий день")Оператор NOT
Оператор not инвертирует значение условия:
email = "user@example.com"
is_valid_email = "@" in email and "." in email
if not is_valid_email:
print("Введите корректный email адрес")
else:
print("Email принят")Короткозамкнутое вычисление (Short-circuit evaluation)
Python умен и не проверяет второе условие, если результат уже ясен из первого. Это экономит время выполнения:
x = 0
y = 10
# Python не будет проверять y > 5, потому что x уже равно 0
if x > 0 and y > 5:
print("Оба условия истинны")
# Python не будет проверять второе условие, потому что первое уже истинно
if x == 0 or y > 100:
print("Хотя бы одно условие истинно")Однострочные If и тернарный оператор Python
Для простых условий Python предлагает компактный синтаксис. Тернарный оператор Python позволяет записать условие в одну строку:
# Обычная запись
age = 20
if age >= 18:
status = "adult"
else:
status = "minor"
# Тернарный оператор (однострочный if Python)
status = "adult" if age >= 18 else "minor"
print(status) # adultОднако не стоит злоупотреблять тернарными операторами. Если логика сложная, лучше использовать обычные if-else для читаемости кода.
Использование If с циклами и функциями
Условные операторы Python часто работают в связке с циклами и функциями, создавая мощные инструменты для обработки данных.
If с циклами
# Фильтрация списка email адресов
emails = ["user@example.com", "invalid-email", "admin@site.org", "", "test@domain.com"]
valid_emails = []
for email in emails:
if "@" in email and "." in email and len(email) > 5:
valid_emails.append(email)
else:
print(f"Пропущен некорректный email: {email}")
print("Валидные email адреса:", valid_emails)
# Поиск в списке с условием
products = [
{"name": "iPhone", "price": 80000, "category": "phones"},
{"name": "MacBook", "price": 150000, "category": "laptops"},
{"name": "Samsung Galaxy", "price": 60000, "category": "phones"}
]
print("Телефоны дешевле 70000:")
for product in products:
if product["category"] == "phones" and product["price"] < 70000:
print(f"- {product['name']}: {product['price']} руб.")If внутри функций
def grade_students(students_scores):
"""Функция для выставления оценок студентам"""
graded_students = []
for student, score in students_scores.items():
if score >= 90:
grade = "A"
status = "Отличник"
elif score >= 80:
grade = "B"
status = "Хорошист"
elif score >= 70:
grade = "C"
status = "Троечник"
else:
grade = "F"
status = "Требуется пересдача"
graded_students.append({
"name": student,
"score": score,
"grade": grade,
"status": status
})
return graded_students
# Использование функции
scores = {
"Анна": 95,
"Иван": 78,
"Мария": 88,
"Петр": 65
}
results = grade_students(scores)
for student in results:
print(f"{student['name']}: {student['score']} баллов - {student['grade']} ({student['status']})")Обратите внимание на цепочку elif: она проверяет условия по очереди и останавливается на первом подошедшем. Если бы мы вкладывали else друг в друга, код уехал бы вправо на три уровня отступов и читался бы заметно хуже.
Частые ошибки и как их избежать
За годы обучения программированию на Python я видел одни и те же ошибки у новичков. Вот самые распространенные из них:
1. Неправильные отступы
# НЕПРАВИЛЬНО
if 5 > 3:
print("Это вызовет ошибку IndentationError")
# ПРАВИЛЬНО
if 5 > 3:
print("Теперь все работает")2. Использование = вместо ==
# НЕПРАВИЛЬНО - присваивание вместо сравнения
x = 10
if x = 5: # SyntaxError!
print("Ошибка")
# ПРАВИЛЬНО
if x == 5:
print("Правильное сравнение")3. Сложные вложенные условия
# ПЛОХО - трудно читать и понимать
if user.is_authenticated():
if user.has_permission('read'):
if document.is_available():
if user.subscription.is_active():
if not document.is_private() or user.id == document.owner_id:
return document.content
# ЛУЧШЕ - используйте функции для разбиения логики
def can_access_document(user, document):
if not user.is_authenticated():
return False
if not user.has_permission('read'):
return False
if not document.is_available():
return False
if not user.subscription.is_active():
return False
if document.is_private() and user.id != document.owner_id:
return False
return True
if can_access_document(user, document):
return document.content4. Неправильное понимание truthy/falsy
# Потенциальная ошибка
items = []
if items: # Пустой список - falsy
print("У нас есть товары")
else:
print("Товаров нет") # Выполнится это
# Более явная проверка
if len(items) > 0:
print("У нас есть товары")
else:
print("Товаров нет")Заключение
if и else в Python это как основа основ, без них ни один проект не взлетит. Мы прошлись по всему, что нужно знать про условные операторы: от простого if до всяких замороченных вложенных конструкций и хитрых тернарных операторов.
Вот что стоит заучить:
- Отступы это святое в Python, не лажайте с пробелами.
- Юзайте and, or, not, чтобы склеивать условия.
- Не забывайте про штуки типа truthy и falsy: они реально выручают.
- Не закапывайтесь в кучу вложенных условий, а то код станет как лабиринт.
- Тернарный оператор это как лайфхак для простых проверок.
Теперь пора засунуть руки в код! Напишите свою программку с if и else. Начните с чего-то легкого, типа проверки возраста для входа в клуб, а потом усложняйте. Я сам так учился: писал простенькие штуки, ломал их, психовал, но в итоге все в голове уложилось.
Если вы только начинаете кодить, не зацикливайтесь только на условиях. Погрузитесь в циклы, функции, списки, словари, это все база. А если хотите реально прокачаться в Python и стать профи, зацените интерактивный курс на JavaRush. Там куча задачек и проектов, которые прям вдалбливают материал.
А для тех, кто мечтает сделать кодинг своей профессией и быстро вырасти до миддла, гляньте Python-университет от JavaRush. Это прям убойная программа с менторами, которая за 12 месяцев превратит вас в полноценного специалиста.
Удачи в кодинге! Помните: без практики все это просто слова.
| Что еще почитать: |
|---|
Вопросы и ответы
Как работает оператор if else в Python?
Python вычисляет условие после слова if и приводит результат к истине или лжи. Если получилась истина, выполняется блок с отступом под if, а блок под else пропускается. Если ложь, наоборот. Блок else необязателен: без него при ложном условии программа просто идет дальше.
Почему в Python так важны отступы?
Потому что они и есть границы блока: в других языках эту роль играют фигурные скобки, а здесь пробелы. Строка с отступом относится к условию, строка без отступа выполняется всегда. Если отступ забыть, программа даже не запустится: вы получите IndentationError: expected an indented block after "if" statement. Стандарт PEP 8 рекомендует четыре пробела на уровень.
Какие значения Python считает ложными?
Всего восемь случаев: False, None, ноль любого числового типа, пустая строка, пустой список, кортеж, словарь и множество. Все остальное истинно. Отсюда популярная ловушка: строка из одного пробела и строка "0" непустые, поэтому условие с ними сработает.
Чем отличается = от == в условии?
Один знак равенства это присваивание, два это сравнение. В условии нужно сравнение, и если ошибиться, Python не запустит файл, а подскажет прямым текстом: SyntaxError: invalid syntax. Maybe you meant "==" or ":=" instead of "="?. Упомянутый в подсказке := это отдельный оператор, который позволяет прямо в условии присвоить значение и сразу его проверить.
Как записать if и else в одну строку?
Через условное выражение, его же называют тернарным оператором: сначала пишут значение для истинного случая, потом слово if с условием, потом слово else и значение для ложного случая. Например: status = "adult" if is_adult else "minor". Подходит такая запись только для коротких проверок: в сложной логике она быстро становится нечитаемой.
Как проверить несколько условий сразу?
Объединить их операторами and (нужны оба условия), or (достаточно одного) и not (отрицание). Python вычисляет такие выражения лениво: в and он не станет проверять второе условие, если первое ложно, а в or не станет, если первое истинно. На этом основан частый прием: сначала проверяют, что объект существует, и только потом обращаются к его данным.