Основы Python для начинающих: логика, автоматизация и первые проекты

Этот курс предназначен для абсолютных новичков, желающих понять логику программирования на примере Python. Вы научитесь писать скрипты для автоматизации рутины, читать чужой код и создадите свое первое интерактивное приложение.

1. Основы синтаксиса и базовая логика

Основы синтаксиса и базовая логика

Программирование часто кажется магией, но на самом деле это просто способ общения с компьютером. Как и в любом человеческом языке, в Python есть свой словарный запас и правила грамматики. Эти правила называются синтаксисом. Если вы нарушите правила русского языка, собеседник вас, скорее всего, поймет. Компьютер же абсолютно прямолинеен: малейшая опечатка, и он откажется выполнять задачу.

Главный принцип Python — код должен быть легко читаемым. Создатель языка Гвидо ван Россум задумывал его так, чтобы программы выглядели почти как обычный текст на английском языке.

Переменные: коробки для хранения данных

Любая программа работает с информацией: именами пользователей, ценами товаров, количеством жизней в игре. Чтобы компьютер не забыл эти данные, их нужно где-то сохранить. Для этого используются переменные.

Представьте себе переезд. Вы берете пустую картонную коробку, кладете в нее книги и маркером пишете на боку: «Книги». В программировании переменная — это такая же коробка в памяти компьютера. Вы даете ей имя и кладете внутрь значение.

В Python создание переменной выглядит максимально просто:

Разберем этот код по частям:

  • user_age и player_name — это имена наших «коробок». Мы придумываем их сами. Хороший тон — называть переменные так, чтобы было понятно, что внутри. Имя x ни о чем не говорит, а user_age сразу дает понять, что здесь хранится возраст пользователя.
  • Знак = — это оператор присваивания. В математике он означает равенство, но в программировании это команда: «возьми то, что справа, и положи в коробку с именем, которое написано слева».
  • 25 и "Алексей" — это сами данные.
  • !Визуализация переменных как коробок для хранения данных

    Важное свойство переменных скрыто в самом их названии — они могут меняться. Если в процессе игры пользователь зарабатывает очки, мы просто кладем в ту же коробку новое значение, а старое исчезает навсегда:

    Типы данных: почему 5 и "5" — это не одно и то же

    Компьютер должен точно знать, с какой именно информацией он работает, потому что правила обработки для разных данных отличаются. В Python есть три базовых типа данных, с которыми вы будете сталкиваться постоянно:

    Целые числа (integer или просто int*): числа без дробной части. Например: 10, -5, 1000000. Используются для подсчета количества предметов, возраста, шагов в цикле. Числа с плавающей точкой (float*): дробные числа. В программировании дробная часть всегда отделяется точкой, а не запятой. Например: 3.14, 99.99, -0.5. Нужны для расчетов цен, веса, точных координат. Строки (string или str*): любой текст. Строки всегда нужно заключать в кавычки (одинарные '' или двойные "" — в Python нет разницы). Например: "Привет", 'Game Over', "123".

    Обратите внимание на последний пример. Число 123 и строка "123" для компьютера — совершенно разные вещи. С числом можно проводить математические операции. Строка же воспринимается просто как набор символов, как картинка с текстом.

    > Если вы попытаетесь сложить число 5 и строку "5", Python выдаст ошибку, потому что он не понимает, как математически прибавить текст к числу.

    Базовая математика и работа с текстом

    Python отлично справляется с ролью мощного калькулятора. Он поддерживает все стандартные арифметические операции:

    * Сложение: + * Вычитание: - Умножение: * Деление: /

    Посмотрим, как это работает на практике. Допустим, мы пишем скрипт для расчета стоимости заказа в кафе:

    Здесь мы использовали встроенную команду print(). Это способ программы «заговорить» с нами. Все, что вы поместите внутри скобок, будет выведено на экран. В данном случае программа посчитает сумму (630) и покажет ее.

    Интересно, что знак + работает не только с числами, но и со строками. Этот процесс называется конкатенацией (склеиванием):

    На экране появится: Привет, Анна. Программа буквально приклеила вторую строку к концу первой.

    Интерактивность: общение с пользователем

    Программы были бы скучными, если бы работали только с заранее заданными данными. Чтобы скрипт стал полезным, он должен уметь запрашивать информацию у пользователя. Для этого используется команда input().

    Когда программа дойдет до команды input(), она остановится и будет ждать, пока вы не напечатаете ответ на клавиатуре и не нажмете Enter. То, что вы введете, сохранится в переменную user_name.

    Здесь кроется один важный нюанс: команда input() всегда сохраняет данные как строку (string). Даже если вы введете свой возраст цифрами, Python воспримет это как текст "25". Чтобы использовать эти данные в математических расчетах, их нужно преобразовать в целое число с помощью команды int():

    Условная логика: как программы принимают решения

    До этого момента наши скрипты выполнялись строго сверху вниз, строка за строкой. Но настоящие программы умеют ветвиться и принимать решения в зависимости от ситуации.

    Представьте фейсконтроль в клубе: охранник проверяет ваш паспорт. Если вам 18 лет или больше, он пропускает вас. В противном случае — отправляет домой. В Python для реализации такой логики используются условные операторы if (если) и else (иначе).

    Рассмотрим это на примере реальной медицинской задачи. Индекс массы тела рассчитывается по известной медицинской формуле:

    где — индекс массы тела, — масса человека в килограммах, а — рост человека в метрах. Напишем программу, которая считает этот индекс и дает рекомендацию:

    Разберем новые элементы:

  • if bmi < 18.5: — это условие. Программа проверяет, правда ли, что значение переменной bmi меньше 18.5. Обратите внимание на двоеточие : в конце строки. Оно обязательно и означает: «если условие верно, выполни следующий блок кода».
  • elif bmi < 25.0: — это сокращение от else if (иначе если). Программа дойдет до этой строки, только если первое условие оказалось ложным.
  • else: — срабатывает во всех остальных случаях, когда ни одно из предыдущих условий не подошло.
  • Важность отступов

    Посмотрите внимательно на код выше. Команды print() смещены вправо. В Python отступы (обычно это 4 пробела) играют критическую роль. Они показывают, какие именно команды относятся к условию if.

    В других языках программирования для группировки кода часто используют фигурные скобки {}, но Python заставляет писать визуально чистый и структурированный код. Если вы забудете поставить отступ после if, программа выдаст ошибку и откажется работать.

    Анатомия частых ошибок

    Ошибки — это нормальная часть работы любого программиста, даже с двадцатилетним стажем. Когда Python сталкивается с проблемой, он останавливает работу и выводит сообщение об ошибке (traceback). Ваша задача — научиться их читать.

    Вот три самые популярные ошибки новичков:

    | Название ошибки | Причина | Пример из жизни | | :--- | :--- | :--- | | SyntaxError | Нарушение грамматики языка. Вы забыли закрыть скобку, пропустили двоеточие после if или не поставили кавычки вокруг текста. | Написать предложение без пробелов и знаков препинания. | | NameError | Использование переменной, которая не была создана. Чаще всего возникает из-за банальной опечатки в имени переменной (например, создали price, а пытаетесь вывести pricce). | Попытка позвонить другу по имени, которого нет в вашей телефонной книге. | | IndentationError | Проблема с отступами. Вы поставили лишний пробел в начале строки или, наоборот, забыли сделать отступ после условного оператора. | Сбой в иерархии оглавления книги, когда глава оказывается внутри параграфа. |

    Если вы видите красные строки с ошибкой, не паникуйте. Посмотрите на самую последнюю строчку сообщения — там будет написано название ошибки (например, NameError). А чуть выше Python укажет точный номер строки в вашем коде, где эта ошибка произошла. Найдите эту строку, проверьте опечатки, скобки и отступы, и проблема будет решена.

    2. Циклы, функции и структуры данных

    Циклы, функции и структуры данных

    В предыдущих материалах мы научились сохранять единичные данные в переменные и заставлять программу принимать решения с помощью условий if и else. Этого достаточно для создания простого калькулятора или базового текстового квеста. Но реальные задачи требуют работы с огромными объемами информации. Представьте, что вам нужно обработать список из тысячи клиентов или написать игру, которая не закрывается после первого же действия. Для этого нам понадобятся новые инструменты: структуры данных, циклы и функции.

    Структуры данных: как навести порядок в информации

    До сих пор мы использовали переменные как одиночные коробки. Одна переменная — одно значение. Но что, если нам нужно сохранить список покупок из 50 пунктов? Создавать 50 переменных (item_1, item_2 и так далее) — это путь в никуда. В Python есть специальные структуры данных, которые позволяют хранить множество значений в одной переменной.

    Списки (Lists)

    Список (list) — это упорядоченная коллекция элементов. Представьте себе полку, на которой книги стоят строго по порядку. В Python списки создаются с помощью квадратных скобок [], а элементы внутри разделяются запятыми.

    Главная особенность списка — строгий порядок. У каждого элемента есть свой порядковый номер, который называется индексом. И здесь кроется главная ловушка для новичков: в программировании счет всегда начинается с нуля, а не с единицы.

    Чтобы достать конкретный элемент из списка, нужно указать имя списка и индекс элемента в квадратных скобках:

    Списки можно изменять прямо во время работы программы. Вы можете добавлять новые элементы в конец списка с помощью команды .append() или удалять их:

    Словари (Dictionaries)

    Если список — это полка с пронумерованными книгами, то словарь (dictionary или dict) — это телефонная книга. В словаре данные хранятся не по номерам, а по парам «ключ-значение».

    Словари создаются с помощью фигурных скобок {}. Ключ и значение разделяются двоеточием.

    Чтобы узнать здоровье игрока, нам не нужно помнить, каким по счету идет этот параметр. Мы просто обращаемся к словарю по ключу:

    !Схема работы словаря в Python

    Словари идеально подходят для хранения информации об одном конкретном объекте: пользователе, товаре в магазине или персонаже в игре.

    Циклы: заставляем компьютер делать рутину

    Компьютеры созданы для того, чтобы выполнять скучную, однообразную работу со скоростью света. Если вам нужно вывести на экран 1000 строк, вы не будете писать команду print() тысячу раз. Вы используете цикл.

    Цикл for: перебор элементов

    Цикл for используется, когда мы заранее знаем, сколько раз нужно выполнить действие. Чаще всего он применяется для перебора элементов в списке.

    Как это работает:

  • Программа берет первый элемент из списка guests ("Анна") и кладет его во временную переменную person.
  • Выполняется блок кода с отступом (выводится приветствие для Анны).
  • Программа возвращается к началу, берет следующий элемент ("Иван"), обновляет переменную person и снова выполняет код.
  • Это повторяется, пока список не закончится.
  • !Интерактивная визуализация цикла for

    Цикл while: работа до выполнения условия

    Цикл while (пока) работает иначе. Он повторяет блок кода до тех пор, пока истинно заданное условие. Это похоже на то, как вы едите суп: пока в тарелке есть суп, вы продолжаете работать ложкой.

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

    Здесь мы используем математическое условие . При каждом проходе цикла мы уменьшаем энергию на единицу. Как только энергия станет равна нулю, условие окажется ложным, цикл прервется, и программа пойдет дальше.

    > Важное правило: внутри цикла while обязательно должно происходить что-то, что в итоге сделает условие ложным. Если вы забудете написать energy = energy - 1, энергия всегда будет равна 3, условие всегда будет верным, и программа зависнет, бесконечно печатая текст. Это называется бесконечным циклом.

    Функции: создаем собственные команды

    По мере роста вашей программы вы заметите, что некоторые блоки кода повторяются. Например, формула расчета скидки может понадобиться в корзине товаров, на странице оформления заказа и в рассылке. Чтобы не копировать один и тот же код, используются функции.

    Функция — это именованный блок кода, который решает одну конкретную задачу. Вы уже пользовались встроенными функциями Python, такими как print() или input(). Теперь пришло время создавать свои.

    Функция определяется с помощью ключевого слова def (от слова define — определить).

    В скобках после имени функции указываются параметры (в нашем случае это name). Это данные, которые функция ожидает получить для работы. Когда мы вызываем функцию и передаем ей конкретное значение (например, "Алексей"), это значение называется аргументом.

    Возврат результата: магия слова return

    Функции могут не только печатать текст на экран, но и производить вычисления, возвращая результат обратно в основную программу. Для этого используется команда return.

    Представьте функцию как кофемашину. Вы засыпаете в нее зерна и наливаете воду (это параметры). Машина внутри себя что-то делает (выполняет код). А затем выдает вам чашку готового кофе. Эта чашка кофе и есть return.

    Разница между print() и return критически важна. print() просто показывает текст человеку на мониторе. Компьютер этот текст забывает в ту же секунду. return же отдает данные обратно в программу, чтобы вы могли сохранить их в переменную и использовать в дальнейших математических расчетах.

    Анатомия частых ошибок

    При работе с новыми инструментами вы неизбежно столкнетесь с новыми типами ошибок. Вот три самые распространенные проблемы на этом этапе:

    | Название ошибки | Причина | Пример из жизни | | :--- | :--- | :--- | | IndexError | Вы пытаетесь обратиться к элементу списка по индексу, которого не существует. Например, в списке 3 элемента, а вы просите выдать элемент под номером 10. | Попытка открыть 10-ю страницу в книге, в которой всего 3 страницы. | | KeyError | Вы ищете в словаре данные по ключу, которого там нет. | Попытка найти в телефонной книге номер человека, которого вы туда не записывали. | | TypeError | Возникает при неправильной работе с функциями. Например, функция ожидает два аргумента, а вы передали только один. | Попытка оплатить покупку картой в терминале, который принимает только наличные. |

    Собираем всё вместе: трекер расходов

    Давайте объединим списки, циклы и функции в небольшом, но полезном скрипте. Мы напишем программу, которая принимает список трат за день и считает общую сумму.

    Этот простой код демонстрирует всю мощь базового программирования. Если завтра ваш список трат будет состоять не из четырех, а из тысячи пунктов, вам не придется менять логику программы. Цикл for автоматически обработает любое количество элементов, а функция надежно вернет правильный результат.

    Понимание того, как комбинировать структуры данных для хранения информации, циклы для ее обработки и функции для организации кода — это момент, когда вы перестаете просто писать команды и начинаете по-настоящему программировать.

    3. Чтение кода и обработка ошибок

    Чтение кода и обработка ошибок

    В предыдущих материалах мы освоили базовые строительные блоки Python: переменные, условия, циклы и функции. Вы уже можете написать программу, которая принимает данные, обрабатывает их и выдает результат. Но в реальном мире программирования написание нового кода — это лишь малая часть работы. Гораздо больше времени разработчики тратят на чтение чужих скриптов, поиск неисправностей и создание защиты от непредсказуемых действий пользователей.

    Программа, которая идеально работает при правильных данных, но мгновенно «падает» при малейшей опечатке пользователя, считается хрупкой. Сегодня мы научимся читать код как профессионалы, понимать сообщения об ошибках и делать наши скрипты пуленепробиваемыми.

    Искусство чтения кода

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

    Когда вы открываете незнакомый скрипт (даже если вы сами написали его месяц назад), используйте стратегию нисходящего анализа:

  • Найдите точку входа. Не пытайтесь сразу вникать в формулы внутри функций. Найдите место, где программа начинает реальное взаимодействие с пользователем или данными. Обычно это главный цикл while или вызовы основных функций в самом низу файла.
  • Изучите названия. Хороший код документирует сам себя. Если функция называется calculate_monthly_payment, вам не нужно сразу читать ее внутренности, чтобы понять, что она делает. Вы просто принимаете как факт: «здесь считается ежемесячный платеж».
  • Проследите путь данных. Выберите одну переменную (например, введенное пользователем имя) и посмотрите, через какие функции она проходит и как изменяется.
  • Комментарии: как помогать себе и другим

    Чтобы облегчить чтение кода, программисты используют комментарии — текстовые заметки, которые компьютер полностью игнорирует при запуске программы. В Python однострочные комментарии начинаются с символа решетки #.

    Главное правило хорошего тона: комментарий должен объяснять почему написан этот код, а не что он делает. Компьютерный язык и так показывает, что именно происходит.

    Анатомия падения: как понимать сообщения об ошибках

    Рано или поздно ваша программа сломается. На экране появится пугающий блок красного текста. Это называется трассировкой (Traceback).

    Многие начинающие пугаются этого текста и сразу идут искать ответ в интернете. Но Traceback — это не ругань компьютера, а подробная карта, которая ведет прямо к месту поломки. Главный секрет: трассировку нужно читать снизу вверх.

    Рассмотрим пример. Допустим, мы написали скрипт для расчета стоимости товара со скидкой, но допустили ошибку:

    При запуске Python выдаст примерно следующее:

    > Traceback (most recent call last): > File "script.py", line 6, in <module> > result = apply_discount(1000, "двадцать") > File "script.py", line 2, in apply_discount > final_price = price - (price * discount / 100) > TypeError: unsupported operand type(s) for /: 'str' and 'int'

    Применяем правило «снизу вверх»:

  • Самая нижняя строка говорит нам, что именно пошло не так. TypeError сообщает, что мы пытаемся разделить строку (str) на число (int). Математическая операция невозможна, если — это слово.
  • Строка выше показывает точное место в коде, где произошла авария: final_price = price - (price * discount / 100).
  • Еще выше мы видим, откуда была вызвана эта функция: result = apply_discount(1000, "двадцать").
  • Теперь загадка решена: мы передали слово "двадцать" вместо числа 20, оно попало в математическую формулу и сломало программу.

    Обработка исключений: подушка безопасности для кода

    Ошибки делятся на два типа. Первые — это синтаксические ошибки (SyntaxError), когда вы забыли двоеточие или скобку. Программа с такой ошибкой даже не запустится.

    Вторые — это исключения (Exceptions). Синтаксис правильный, программа запускается, но в процессе работы сталкивается с невыполнимой задачей. Например, пользователь вводит буквы там, где ожидаются цифры, или пытается разделить на ноль.

    Мы не можем контролировать действия пользователя, но можем подготовить программу к неожиданностям с помощью конструкции try-except (попробуй-поймай).

    !Схема работы конструкции try-except

    Блок try содержит код, который потенциально может вызвать ошибку. Блок except содержит инструкции, что делать, если ошибка все-таки произошла.

    Посмотрим на классическую проблему ввода данных:

    Чтобы программа не закрывалась с красным текстом, обернем опасный участок в защитный блок:

    Теперь, если пользователь введет слово, программа не сломается. Она перехватит исключение ValueError, выведет понятное сообщение на русском языке и спокойно продолжит работу (напечатает финальную фразу).

    Прицельный перехват ошибок

    В Python существует множество встроенных исключений. Вот самые частые из них, с которыми вы столкнетесь при автоматизации задач:

    * ValueError — правильный тип данных, но неподходящее значение (попытка сделать число из слова "привет"). * ZeroDivisionError — попытка деления на ноль. * FileNotFoundError — попытка открыть файл, которого не существует на диске.

    Хорошей практикой считается указывать конкретный тип ошибки после слова except. Если вы напишете просто except: без указания типа, программа будет скрывать абсолютно все ошибки, включая ваши собственные опечатки в коде. Это превратит поиск багов в кошмар.

    Собираем всё вместе: надежный калькулятор чаевых

    Давайте напишем небольшую утилиту, которая объединяет циклы, функции и обработку ошибок. Это будет скрипт для расчета чаевых в кафе.

    Мы используем бесконечный цикл while True, чтобы программа запрашивала данные до тех пор, пока пользователь не введет их корректно. Выйти из такого цикла можно с помощью команды break.

    Разберем логику этого скрипта:

  • Мы создали функцию calculate_split, которая отвечает только за математику. Она не знает, откуда берутся данные.
  • Мы запустили цикл while True, который будет работать вечно, пока его принудительно не остановят.
  • Внутри блока try мы запрашиваем данные. Если на этапе float(input(...)) пользователь введет текст, программа мгновенно перепрыгнет в блок except ValueError, пропустив вычисления. Затем цикл начнется заново.
  • Если пользователь введет 0 в количестве людей, функция попытается разделить счет на ноль. Произойдет сбой, программа перепрыгнет в блок except ZeroDivisionError, выдаст предупреждение и снова пойдет на новый круг.
  • И только если все данные верны, программа дойдет до команды break, которая разорвет цикл.
  • Умение предвидеть, где программа может сломаться, и грамотно обрабатывать эти ситуации — это то, что отличает любительский скрипт от профессионального приложения. Теперь ваши программы не только выполняют полезную работу, но и умеют вежливо общаться с пользователем, даже если он делает что-то не так.

    4. Автоматизация рутинных задач

    Автоматизация рутинных задач

    Представьте, что вам нужно переименовать тысячу фотографий из отпуска, добавив к каждой дату съемки, или раскидать сотни скачанных файлов по папкам в зависимости от их формата. Вручную на это уйдут часы монотонной работы, сопровождающейся усталостью и неизбежными ошибками. Для компьютера это задача на несколько секунд.

    Суть программирования заключается не только в создании сложных нейросетей или видеоигр. В первую очередь, это инструмент для избавления человека от рутины. Сегодня мы научимся управлять операционной системой с помощью Python, читать файлы и напишем свой первый полноценный скрипт для автоматической сортировки документов.

    Расширение возможностей: импорт модулей

    До сих пор мы использовали только встроенные функции Python, такие как print(), input() или int(). Это базовый набор инструментов, похожий на швейцарский нож: он всегда под рукой и подходит для простых задач. Но если вам нужно построить дом, швейцарского ножа будет недостаточно — придется идти в гараж за специализированными инструментами.

    В Python такими «гаражами» с инструментами выступают модули (или библиотеки). Это файлы с заранее написанным кодом, которые решают специфические задачи. Чтобы воспользоваться модулем, его нужно подключить к нашей программе с помощью команды import.

    Для работы с файлами и папками нам понадобятся два стандартных модуля: os* (Operating System) — позволяет программе общаться с вашей операционной системой: узнавать, какие файлы есть в папке, создавать новые директории и удалять старые. shutil* (Shell Utilities) — предназначен для более сложных операций, таких как копирование и перемещение файлов с места на место.

    Проект: Умный сортировщик файлов

    Давайте создадим программу, которая наведет порядок в папке «Загрузки». Наш скрипт будет просматривать все файлы, определять их тип (расширение) и автоматически перемещать в соответствующие папки: картинки к картинкам, документы к документам.

    Шаг 1. Алгоритм работы

    Прежде чем писать код, профессиональные разработчики всегда продумывают алгоритм — пошаговый план действий.

    Для каждого файла в нашей папке программа должна:

  • Узнать имя файла.
  • Найти его расширение (буквы после последней точки, например, jpg или pdf).
  • Проверить, существует ли уже папка с названием этого расширения.
  • Если папки нет — создать ее.
  • Переместить файл в эту папку.
  • !Схема работы скрипта-сортировщика

    Шаг 2. Разделение строк

    Самая интересная часть алгоритма — как заставить компьютер понять, где заканчивается имя файла и начинается расширение. В Python у строк есть встроенный метод split(), который разрезает текст на части по заданному символу и превращает его в список.

    Нам всегда нужна самая последняя часть списка (само расширение). В прошлой статье мы узнали, что к последнему элементу списка можно обратиться с помощью отрицательного индекса -1.

    Шаг 3. Пишем код сортировщика

    Теперь объединим наши знания о циклах, условиях, обработке ошибок и новых модулях в единый скрипт.

    В этом коде мы использовали конструкцию try-except, с которой познакомились ранее. При работе с файлами она критически важна. Если вы попытаетесь переместить документ Word, который в данный момент открыт у вас на экране, операционная система заблокирует это действие, и Python выдаст PermissionError. Благодаря блоку except, наша программа не «упадет», а просто пропустит этот файл, выдаст предупреждение и продолжит сортировать остальные.

    Чтение и запись текстовых данных

    Автоматизация — это не только перемещение файлов, но и работа с их содержимым. Часто возникает задача: прочитать большой текстовый документ, найти в нем нужную информацию и сохранить результат в новый файл.

    Для работы с текстовыми файлами в Python используется встроенная функция open().

    Контекстные менеджеры: правило хорошего тона

    Когда программа открывает файл, она забирает часть ресурсов компьютера. Если файл не закрыть после использования, он может «зависнуть» в памяти или повредиться.

    Чтобы не забывать закрывать файлы, в Python придумали контекстные менеджеры — конструкцию with. Она гарантирует, что файл будет безопасно закрыт сразу после того, как код внутри блока завершит работу, даже если в процессе произойдет ошибка.

    Синтаксис выглядит так:

    Параметр encoding="utf-8" обязателен при работе с русским языком. Без него вместо кириллицы в файле могут появиться непонятные символы (кракозябры).

    Пример: извлечение данных

    Допустим, у нас есть текстовый файл clients.txt, в котором вперемешку записаны имена, телефоны и email-адреса. Нам нужно вытащить оттуда только почтовые ящики.

    Мы можем открыть файл в режиме чтения (буква rread), пройтись по нему циклом строка за строкой и найти те строки, в которых есть символ @.

    Обратите внимание, как элегантно Python позволяет читать файлы: for line in source_file:. Нам не нужно загружать весь огромный документ в оперативную память целиком. Программа берет одну строчку, проверяет ее, записывает (если нужно) и тут же забывает, переходя к следующей. Это позволяет обрабатывать текстовые логи размером в гигабайты даже на слабом компьютере.

    Подводные камни автоматизации

    При написании скриптов для работы с операционной системой новички чаще всего сталкиваются с двумя проблемами:

    | Проблема | Описание | Решение | | :--- | :--- | :--- | | Слеши в путях | В Windows пути пишутся через обратный слеш C:\Folder\file.txt, а в Mac/Linux — через прямой C:/Folder/file.txt. Обратный слеш в Python является спецсимволом. | Используйте прямые слеши / (Python сам поймет их в Windows) или склеивайте пути через os.path.join(). | | Права доступа | Попытка изменить системные файлы или файлы на диске C: (вне папки пользователя). | Тестируйте скрипты только в специально созданных папках (например, на Рабочем столе). Никогда не натравливайте скрипты на системные директории. |

    Автоматизация рутины — это момент, когда вы начинаете чувствовать реальную силу программирования. Скрипт, написанный за 15 минут, может сэкономить вам недели монотонного труда в будущем. Главное правило: перед тем как запустить программу, которая перемещает или удаляет файлы, всегда делайте резервную копию данных.

    5. Разработка интерактивного приложения

    Разработка интерактивного приложения

    До сих пор наши скрипты работали по принципу конвейера: мы запускали программу, она выполняла заданную последовательность действий (например, сортировала файлы или считала налоги) и сразу же завершала работу. Это отлично подходит для автоматизации рутины. Но если мы хотим создать игру, чат-бота или программу-калькулятор, нам нужен совершенно другой подход. Программа не должна закрываться после одного действия — она должна ждать наших команд, реагировать на них и продолжать работу.

    Сегодня мы объединим все знания из предыдущих уроков — переменные, циклы, словари и обработку ошибок — чтобы создать свои первые интерактивные приложения.

    Анатомия интерактива: Основной цикл

    Сердце любой интерактивной программы, будь то простая текстовая игра или современный 3D-шутер, — это основной цикл (Game Loop или Event Loop).

    Представьте себе работу официанта в ресторане. Он не уходит домой после того, как принес одно блюдо. Он постоянно находится в зале, ждет новых заказов, передает их на кухню, приносит еду и снова ждет. Он уходит только тогда, когда ресторан закрывается.

    В Python роль такого «официанта» выполняет бесконечный цикл while True. Внутри этого цикла программа бесконечно повторяет три шага:

  • Ждет ввода от пользователя (нажатие кнопки, ввод текста).
  • Обрабатывает логику (проверяет условия, обновляет данные).
  • Выводит результат на экран.
  • !Схема основного цикла интерактивного приложения

    Чтобы цикл не работал вечно и не «повесил» компьютер, внутри него обязательно должно быть условие выхода — команда break, которая срабатывает, когда пользователь решает покинуть программу.

    Состояние программы (State)

    Второе важное понятие — состояние (state). Это набор переменных, которые хранят текущую информацию о приложении. В игре это может быть количество жизней, текущий уровень или счет игрока. При каждом проходе основного цикла эти переменные могут изменяться.

    > Состояние — это память вашей программы. Без него приложение не знало бы, что произошло секунду назад, и каждый раз начинало бы работу с чистого листа.

    Проект 1: Умная игра «Угадай число»

    Давайте напишем классическую игру. Компьютер загадывает случайное число, а мы должны его угадать. Программа будет давать подсказки: «слишком много» или «слишком мало».

    Для генерации случайностей нам понадобится встроенный модуль random. В отличие от математических формул, где результат всегда предсказуем, функция random.randint(a, b) выдает случайное целое число в диапазоне от до включительно.

    Разберем ключевые моменты этого кода: * Мы используем метод .strip().lower() для ввода. Это очищает текст от случайных пробелов и переводит его в нижний регистр. Если пользователь случайно введет ВЫХОД (с пробелами и большими буквами), программа все равно его поймет. * Блок try-except критически важен. Если бы его не было, ввод слова «яблоко» вместо числа привел бы к ошибке ValueError и мгновенному падению программы. Теперь же программа просто выдаст предупреждение и пойдет на следующий круг цикла. * Переменная attempts — это наше состояние. Она увеличивается на единицу (+= 1) только тогда, когда пользователь вводит корректное число.

    Проект 2: Текстовый квест и структуры данных

    Игры с числами — это хорошо, но как насчет создания собственного мира? В текстовых квестах игрок перемещается по комнатам, читает их описания и выбирает направление.

    Здесь нам на помощь приходят словари (dictionaries), которые мы изучали ранее. Словарь идеально подходит для хранения карты мира, где ключом является название комнаты, а значением — ее описание и возможные пути.

    В этом примере логика отделена от данных. Если вы захотите добавить в игру еще 10 комнат, вам не придется переписывать основной цикл while. Достаточно просто добавить новые элементы в словарь world_map. Это один из главных принципов хорошего программирования: код должен быть универсальным и легко масштабируемым.

    Частые ошибки при создании интерактива

    При разработке своих первых приложений новички часто сталкиваются со следующими проблемами:

    | Проблема | Причина | Решение | | :--- | :--- | :--- | | Бесконечное зависание | В цикле while True нет команды break или условие для нее никогда не выполняется. | Всегда предусматривайте команду выхода (например, ввод слова «выход» или нажатие определенной клавиши). | | Сброс состояния | Переменные состояния (например, счетчик попыток) объявлены внутри цикла while. | Выносите начальные значения переменных до начала цикла. Внутри цикла они должны только обновляться. | | Падение при вводе | Программа ожидает число, а пользователь нажимает Enter, отправляя пустую строку. | Всегда оборачивайте преобразование типов (например, int()) в блок try-except. Пользователи всегда будут вводить то, чего вы не ожидаете. |

    Создание интерактивных программ меняет ваше восприятие кода. Вы перестаете быть просто писателем инструкций и становитесь архитектором систем, которые живут по вашим правилам и взаимодействуют с реальными людьми. Начните с малого: добавьте в игру «Угадай число» систему рекордов или расширьте текстовый квест новыми комнатами и предметами.