VibeCoderzVibeCoderz
Все статьи
Вайбкодинг: гайды2026/06/247 мин чтения

Функции, циклы и условия в Python: минимум для написания рабочего бота

Освойте функции, циклы и условия в Python за один вечер, и вы сможете быстро собрать Telegram‑бота, скрипт обхода URL и другие автоматизации без лишней теории.

Содержание (8)+

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, elif, else?

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: чем отличаются и что выбрать?

for — когда знаешь заранее, по чему итерировать. while — когда повторять нужно, пока выполняется условие.

Цикл for

Обходит любую последовательность: список, строку, словарь, результат 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)

Цикл while

Работает, пока условие остается 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 или while: быстрая таблица

СитуацияЧто брать
Пробежать по списку, кортежу, строкеfor
Выполнить N раз (range(N))for
Повторять до выполнения условияwhile
Ждать ответа от APIwhile
Бесконечный цикл (с break внутри)while True:
Изображение

Все три конструкции внутри aiogram 3.29

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: важный нюанс

Из транскрипта урока по 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: более специфичные условия — выше, более общие — ниже.

Изображение

FAQ

Можно ли написать функцию без 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 — любое количество именованных (как словарь). На старте это не нужно — разберешься по ходу, когда встретишь в чужом коде.


Следующий шаг

Три конструкции освоены. Теперь можно двигаться дальше: разобраться с клавиатурами и инлайн-кнопками в aiogram, подключить базу данных или сделать парсер.

Каталог AI-инструментов и IDE для разработки — на vibecoderz.ru/ide. Там же обзоры Windsurf и Cursor — двух IDE, где Python-код пишется через диалог с нейросетью.

Если хочешь разобраться, как ускорить разработку бота с AI — запишись на консультацию к Максиму.


Обновлено: октябрь 2026. Использована актуальная версия aiogram 3.29.0.

Автор

Максим Наговицын

Маркетинг-стратег, IT-предприниматель, ментор по вайбкодингу

2026/06/24

10+ лет в маркетинге, 300+ клиентских проектов: сайты, реклама, боты. Создатель GoBanana (228K+ пользователей, 11.6 млн ₽ выручки) и VibeCoderz. Делаю AI-продукты сам через Claude Code, Cursor, Windsurf и консультирую тех, кто хочет так же.

Об авторе →
All Posts

Читать далее

📄 Статья

Повысить качество фото онлайн бесплатно без регистрации

[ { "@context": "https://schema.org", "@type": "BlogPosting", "headline": "Повысить качество фото онлайн бесплатно без регистрации в 2026", "description": "В октябре 2026 повысить качество фото онлайн бесплатно можно через GoBanana, Qwen, Seedream и…

2026/10/1210 мин
📄 Статья

ИИ на телефоне Самсунг, Гугл и айфон в России в 2026 году

Встроенный ИИ в смартфонах 2026: Galaxy AI, Gemini, Apple

2026/10/0611 мин
📄 Статья

Создать песню ИИ на телефон в 2026 и поставить на звонок

Создать песню ИИ на телефон можно без студии и нот: ставите приложение Suno, описываете трек словами и через минуту слушаете два варианта. Дальше файл режется до 30 секунд и превращается в рингтон. Ниже разбираем Android и iPhone, что поменял запуск…

2026/10/0611 мин
📄 Статья

Миграции базы данных для новичка: как менять схему без потери данных

Миграции базы данных — это версионированные скрипты, которые переводят схему БД из одного состояния в другое без ручных правок и без потери данных. Разберем, зачем они нужны, чем отличаются Alembic, Drizzle и Prisma migrate, и что делать, если миграц…

2026/10/0610 мин
📄 Статья

Локальный ИИ на телефоне без интернета в 2026 честные цифры

Локальный ИИ на телефоне без интернета ставится примерно за десять минут: одно приложение из трех, модель весом 1-4 ГБ, авиарежим. На флагмане 2025-2026 годов это 15-26 токенов в секунду, на бюджетнике около трех, и разница чувствуется сразу. Ниже ра…

2026/10/0112 мин
📄 Статья

SonarQube в 2026: что это, редакции и как запустить первый анализ кода

SonarQube это платформа автоматического ревью кода, которую вы ставите на свой сервер. Она прогоняет исходники через набор правил и показывает баги, уязвимости и запахи кода в 30+ языках, а потом встраивается в CI и блокирует сборку, если новый код х…

2026/10/019 мин