Python пугает новичков именно до написания первого рабочего кода. После — перестает. Функции, циклы и условия — это три конструкции, которых хватает, чтобы бот в Telegram отвечал на команды, скрипт обходил список URL и автоматизация делала то, что до…
10+ лет в маркетинге, 300+ клиентских проектов: сайты, реклама, боты. Создатель GoBanana (228K+ пользователей, 11.6 млн ₽ выручки) и VibeCoderz. Делаю AI-продукты сам через Claude Code, Cursor, Windsurf и консультирую тех, кто хочет так же.
Об авторе →Claude Code: новый CLI-агент от Anthropic
Anthropic выпустила Claude Code — терминальный AI-агент для разработчиков. Инструмент работает прямо в командной строке и умеет писать, редактировать и запускать код.
Zcode AI: Полный гид по визуальному интерфейсу для Claude Code и AI-агентов
Узнайте, как использовать Zcode для управления Claude Code, Gemini и Codex в едином GUI. Настройка провайдеров, MCP-серверов и визуальный вайбкодинг.
YouTube-канал с монетизацией из любой точки мира: Пошаговый гайд 2026
Инструкция по созданию YouTube-канала: обход блокировок SMS, настройка расширенных функций через виртуальные номера и правила безопасности для монетизации.
Windsurf Code Maps: Как глубоко понимать архитектуру проекта перед написанием кода
Полный гайд по Windsurf Code Maps, модели Sway 1.5 и Sway Grep. Узнайте, как визуализировать архитектуру кода и ускорить разработку в 13 раз.
Vk Fast Cash Strategy
Аудитория ВКонтакте — это те же люди, что и в Instagram, но 'социальный контракт' площадки другой. Если Instagram — это 'дорогой ресторан' с демонстрацией успеха, то VK — это 'душевная шашлычная'. Здесь не работает глянцевый 'успешный успех
Python пугает новичков именно до написания первого рабочего кода. После — перестает. Функции, циклы и условия — это три конструкции, которых хватает, чтобы бот в Telegram отвечал на команды, скрипт обходил список URL и автоматизация делала то, что должна.
Никакой теории ради теории. Разберем каждую конструкцию через практику — на примерах, которые можно скопировать и запустить.
В этой статье: что такое функция и как она работает под капотом, как писать условия if/elif/else без ошибок, чем for отличается от while и когда что брать, как все три конструкции выглядят внутри aiogram 3.29.

Обновлено: июнь 2026
TL;DR: Три конструкции Python — функции (def/return), условия (if/elif/else) и циклы (for/while) — это фундамент любого бота или скрипта. Освоить их можно за один вечер. Aiogram 3.29 (актуальная версия на июнь 2026) строится именно на этих конструкциях: каждый обработчик команды — это функция с условием внутри.
Функция — блок кода с именем, который можно вызывать сколько угодно раз. Без функций длинный скрипт превращается в нечитаемую стену.
Вот реальная ситуация: пишешь бота, которому нужно в трех местах считать итог заказа. Без функций — три копии одного и того же кода. Исправил баг в одном месте — забыл в двух других.
С функцией — одно определение, три вызова:
def calculate_total(price, quantity):
return price * quantity
# вызываем в любом месте кода
order_1 = calculate_total(150, 3)
order_2 = calculate_total(80, 10)Синтаксис простой: def + имя + скобки с параметрами + двоеточие. Дальше — тело функции с отступом. return возвращает результат обратно туда, где функцию вызвали.

Python не выполняет код функции в момент определения — только запоминает. Выполнение начинается при вызове.
Когда пишешь def calculate_total(price, quantity):, Python откладывает код в память и присваивает ему имя. Когда доходишь до calculate_total(150, 3), Python достает этот код, подставляет 150 в price и 3 в quantity — и только тогда выполняет.
Важный момент: переменные внутри функции живут только пока функция выполняется. Это называется локальная область видимости. После return они исчезают.
def greet(name):
message = f"Привет, {name}!" # локальная переменная
return message
text = greet("Максим")
# print(message) — здесь вызовет ошибку, message уже не существует
print(text) # а вот это сработаетИменно поэтому return обязателен, если хочешь использовать результат работы функции снаружи.
Параметр — это то, что описано в определении функции. Аргумент — конкретное значение при вызове.
def send_message(chat_id, text): # chat_id и text — параметры
pass
send_message(123456, "Привет!") # 123456 и "Привет!" — аргументыПутаница между ними — самая частая ошибка на собесах по Python. Теперь не запутаешься.

Иногда нужно, чтобы функция работала без части аргументов:
def send_notification(text, parse_mode="HTML"):
# parse_mode по умолчанию HTML, но можно передать другой
passОбязательное правило: параметры со значением по умолчанию — всегда после обязательных. Иначе Python выдаст ошибку.
if проверяет условие. Если True — выполняет блок. elif — следующая проверка, если первая не сработала. else — что делать, если ничего не подошло.
Базовый пример с ботом:
async def handle_command(message):
command = message.text
if command == "/start":
await message.answer("Привет! Я VibeCoderz-бот.")
elif command == "/help":
await message.answer("Список команд: /start, /help, /about")
elif command == "/about":
await message.answer("Портал про вайбкодинг: vibecoderz.ru")
else:
await message.answer("Не знаю такой команды. Попробуй /help")Python проверяет условия сверху вниз и останавливается на первом совпадении. Порядок имеет значение.

and — оба условия должны быть True. or — хотя бы одно. not — инвертирует.
# Проверяем, можно ли пропустить пользователя в платный раздел
if is_subscribed and not is_banned:
show_premium_content()
elif is_trial_user or has_promo_code:
show_limited_content()
else:
redirect_to_payment()Есть нюанс со short-circuit: Python прекращает проверку, как только результат становится очевиден. В and — при первом False. В or — при первом True. Это полезно: дорогую проверку ставь правее.
Когда условие простое — записывается в одну строку:
status = "активен" if user.is_active else "заблокирован"Читается как обычное предложение. В боте удобно для формирования текстов.
Python позволяет писать 18 <= age < 65 вместо age >= 18 and age < 65. Это не сокращение — это корректный синтаксис, который проверяет оба неравенства за один раз.
for — когда знаешь заранее, по чему итерировать. while — когда повторять нужно, пока выполняется условие.
Обходит любую последовательность: список, строку, словарь, результат range():
commands = ["/start", "/help", "/about", "/catalog"]
for command in commands:
print(f"Зарегистрирована команда: {command}")Чаще всего for используют именно так — пробежать по коллекции и что-то сделать с каждым элементом.
# Генерация сообщений для 100 пользователей
user_ids = [111, 222, 333, 444]
for user_id in user_ids:
send_welcome_message(user_id)Работает, пока условие остается True:
attempts = 0
max_attempts = 3
while attempts < max_attempts:
result = try_connect_to_api()
if result.success:
break # вышли из цикла досрочно
attempts += 1Главная ловушка — бесконечный цикл. Если условие никогда не становится False, программа зависнет. Всегда проверяй, что переменная в условии изменяется.
break — прерывает цикл. continue — пропускает текущую итерацию и идет к следующей.
| Ситуация | Что брать |
|---|---|
| Пробежать по списку, кортежу, строке | for |
| Выполнить N раз (range(N)) | for |
| Повторять до выполнения условия | while |
| Ждать ответа от API | while |
| Бесконечный цикл (с break внутри) | while True: |

Aiogram — актуальная библиотека для Telegram-ботов на Python. Последняя версия на июнь 2026 — 3.29.0, вышла 14 июня 2026. Требует Python 3.10+.
Ниже — полный рабочий бот с командами /start, /help и /echo. Внутри него функции, условия и цикл — всё, что разобрали выше.
import asyncio
import os
from aiogram import Bot, Dispatcher, F
from aiogram.filters import Command
from aiogram.types import Message
from dotenv import load_dotenv
load_dotenv()
bot = Bot(token=os.getenv("BOT_TOKEN"))
dp = Dispatcher()
# --- ФУНКЦИИ ---
def format_welcome(username: str) -> str:
"""Возвращает приветственный текст."""
return f"Привет, {username}! Я бот VibeCoderz.\n\nЧто умею:\n/help — список команд\n/echo — повторяю твой текст"
def is_valid_text(text: str) -> bool:
"""Проверяет, что сообщение не пустое и не команда."""
if not text:
return False
if text.startswith("/"):
return False
return True
# --- ОБРАБОТЧИКИ (функции + условия) ---
@dp.message(Command("start"))
async def cmd_start(message: Message):
name = message.from_user.first_name or "вайбкодер"
await message.answer(format_welcome(name), parse_mode="HTML")
@dp.message(Command("help"))
async def cmd_help(message: Message):
commands = ["/start", "/help", "/echo"]
help_text = "Список команд:\n"
# Цикл for — собираем текст из списка
for cmd in commands:
help_text += f" {cmd}\n"
await message.answer(help_text)
@dp.message(F.text)
async def handle_text(message: Message):
text = message.text
# Условие if/elif/else
if not is_valid_text(text):
return
if len(text) > 200:
await message.answer("Текст слишком длинный. Пришли короче 200 символов.")
elif text.lower() in ["привет", "hello", "hi"]:
await message.answer(f"Привет! Напиши /help чтобы узнать, что я умею.")
else:
await message.answer(f"Ты написал: {text}")
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())Установка за две команды:
pip install aiogram python-dotenvСоздай файл .env и добавь туда:
BOT_TOKEN=твой_токен_от_BotFatherЗапуск:
python main.pyБот готов.
Максим: «Первый бот у меня пошел за один вечер в Аргентине — скачал Windsurf, посмотрел пару видео на YouTube, начал делать. Как маркетолог с 10-летним опытом, я всегда мечтал делать продукты без программистов. Оказалось, три конструкции — функции, if и for — это 80% того, что реально нужно.»

Вот что ломает код чаще всего — и как не наступать на эти грабли.
1. Забытое двоеточие
# Неправильно
if x > 0
print(x)
# Правильно
if x > 0:
print(x)После if, elif, else, for, while, def — всегда двоеточие. Без него Python ругается с SyntaxError.
2. Неправильный отступ
Python использует отступы вместо скобок. Стандарт — 4 пробела (не табы, хотя Python принимает оба варианта, смешивать нельзя).
def calculate(x):
result = x * 2 # правильно — 4 пробела
return result # ошибка — 2 пробела3. Бесконечный цикл
# Опасно
i = 0
while i < 10:
print(i)
# забыли i += 1 — цикл никогда не завершитсяВсегда проверяй, что счетчик изменяется. Или используй break с логическим условием выхода.
4. Сравнение с True/False напрямую
# Лишнее
if is_active == True:
...
# Чище
if is_active:
...
# И то же с отрицанием
if not is_banned:
...5. return вне функции
return работает только внутри def. Это звучит очевидно, но новички периодически ставят return в тело цикла вне функции — и получают SyntaxError.
Из транскрипта урока по aiogram 3.x: если поставить общий обработчик текста (F.text) раньше командных обработчиков (Command("start")), команды перестанут работать — общий поймает сообщение раньше.
Правило: сначала конкретные команды, потом общий обработчик.
# Правильный порядок регистрации
@dp.message(Command("start")) # конкретная команда — первой
async def cmd_start(message: Message):
...
@dp.message(Command("help")) # ещё конкретная
async def cmd_help(message: Message):
...
@dp.message(F.text) # общий текст — последним
async def handle_text(message: Message):
...Аналогия с if/elif/else: более специфичные условия — выше, более общие — ниже.

Можно ли написать функцию без return?
Да. Python автоматически вернет None. Это нормально для функций, которые выполняют действие (печатают, отправляют сообщение), а не вычисляют результат. Но если ты попробуешь использовать результат такой функции в выражении — получишь None, что часто приводит к неожиданным ошибкам.
Чем for i in range(10) отличается от while i < 10?
Функционально — одно и то же. Но for с range() чище и безопаснее: счетчик обновляется автоматически. С while нужно самому следить, что i растет, иначе бесконечный цикл.
Сколько elif можно написать?
Сколько угодно. На практике больше 4–5 — сигнал, что стоит рефакторить: скорее всего, стоит использовать словарь или отдельные функции.
Почему переменная внутри функции не видна снаружи?
Потому что у каждой функции своя локальная область видимости. Это защита от конфликтов имен: можно называть переменные одинаково в разных функциях — они не пересекутся. Хочешь вернуть значение из функции — используй return.
Можно ли вызвать функцию до её определения?
Нет. Python читает код сверху вниз. Если вызываешь функцию раньше, чем написал def, получишь NameError. Исключение — если вызов внутри другой функции, которую вызовешь позже.
Что такое async def и зачем оно в aiogram?
Это асинхронная функция. Aiogram работает асинхронно: пока бот ждет ответа от Telegram, он может обрабатывать другие запросы. Для новичка достаточно знать: в aiogram все обработчики пишутся с async def, а внутри них ставишь await перед вызовами методов бота.
Что такое *args и **kwargs?*args позволяет функции принять любое количество позиционных аргументов (они приходят как кортеж). **kwargs — любое количество именованных (как словарь). На старте это не нужно — разберешься по ходу, когда встретишь в чужом коде.
Функция (function) — блок кода с именем, который можно вызывать многократно. Определяется через def.
Параметр (parameter) — переменная в заголовке функции, описывающая ожидаемые входные данные.
Аргумент (argument) — конкретное значение, которое передается в функцию при вызове.
return — оператор, возвращающий значение из функции обратно в точку вызова.
Локальная переменная — переменная, созданная внутри функции. Живет только пока функция выполняется.
Глобальная переменная — переменная, созданная вне функций. Доступна во всем файле.
if/elif/else — операторы ветвления. Позволяют выполнять разные блоки кода в зависимости от условия.
Тернарный оператор — однострочная запись if/else: значение_если_True if условие else значение_если_False.
Цикл for — повторяет блок кода для каждого элемента последовательности.
Цикл while — повторяет блок кода, пока условие остается True.
break — немедленно прерывает цикл.
continue — пропускает остаток текущей итерации и переходит к следующей.
Aiogram — асинхронная Python-библиотека для создания Telegram-ботов. Актуальная версия на июнь 2026: 3.29.0.
Асинхронная функция (async def) — функция, которая может «передавать управление» другим задачам во время ожидания. Используется в aiogram.
Три конструкции освоены. Теперь можно двигаться дальше: разобраться с клавиатурами и инлайн-кнопками в aiogram, подключить базу данных или сделать парсер.
Каталог AI-инструментов и IDE для разработки — на vibecoderz.ru/ide. Там же обзоры Windsurf и Cursor — двух IDE, где Python-код пишется через диалог с нейросетью.
Если хочешь разобраться, как ускорить разработку бота с AI — запишись на консультацию к Максиму.
Обновлено: июнь 2026. Использована актуальная версия aiogram 3.29.0.