Чтобы научиться ходить – надо ходить, чтобы научиться подтягиваться – надо подтягиваться, чтобы научиться решать задачи по физике – надо решать задачи по физике. Так говорил преподаватель физики в моём университете, и эта аналогия применима и к программированию.
Можно сколько угодно упираться в сухую теорию, но без применения своих знаний на практике научиться программировать невозможно. В этой статье я подобрал несколько проектов для начинающих python-разработчиков. Эти проекты помогут закрепить теорию, применить полученные знания на практике и набить руку в написании кода. Некоторые из них даже можно добавить в будущее портфолио. Я объясню, чем хорош каждый проект, какие навыки и темы он позволяет проработать, а также сориентирую какие библиотеки и технологии можно использовать для его реализации.
Цель данного "топа" – это не создание самого оригинального портфолио и не перечисление уникальных проектов. Цель статьи разобраться в простых вещах, технологиях и темах, которые помогут развить практические навыки программирования. Поэтому не стоит ждать здесь сборку Оптимуса Прайма, программирование Звезды смерти и создание двигателя на китовом жире. Мы пройдёмся по простым, но в тоже время базовым вещам. Ведь как говорил один мой приятель: «Всё великое начинается с малого».
Парсер
Первый проект в списке – парсер сайтов. Это программа, которая просматривает код веб-сайта и получает оттуда какую-то информацию.
Предположим, есть сайт «Авито». Мы можем сделать программу, которая будет «как бы заходить» на Авито; просматривать объявления из раздела «Аренда квартир в Москве» (через программный код на страницах); и записывать в текстовый файл информацию из этих объявлений.
Пусть скрипт пишет в файл ссылку на объявление, контактный телефон, цену и описание. Затем этот файл сортируется по цене аренды, и на выходе мы сможем выбрать самые дешёвые квартиры. Такая программа и будет являться парсером или, как их часто называют, веб-скрапером.
В тренировочно-образовательных целях необходимо всё сделать максимально вручную, но без фанатизма. Поэтому используем модуль requests для работы с сетевыми запросами (для получения кода сайта, регистрации, авторизации). Библиотека BeautifulSoup понадобится для разбора и выдергивания информации из HTML-кода сайта, который мы получили с помощью requests.
Разработка парсера заставит разобраться с тем, что такое, зачем нужны и как работают сетевые протоколы HTTP/HTTPS. Придётся выяснить, что такое HTTP-запрос – из чего он состоит; как работать с GET, POST, PUT, DELETE-запросами; чем они отличаются; как формировать заголовки запросов. Предстоит покопаться со статус-кодами, URL-адресами, схемами авторизации, сессиями, редиректами, прокси и куки-файлами. Параллельно познакомиться с форматом JSON и вникнуть в HTML/CSS-код, семантику и DOM-модель веб-страницы.
Работа с сетевыми протоколами – это фундаментальные computer science навыки, без которых называть себя полноценным программистом немного не справедливо.
Мне кажется, пример с квартирами на Авито идеально подходит для пробы пера. Поэтому попробуйте написать скрипт, который создаст файл с информацией о всех трехкомнатных квартирах, которые продают в твоем городе, по цене, скажем, дороже 3 000 000 рублей.
На скелет подобного проекта можно нарастить мяса в виде подключения базы данных, многопоточного выполнения или вообще превратить парсер в пул Telegram-ботов, о которых мы и поговорим дальше.
Бот
Каждый мужчина должен посадить сына, вырастить дом и построить дерево, а каждый питонист должен сделать хотя бы одного бота для социальной сети или мессенджера.
Бот – это простой проект, но в тоже время, он даст новичку навыки работы со сторонними библиотеками, асинхронностью и, что самое главное, опыт работы со сторонним API.
Однако прежде придётся разобраться, что такое API, вникнуть в понятие синхронности/асинхронности, потренировать понимание ООП, если сделать бота классом, а не просто набором функций.
Масштабировать сложность проекта можно до бесконечности. Например, прикрутить базу данных или заставить бота присылать уведомления, когда изменяются цены в интернет-магазине. Если бот как-то взаимодействует с файлами на компьютере, то придётся параллельно освоить и работу с файловой системой.
В ходе разработки возникнут вопросы: как хранить в проекте секретные данные (токены, пароли), и как разделить бизнес логику приложения. Веcь код, отвечающий за работу непосредственно с площадкой, стоит вынести в один модуль, а код обработки полученных данных в другой модуль. Этим всё не ограничится. В процессе всплывёт ещё много других подводных камней. А это ценный практический опыт, который нам и нужен.
Загрузка (то есть деплой) бота на хостинг по типу Heroku или Google App Engine – уже отдельная история, которая также прокачает твои технические навыки.
Если хочется сделать бота ВКонтакте, то смотрим в сторону библиотек vkwave и vkbottle. Они современные, асинхронные и простые в использовании. Синхронный и уже местами забагованный vk_api использовать не советую.
Для Telegram рекомендую полностью асинхронный Aiogram.
В качестве альтернативы можно использовать модуль pytelegrambotapi. Он попроще и поддерживает как синхронный, так и асинхронный режим работы.
В случае с Discord ботами самым популярным является модуль discord.py (c 9 000 звёзд на GitHub). Он асинхронный, хорошо документирован и прост в освоении. По принципу использования и написания кода похож на Aiogram и vkwave.
Если разобраться, как работать с одной из перечисленных библиотек, то с другими проблем уже не возникнет. Этот принцип справедлив для многих модулей и фреймворков не только языка Python. Об этом я ещё скажу дальше.
Идея проекта попроще: бот, который по запросу присылает случайный фильм из файла или БД.
Вариант посложнее: бот для учёта финансов. Пишешь ему сообщение сколько денег потратил и на что. Он записывает всё в Google-таблицу, БД или Excel-таблицу и ведёт какую-нибудь статистику.
Можно сделать бота, который следит за ценами. Отправляешь ему ссылку на товар. Если на этот товар появляется скидка, бот присылает уведомление.
В случае с ботами всё ограничивается лишь вашей усидчивостью и фантазией. Ковыряйтесь на здоровье!
Веб-приложение (интернете магазин)
Если браться за создание сайта, то это должен быть не блог, не клон Instagram, не онлайн предсказатель будущего, а именно интернет-магазин.
Придётся разобраться с админ-панелью сайта, регистрацией, авторизацией, личным кабинетом, избранными товарами, корзиной, категориями товаров, подключением базы данных, миграциями, разграничением прав доступа, пагинацией, сессиями и кучей всего другого.
В качестве усложнения проекта можно добавить систему оплаты, скидочные промокоды, раздел с лидерами продаж, кеширование, отправку чека на почту или рекомендательную систему, основанную на in-memory СУБД Redis или вообще модели машинного обучения.
А если вы совсем без тормозов, то прикрутите REST API сайта. Для этого потребуется дополнительно вникнуть в вопросы сериализации JSON-объектов, работе с сетевыми протоколами и прочему.
Разработка веб-сайта познакомит вас с паттерном проектирования MVC (модель-представление-контроллер), HTML/CSS и, возможно, JavaScript кодом.
Основываясь на своём опыте, скажу, что для освоения веб-разработки лучше варианта чем Django нет. Django большой фреймворк, в котором по умолчанию есть модули для всего, что я перечислял выше. Кроме того, он базируется на классическом, упомянутом ранее шаблоне MVC (правда там он называется MVT, но не суть).
Изучая Django придётся научиться работать с маршрутизацией, моделями данных, миграциями, контроллерами, шаблонизаторами HTML и ORM (это специальная штука, которая позволяет работать с базой данных без SQL запросов, а через питоновские объекты). Много предстоит поработать с ООП, потому что все модели данных представлены классами. Часто приходится использовать наследование.
Важно, что практически все современные популярные питоновские и не только фреймворки устроены точно также, как Django. Если вы разберётесь с Django, понять, как работает PHPшный Laravel, Jav'овый Spring или Ruby on Rails не составит труда.
Django ORM практически идентичен Eloquent из Laravel, шаблонизаторы тоже плюс/минус у всех похожи, модели и миграции отличаются чисто косметически.
Потом, для расширения кругозора, можно ещё взглянуть на микрофреймворк Flask.
Выбирайте предметную область, которая вам интересна. Любите компьютерные игры – создаём магазин игр, тащитесь по топовому шмоту – вот вам магазин одежды. Короче стараемся получить максимум удовольствия. И едем дальше.
GUI
Разработка приложений с графическим интерфейсом не является основной сферой применения Python. Однако это не значит, что GUI на нем не пишут совсем.
В качестве тренировочного опыта, лично я бы остановился на создании Аудио проигрывателя для компьютера. На функционал не скупимся. Добавляем возможность работать с плейлистами, управление воспроизведением (старт, стоп, пауза, перемотка), стоит добавить анимацию звуковой дорожки, ползунки громкости и т.д. Про уникальный дизайн также не забываем.
Для графики рекомендую использовать фреймворк PyQt, а для работы с аудио библиотеку Pygame.
PyQt – более фундаментальный и сложный графический фреймворк, чем tkinter или pysimplegui. Поэтому обратить внимание стоит именно на него. Тут по аналогии с MVC веб-фреймворками. Разберись с базовыми принципами и дальше проблем не будет. Под базой здесь я подразумеваю концепцию событий (сигналов) и обработчиков событий (слотов).
PyQt также поможет прокачаться в понимании ООП, потому что все графические объекты представлены классами, а наследование используется повсеместно.
Внешний вид элементов в PyQt задаётся в графическом Дизайнере ручками или с помощью CSS-свойств в коде, что делает разработку проще.
По PyQt в Интернете много уроков, есть даже отдельные книги, что также плюс.
Отмечу, что многие графические приложения основаны на шаблоне проектирования MVP (модель-представление-представитель). Это вариация шаблона MVC на котором базируются веб-приложения.
Pygame – простая и популярная библиотека для работы с мультимедиа объектами. Позволяет работать с аудио, видофайлами, а если в ней хорошо разобраться, можно и 2D игру сделать.
Data Science-приблуды
Сферы искусственного интеллекта и Data Science занимают большую часть сообщества Python-разработчиков. Да, проекты подобного рода специфичны и вникать в них всем необязательно. Но не упомянуть о них я не мог.
Анализ данных – гигантская область, в которую входит математика, computer science и программирование. Разбор всех этих тем выходит за рамки данной статьи и заслуживает отдельного цикла.
Как по мне интересный проект – анализ настроения пользователя по его комментарию на форуме, или на вполне конкретном сайте, например, Кинопоиске. Оригинальностью проект не блещет. Но покопаться придётся.
Это задача из сферы обработки естественного языка (Natural Language Processing или NLP). Для работы с NLP стоит обратить внимание на библиотеки: NLTK, TextBlob, spacy, Gensim и CoreNLP. Пара слов о каждой.
NLTK – основная библиотека для NLP, позволяет обрабатывать тексты для классификации, токенизации, стемминга, разметки, фильтрации, работать с семантическими рассуждениями и многим другим. В первую очередь знакомиться именно с этой библиотекой.
TextBlob – обёртка над NLTK, которая предоставляет простой интерфейс для этой библиотеки. Иногда ею просто удобнее пользоваться.
spacy – модуль, который помогает решать спектр задач: от определения частей речи и выделения именованных сущностей, до создания собственных моделей анализа.
Gensim – библиотека тематического моделирования. Позволяет обрабатывать тексты, работать с векторными моделями слов (например, Word2Vec или FastText) и создавать тематические модели текстов.
CoreNLP – модуль для распознавания свойств текста.
Пока далеко не ушли от кино. Вспомним одну из классических задач машинного обучения – разработку системы рекомендаций. Рекомендательная система – это программа, которая будет угадывать предпочтения пользователя в плане выбора фильма. Для её написания придется научиться работать с такими базовыми библиотеками для любого data scientist'а как Pandas, Numpy, Matplotlib и Scikit.
Pandas нужен для обработки данных, NumPy для математических вычислений, Matplotlib позволяет визуализировать данные, то есть строить диаграммы и графики, а Scikit содержит модели машинного обучения и инструменты для работы с ними.
Следующий большой класс задач – компьютерное зрение. Не мудрствуя лукаво, создаём приложение, которое по фото или видео определяет наличие/отсутствие маски на лице человека. Самая ходовая библиотека компьютерного зрения – это OpenCV. Её и предстоит изучать. Также стоит ознакомиться со сверточными нейронными сетями и концепцией deep learning в целом. Обучающие data-сеты для любого из указанных проектов можно спокойно найти в Интернете.
В этом топе, как и в большинстве интернет-подборок, не оказалось из рядя вон уникальных проектов. Почему так? Почему большинство python-каналов переполнено роликами по написанию однотипных ботов, парсеров и скриптов? Все просто! Все перечисленное – это базовые вещи, отвечающие за понятные базовые навыки, через развитие которых необходимо пройти каждому python -разработчику.
Чтобы найти что-то по-настоящему оригинальное, предлагаю поделиться вашими идеями интересных pet-проектов в комментариях.
Знаете, учиться всегда тяжело. А по началу очень тяжело. Но я в тебя верю! Господь тоже в тебя верит! Но на всякий случай, для подстраховки, он создал тебе в помощь Google. Не забывай про это.
P.S. Также есть видеоверсия данной статьи на YouTube.
Комментарии (39)
Tuwogaka
12.06.2022 06:57-18Это не базовые навыки, это базовые библиотеки. Сам Пайтон никаких навыков кроме ну очень базовых развить не позволяет. Поэтому лучший проект для начинающего - модуль на Rust.
lozy_rc
12.06.2022 08:21+38Это не базовые навыки, это базовые библиотеки. Сам Раст никаких навыков кроме ну очень базовых развить не позволяет. Поэтому лучший проект для начинающего - модуль на C#.
Это не базовые навыки, это базовые библиотеки. Сам Сишарп никаких навыков кроме ну очень базовых развить не позволяет. Поэтому лучший проект для начинающего - модуль на C++.
Это не базовые навыки, это базовые библиотеки. Сами Плюсы никаких навыков кроме ну очень базовых развить не позволяет. Поэтому лучший проект для начинающего - модуль на C.
Это не базовые навыки, это базовые библиотеки. Сам Си никаких навыков кроме ну очень базовых развить не позволяет. Поэтому лучший проект для начинающего - модуль на Фортран.
Это не базовые навыки, это базовые библиотеки. Сам Фортран никаких навыков кроме ну очень базовых развить не позволяет. Поэтому лучший проект для начинающего - модуль на Машинном коде.
Molotovich
14.06.2022 18:26Это не базовые навыки, это базовые библиотеки. Сам Машинный код никаких навыков кроме ну очень базовых развить не позволяет. Поэтому лучший проект для начинающего - придумать свой язык программирования.
AndreyDmitriev
13.06.2022 08:30rust офигенный язык, но он ни разу не подходит для новичков, его хорошо изучать как второй язык как минимум.
Andrey_Solomatin
12.06.2022 11:18Я бы GUI выкинул: и скучно и нудно и, мне кажется, не перспективно. Вот консольные приложения было бы полезно.
В плане визуализации я сейчас начал экспериментировать с https://streamlit.io/. Просто и симпатично.kAIST
12.06.2022 11:37+7Может gui и скучно, но это хороший способ не писать "в стол". Если приложением будет пользоваться кто то кроме тебя, это хорошая мотивация.
Вот пишу я сейчас например, интересную и полезную утилиту. Для себя могу сделать конфиги в каком нибудь json, но так приложением будет пользоваться 1.5 человека, так как основная целевая аудитория не будет копаться в конфигах. Приходится 3/4 работы выделять на GUI.
Да и это может быть и не скучно, если делаешь не просто клепание форм. GUI может быть вполне интересным и сложным.
Andrey_Solomatin
12.06.2022 11:52но это хороший способ не писать "в стол"
Если у вас есть проект со смыслом, тут вообще все средства хороши.
Мне важно, чтобы результат приятно смотрелся, и организацию этого уходит 80% времени.
Обычно стараюсь смотреть на что-то высоко-уровневое, когда ты декларируешь что нужно показать, а как именно делает за тебя библиотека.
Что-то типа https://github.com/chriskiehl/Gooey или того-же стримлита.kAIST
12.06.2022 12:17+1Спасибо за ссылку на интересную либу. Но что то подобное только для клепания форм подходит.
Вот, например, скрин приложения, которое сейчас пилю (кто угадает GUI тулкит?) .Тут работа с GUI местами интереснее и сложнее, чем работа непосредственно с функционалом (хотя в этом случае само GUI и есть часть функционала).
Если у вас есть проект со смыслом, тут вообще все средства хороши.
Ну так делать проекты с каким то смыслом гораздо лучше чем писать просто что то, что ляжет "в стол". Я например, учился программированию так - ставишь себе интересную и полезную задачу, и на решении этой задачи учишься.
MentalBlood
12.06.2022 12:54+2DearPyGui?
kAIST
12.06.2022 13:24+2Хм, не знал об этой библиотеке, спасибо.
Но тут у меня старый добрый дубовый tkinter )
Andrey_Solomatin
12.06.2022 13:31Как-то давно игрался с ним. Мне бы не хватило терпения что-то такое на нем сделать.
kAIST
12.06.2022 13:43Да ладно, tkinter одна из самых локаничных и простых графических либ.
Понимаю, что проще взять какой нибудь "автоматический билдер" для простых форм, но вот когда тебе нужно сделать что то кастомное, то тут начинаются проблемы. В GUI так то тоже логика может быть. Например, поставили чекбокс, не нужные формы задизейблились, и так далее.
sled
12.06.2022 23:20Ваши подходы и мыслеформы при реализации такого GUI на tkinter будут познавательны для новичков, возможно родиться по мотивам статейка
kAIST
13.06.2022 00:21Статейки про проект я напишу, но вот с подробным разбором GUI части, не могу ничего обещать.
Мне на самом деле больше подходил tkinter, потому что программа почти целиком и полностью состоит из плагинов. И у каждого плагина есть свое окно настроек, а какие то плагины вообще могут создавать отдельные окна в другом процессе.
funca
12.06.2022 23:27+2TCL/TK в свое время был шикарным тулкитом в плане удобства и скорости разработки, но визуально страшным как ядерная война под любой платформой. Насколько серьезно теперь все изменилось?
kAIST
13.06.2022 00:16+1Ну под windows выглядит вполне себе нативно, благодаря tkinter.ttk (у меня в проекте кастомная тема). С HiDPI работает корректно. И что бывает немаловажно, имеет небольшой размер при сборке pyinstaller'ом (у меня standalone сборка этого проекта всего 23 мегабайта).
Но для действительно сложных GUI он не очень годится. Особенно если нужно видюшки всякие показывать, анимации и пр. Есть конечно модули разные, хоть chromium в фрейм поместить, но в в том же самом Qt это есть из коробки.
В моем проекте, например, столкнулся с такими ограничениями:
Нельзя проскроллить ничего кроме канваса, листбокса или текста. То есть я не могу взять и запихнуть кучу виджетов во фрейм со скроллом.
На канвасе можно конечно размещать виджеты, но это тормозное глюкалово. Пришлось отрисовывать все примитивами.
Нету антиалиасинга примитивов на канвасе.
wadik69
12.06.2022 12:00+1Разработка парсера заставит разобраться с тем, что такое, зачем нужны и как работают сетевые протоколы HTTP/HTTPS.
Я когда начинал программировать, то тоже писал парсера, при чём на заказ. Но, к сожалению, это не дало мне понимания как работают сетевые протоколы(только прям уж очень базовые знания). Другое дело, написать свою библиотеку для парсинга, но это не для начинающих:)
Что касается веб-фреймворка, то я бы начал изучение с фласка. Всё-таки у джанго уже много чего из коробки. В целом подборка хорошая:)
Machirodont
12.06.2022 14:28+17Первый проект в списке – парсер сайтов
Ожидание: примитивная работа с HTTP, разбор HTML, запись результатов в файл
Реальность: бан по ip на 20-й скачанной странице, дивный мир подмены UserAgent, автоматизации разгадывания капч, маскировки под гугл-бота и интеграции с ботнетами.
wadik69
12.06.2022 18:39если брать авито, то так и будет)
Что ж, предлагаю тогда написать сначала свой сайтик на джанге, а потом всю инфу с него спарсить
night_admin
12.06.2022 13:21+2Статья хорошая, но явно не для новичка. Проекты полезные, но сложные.
Ожидал увидеть что-нибудь вроде калькулятора с GUI на каком-нибудь Kivy - так и с вёрсткой познакомитесь.
Andrey_Solomatin
12.06.2022 13:43+1Они не сложные, они объемные. Даже глубокого знания Питона не требуется. И да обучение программированию требует огромного количества времени.
night_admin
12.06.2022 18:48Всё-таки обучаться на маленьких проектах проще, и, как показывает практика, эффективнее, чем долбиться с суперсложными проектами. Как описал человек выше, даже с простым парсером Авито возникает куча проблем, из-за которых возникает желание бросить все.
Andrey_Solomatin
12.06.2022 21:03Всё-таки обучаться на маленьких проектах проще
Программирование это инструмент для решения задач, решая маленькие задачи не научишься решать большие.
даже с простым парсером Авито возникает куча проблем
Это и есть тот самый опыт который можно получить решая такие задачки.
funca
12.06.2022 23:22Обучение идёт от простого к сложному. Начинающие сразу со сложного пропускают азы, без которых развитие возможно лишь в архитекторы). Хорошо заметно, например, по AQA или саппорт, которые быстро пишут код под знакомый фреймворк, но малейшая нестандартность ставит в тупик.
AndreyDmitriev
13.06.2022 08:36+1Начинающие сразу со сложного пропускают азы, без которых развитие возможно лишь в архитекторы
Чёрт, вы открыли мне глаза. Я встречал несколько архитекторов, при общении с которыми только одна мысль была "ну вот откуда ты такой дятел взялся"? Теперь понятно, они в программирование и не умели никогда.
Andrey_Solomatin
13.06.2022 21:15Обучение идёт от простого к сложному
Это типичный паттерн, я так и учился. Сначала задачки на закрепление пройденной темы на 10-20 строчек. А потом сайт на Джанго с рисованием на Яндекс картах в качестве выпускной работы.
В плане программирования там всё просто было, большая часть времени ушла на изучение нового.
Под начинающем программистом я подразумеваю, человека который уже прошёл курсы.
Я повторение hello world для новых технологий я за проекты не считаю.
grigr
12.06.2022 15:46Почему-то нет пункта создания игры платформера на том же Pygame. Может оно больше никому кроме автора не понадобится, но вот изучение именно алгоритмической части и взаимодействия с игроком будет по полной
mgis
12.06.2022 22:18+2Питонисты посдених лет наверное все начинали со старого доброго Django,
Я давно на нем не пишу, перешел на FastApi, но все же о Django всегда вспоминаю с любовью.
Первые строчки кода на Python, прекрасная документация, дружелюбное комьюнити, первый сайт не на CMS, а на фрейме. Блин как же мало нужно было для счастья тогда)funca
12.06.2022 23:15Питонисты посдених лет наверное все начинали со старого доброго Django
Последних лет 15 (или сначала Django был молодым и злым)?
edogs
12.06.2022 23:42+1Велика опасность стать отличнейшим говнокодером.
В принципе да, что бы поставить галочки в резюме и понимать что происходит — все это не помешает. Но смысл вроде акцентировался не на галочках, а на обучении начинающего.
А какой смысл от вебсайта, парсера и прочего, если в результате это будут одноразовые поделки с захардкоженными переменными, копипастой, отсутствием соблюдения базовых стандартов, полнейшим непониманием архитектуры и т.д. и т.п. в которых даже сам автор через неделю уже ничего понимать не будет?
Вообще, когда прочитали название и открывали статью — ожидали увидеть список проектов на гитхабе куда можно по мелочи контрибьютить на уровне пре-джуна.
То есть цель не просто изучить разные технологии на практике (список проектов-то можно было бы оставить идейно тем же), но и при этом
а) разобраться как сделано (а это не всегда умеют даже миддлы, хотя это скилл джуна), тем самым получив представление как надо делать (и вот тут как раз важно выбрать правильный проект)
б) найти проблему/нужную доработку (научиться искать баги и/или ставить задачи)
в) правильно оформить исправление (с соблюдением принятых стандартов и норм, а не фигак и в продакшен)
г) закоммитить его и словить плюсцов или же дельную критику (повысить настроение и/или профессионализм)
nathanael
Админы авито: да вашу ж мать!
3aBulon
Как быстро Авито забанит ваш айпи?
vedenin1980
Учитывая, что настройка vpn доступна любому айтишнику — им придется банить половину интернета. И вообще динамическая замена айишника с помощью списка vpn это лишь небольшая дополнительная сложность в таком проекте.