Написал программу на питон что дальше
Перейти к содержимому

Написал программу на питон что дальше

  • автор:

Первая программа. Среда разработки IDLE

Python 3 логотип

Сегодня мы напишем свою первую программу в среде разработки IDLE.

После загрузки и установки python открываем IDLE (среда разработки на языке Python, поставляемая вместе с дистрибутивом).

Здесь и далее буду приводить примеры под ОС Windows, так как именно она у меня сейчас под рукой.

Запускаем IDLE (изначально запускается в интерактивном режиме), после чего уже можно начинать писать первую программу. Традиционно, первой программой у нас будет «hello world».

Чтобы написать «hello world» на python, достаточно всего одной строки:

Вводим этот код в IDLE и нажимаем Enter. Результат виден на картинке:

Поздравляю! Вы написали свою первую программу на python! (если что-то не работает).

С интерактивным режимом мы немного познакомились, можете с ним ещё поиграться, например, написать

Но, всё-таки, интерактивный режим не будет являться основным. В основном, вы будете сохранять программный код в файл и запускать уже файл.

Для того, чтобы создать новое окно, в интерактивном режиме IDLE выберите File → New File (или нажмите Ctrl + N).

В открывшемся окне введите следующий код:

Первая строка печатает вопрос ("Как Вас зовут? "), ожидает, пока вы не напечатаете что-нибудь и не нажмёте Enter и сохраняет введённое значение в переменной name.

Во второй строке мы используем функцию print для вывода текста на экран, в данном случае для вывода «Привет, » и того, что хранится в переменной «name».

Теперь нажмём F5 (или выберем в меню IDLE Run → Run Module) и убедимся, что то, что мы написали, работает. Перед запуском IDLE предложит нам сохранить файл. Сохраним туда, куда вам будет удобно, после чего программа запустится.

Вы должны увидеть что-то наподобие этого (на скриншоте слева — файл с написанной вами программой, справа — результат её работы):

Поздравляю! Вы научились писать простейшие программы, а также познакомились со средой разработки IDLE. Теперь можно немного отдохнуть, а потом начать изучать python дальше. Можете посмотреть синтаксис python, циклы или условия. Желаю удачи!

Для вставки кода на Python в комментарий заключайте его в теги

HOW-TO: Программа на Python, Часть 1

Из множества существующих языков программирования Python — один из самых лёгких в изучении. Он создан в конце 80-х годов XX века, но с тех пор он сильно изменился. Хотя Python входит в состав большинства дистрибутивов Linux, на него часто не обращают внимания при выборе языка для изучения. В этой статье мы рассмотрим создание консольных приложений, а в следующей — программирование графических интерфейсов ( GUI ). Давайте создадим простую программу прямо сейчас.

Наша первая программа

Наберём код в текстовом редакторе (например, в gedit). Потом мы разберёмся, что делает каждая строка и пойдём дальше.

Введите эти 4 строки:

#!/usr/bin/env python3 print ("Hello. I am a python program.") name = input("What is your name?") print ("Hello there, " + name + "!")

Это всё. Сохраните файл как hello.py в любом месте. Я предлагаю сохранить его в папке python_examples в домашнем каталоге. Этот пример показывает, как просто написать программу на Python. Для запуска программы нужно сделать её файл исполняемым. Для этого введите в терминале

chmod +x hello.py

в папке, в которой вы сохранили программу. Теперь запустите её.

greg@earth:~/python_examples$ ./hello.py Hello. I am a python program. What is your name? Ferd Burphel Hello there, Ferd Burphel! greg@earth:~/python_examples$

Вот и всё. Теперь давайте рассмотрим что делает каждая строка программы.

#!/usr/bin/env python3

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

print ("Hello. I am a python program.")

Эта строка просто печатает в окне терминала Hello. I am a python program.

name = input("What is your name? ")

Эта строка немного сложнее. В ней две части. Первая часть: name = и вторая часть: input("What is your name? "). Сначала рассмотрим вторую часть. Команда input печатает вопрос в терминале («What is your name? ») и ожидает, пока пользователь (вы) не напечатает что-нибудь (и не нажмёт ). Теперь рассмотрим первую часть команды: name =. Она создаёт переменную под названием «name». Что такое переменная? Переменную можно представить себе в виде ящика. В ящике можно хранить вещи: ботинки, части компьютера, бумаги, всё, что туда влезет. Ящику всё равно, что лежит внутри — оно просто лежит там. В нашем примере он хранит то, что вы напечатаете. Я напечатал Ferd Burphel. В данной программе Python просто берёт введённое значение и сохраняет его в ящике «name», чтобы использовать в программе в дальнейшем.

print ("Hello there, " + name + "!")

В этой строке мы опять используем команду print для вывода текста на экран, в данном случае для вывода «Hello there, » и того, что хранится в переменной «name» и восклицательного знака в конце. В данной строке мы соединяем три куска текста: «Hello there», информацию в переменной «name» и восклицательный знак.

Теперь давайте быстро обсудим то, что мы сделали, и перейдём к работе над следующим примером. Откройте окно терминала и наберите:

python3

Вы должны увидеть что-то наподобие этого:

greg@earth:~/python_examples$ python3 Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information.

Теперь вы находитесь в командной оболочке python. Здесь вы можете выполнять действия, но для начала разберёмся с тем, что у нас получилось. Первым делом вы увидите версию интерпретатора python — у меня стоит 3.4.3. Затем вы увидите сообщение о том, что для получения справки необходимо набрать «help» в командной строке. Это я оставляю Вам в качестве домашнего задания. А пока наберите:

print (2+2)

и нажмите Enter. вы увидите:

print (2+2) 4

Обратите внимание, что мы набрали слово «print» в нижнем регистре. Что произойдёт, если набрать «Print (2+2)»? Интерпретатор ответит следующим образом:

Print (2+2) Traceback (most recent call last): File "", line 1, in NameError: name 'Print' is not defined

Это произошло потому, что слово «print» является зарегистрированной командой, а слово «Print» не является таковой. Для Python регистр очень важен.

Теперь поработаем с переменными ещё раз. Введите:

var = 2+2

Вы увидите, что ничего не происходит, за исключением того, что Python отобразит приглашение «>>>». Всё нормально. Мы поручили Python создать переменную (ящик) под названием «var» и положить в неё результат сложения «2+2». Чтобы увидеть, что теперь находится в переменной «var», введите:

print (var)

и нажмите Enter.

print (var) 4

Теперь мы можем снова использовать переменную «var» как число 4. Например, так:

print (var * 2) 8

Если мы снова наберём «print (var)», то увидим следующее:

print (var) 4

Переменная «var» не изменилась. В ней осталась храниться сумма 2+2, то есть 4.

Конечно, данная программа очень простая и написана для этого урока для начинающих. В последующих уроках программы станут более сложными. А сейчас давайте рассмотрим ещё несколько примеров с переменными.

Введите в интерпретаторе:

strng = 'The time has come for all good men to come to the aid of the party!' print (strng) The time has come for all good men to come to the aid of the party!

Вы создали переменную под названием «strng», которая содержит значение «The time has come for all good men to come to the aid of the party!». С этого момента (пока мы работаем с этим экземпляром интерпретатора) переменная «strng» будет содержать то же значение, пока мы её не изменим. Что будет, если мы попробуем умножить эту переменную на 4?

print (strng * 2) The time has come for all good men to come to the aid of the party!The time has come for all good men to come to the aid of the party!

Произошло не совсем то, что вы ожидали. Python напечатал значение переменной «strng» 2 раза. Почему? Интерпретатор знал, что переменная «strng» — это строка, а не число. Невозможно производить математические операции над строками.

Если бы у нас была переменная под названием «s», которая содержала бы значение «4» как показано ниже:

s = '4' print (s) 4

Кажется, что переменная «s» содержит число 4, но это не так. Она содержит текстовое значение «4». И если мы наберем «print (s * 4)», то получим…

print (s*4) 4444

Снова интерпретатор знает, что переменная «s» — это строка, а не число. Он знает это, потому что мы взяли число 4 в одинарные кавычки, что означает, что оно является строкой. Мы можем проверить это, набрав «print type(s)», чтобы увидеть, какой тип система присвоила данной переменной.

print (type(s))

Подтверждено. Переменная имеет тип «строка». Если мы захотим использовать её в качестве числа, то мы напечатаем следующее:

print (int(s) * 4) 16

Строка «s», содержащая значение «4», преобразована в число и умножена на 4, что равно 16.

Теперь у Вас есть основные знания о командах print и input, создании переменных и разнице между строками и числами.

Пойдём дальше. В интерпретаторе Python введите quit() для выхода в командную строку.

Пример цикла For

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

#!/usr/bin/env python3 for cntr in range(0,10): print (cntr)

Не забудьте поставить символ табуляции перед строкой «print (cntr)». Это важно. В Python для указания на блоки кода используются не круглые «(» и фигурные «

Сохраните программу под именем «for_loop.py». До её запуска давайте поговорим о том, что такое цикл «for».

Цикл — это код, выполняющий определённую инструкцию или набор инструкций определённое число раз. В нашей программе мы выполним цикл 10 раз, печатая значение переменной «cntr». Вот перевод команды на русский язык «присвоить переменной «cntr» значение 0, выполнить печать значения переменной «cntr», прибавить к переменной «cntr» 1 и повторить это 10 раз». Выглядит довольно просто. Часть кода «range(0,10)» говорит: начать с 0, повторять, пока значение переменной «cntr» не будет равно 10, и выйти.

Теперь, как раньше, выполните команду

chmod +x for_loop.py

и запустите программу:

./for_loop.py
greg@earth:~/python_examples$ ./for_loop.py 0 1 2 3 4 5 6 7 8 9 greg@earth:~/python_examples$

Кажется, программа работает, но почему она считает только до 9 и останавливается? Посмотрите её вывод. Напечатано 10 цифр: от 0 до 9. Это то, что мы запрограммировали: напечатать значение переменной «cntr» 10 раз, каждый раз добавляя единицу к переменной, и выйти, когда её значение будет равно 10.

Теперь вы видите, что программирование может быть как простым, так и сложным. Вы должны точно знать, что вы хотите от программы. Если вы измените команду «range» на «range(1,10)», она начнёт считать с 1, но остановится на 9, так как при достижении верхнего порога (10) цикл прерывается. Чтобы заставить программу печатать «1,2,3,4,5,6,7,8,9,10», надо заменить команду на «range(1,11)», так как цикл «for» прерывается при достижении второго числа в команде «range».

Обратите также внимание на синтаксис цикла. Двоеточие в команде «for переменная in range(начальное значение,конечное значение):» означает начало блока кода, который должен быть смещен вправо. Вы должны использовать двоеточие «:» и смещать код вправо до конца блока — это очень важно.

Если мы изменим нашу программу таким образом:

#!/usr/bin/env python for cntr in range(1,11): print (cntr) print ("All Done")

Мы увидим на экране следующее:

greg@earth:~/python_examples$ ./for_loop.py 1 2 3 4 5 6 7 8 9 10 All Done greg@earth:~/python_examples$

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

На сегодня хватит. В следующем уроке мы продолжим изучать команды языка Python. А пока, вам стоит попробовать специализированные редакторы для Python, например, Dr. Python или SPE (Stani's Python Editor). Обе программы вы найдёте в Synaptic.

С чего начать изучение Python?

С чего начать изучение Python? главное изображение

Python — высокоуровневый язык с динамической типизацией. Это значит, что код на нем прост для чтения и понимания, а разработка быстрая, так как Python сам классифицирует вводимые данные.

Посмотрите, как можно вывести на экран фразу «Hello, World!» в одну строчку с помощью одной понятной команды:

print('Hello, World!') 

И как это можно сделать с помощью языка Java:

class HelloWorld  public static void main(String[] args)  System.out.println("Hello World!"); > > 

Python также известен своей философией — правилами, которые разработчики стараются соблюдать при написании кода. Они сформулированы в списке из 19 пунктов под названием «The Zen of Python» . Вот несколько правил из этого списка:

  • Явное лучше, чем неявное
  • Простое лучше, чем сложное
  • Читаемость имеет значение.

У Python есть более сотни библиотек кода — наборов инструментов для решения программистских задач. Также есть много фреймворков: возможно, вы что-то слышали о Django, Pyramid или Flask. Каждый из этих инструментов можно освоить, чтобы выйти на новый уровень программирования на Python.

Python применяют для создания и поддержания своих продуктов такие компании, как Google, Yandex, Spotify, Microsoft, Pinterest, Quora, Intel и другие.

Где используется Python

Python — самый популярный язык программирования по данным индекса TIOBE на ноябрь 2023 года. Востребованность Python можно объяснить тем, что его применяют во многих сферах: веб-разработка (чаще всего серверная часть), машинное обучение и анализ больших данных.

Также на Python создают:

  • Видеоигры
  • Десктопные приложения
  • 3D-графику
  • Программ для обработки изображений, видео и аудио.

В сфере мобильной разработки язык Python используют очень редко.

Python в Data Science

Python — главный язык программирования для работы с анализом данных. Python любят в Big Data за счет гибкости и скорости освоения.

В анализе данных чаще работают математики, финансисты или даже маркетологи, а не «чистые» программисты. Им гораздо проще работать с Python, чем с более сложными Java или C.

За счет встроенного интерпретатора этот язык программирования позволяет быстро проверять гипотезы и моментально получать результаты.

Тем, кто хочет работать в Data Science, потребуется выучить основы Python и несколько профильных библиотек:

  • Pandas — нужна для сбора и структурирования данных. Библиотека умеет извлекать информацию из баз данных и таблиц, превращая разрозненные объекты в индексированные массивы. Содержит инструменты визуализации.
  • NumPy — используют для расчетов. Позволяет индексировать, умножать и добавлять массивы, разбивать их на секции и менять форму. Есть инструменты для вычисления по формулам линейной алгебры.
  • Matplotlib — для визуализации данных. Помогает создавать графики, диаграммы, 2D-фигуры и встраивать их в большинство популярных приложений и сервисов.
  • Statsmodels — для статистического анализа. Помогает использовать в Python формулы из языка R. С ее помощью проводят одномерный и двумерный анализ данных, решают сложные математические задачи и занимаются машинным обучением.

Познакомьтесь с Python бесплатно

Что нужно, чтобы начать программировать на Python

Расскажем об основных особенностях этого языка и о том минимуме, который нужно знать, чтобы написать свое первое приложение на Python.

Установить IDE

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

Среда разработки помогает разработчику ориентироваться в коде и искать в нем ошибки. Самые популярные IDE для Python: Python IDLE, PyCharm, Spyder, Thonny.

Еще можно установить редактор кода — это более легковесная программа, аналог текстовых редакторов. Она сохраняет проекты в правильном расширении, автоматически проверяет отступы в коде и подсвечивает синтаксис. Самые популярные редакторы кода для Python: Visual Studio Code, Sublime Text, Vim.

Также существует онлайн-IDE, с помощью которой можно писать код на Python прямо в браузере. Replit подойдет для первого знакомства с Python и создания небольших проектов.

Изучить базовый синтаксис

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

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

Вот примерный список тем, которые нужно изучить и понять перед тем, как начать кодить на Python:

  • Строки — как их выводить, извлекать из них символы.
  • Переменные и типы — для чего они нужны, как облегчают разработку.
  • Операторы — какие они бывают в Python и как работают.
  • Условия — что такое условные конструкции и как их задавать.
  • Циклы — для чего нужны и как использовать.
  • Структуры данных — для чего используют, сколько всего структур и какие они бывают.
  • Функции — в чем особенность, как их вызывать и где искать документацию по ним.
  • Классы и объекты — что это такое и как они обозначаются.

Давайте разберем пару базовых тем.

Списки

Список — это структура данных, которая используется для хранения коллекции элементов в упорядоченной последовательности. Эти элементы могут быть разного типа: числа, строки, другие списки и так далее. Список создается с использованием квадратных скобок [] , а элементы внутри списка разделяются запятыми.

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

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

Вот пример списка:

a = ['dog', 16, True] 

Наш список содержит строку, число и булево значение.

Со списками можно проводить различные операции:

  • Элементы в списках можно заменять. Для этого нужно обратиться к нему по индексу.
  • Списки можно объединять. Для этого используют оператор + .
  • Элементы в Python можно перебирать при помощи циклов for и while .
  • Списки можно сравнить друг с другом, получив в ответ булево значение — False или True .

Строки

Строка — последовательность данных. В прошлом примере слово 'dog' — это строка. Класс такого объекта называется str . Строка — это любая упорядоченная последовательность символов. Ее используют, чтобы хранить или выводить текстовую информацию.

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

Строки в Python можно объединять при помощи математического оператора + . Но лучше использовать вместо него .join() .

В первом случае это выглядит так:

a1 = 'Я учусь' a2 = 'писать код на Python' а1 + а2 >>> 'Я учусь писать код на Python' 
''.join([а1, а2]) >>> 'Я учусь писать код на Python' 

Кавычки тут нужны для обозначения строки-соединителя. В этом примере она пустая, но может содержать в себе пробел или другой символ.

Использование .join() вместо математического оператора делает код лаконичнее и производительнее. Это имеет смысл, когда строк много, а не всего две, как в нашем примере.

Для поиска по текстовой информации используют регулярные выражения — regex . Они позволяют «вытащить» из строк нужные данные. По этому принципу, например, работает поиск в Word по документу.

У регулярных выражений есть свой синтаксис:

  • . — заменяет любой символ;
  • \ — экранирует, превращая спецсимволы в обычные символы;
  • […] — любой символ, указанный в скобках, можно обозначить как перечислением, так и диапазоном;
  • | — обозначает «или», то есть позволяет искать или один или другой символ;
  • [^…] — ищет любой символ, кроме указанного в скобках;
  • $ — конец строки;
  • ^ — начало строки.

Объектно-ориентированное программирование

Объектно-ориентированное программирование (ООП) — это парадигма разработки, то есть набор правил и принципов, которые нужно соблюдать программисту.

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

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

Структура объектно-ориентированного программирования:

  • Объект — отдельный элемент с собственными функциями и характеристиками.
  • Класс — шаблон для объектов. Например, на сайте-картотеке фильмов и сериалов классом будет карточка фильма с пустыми полями, а объектами уже заполненные карточки с указанным названием, годом и жанром.****
  • Метод — функция, связанная с конкретным объектом и работающая с его данными. Например, метод в нашем примере позволит вывести имена актеров или вывести все фильмы этого же режиссера.
  • Атрибут — данные объекта. У класса описывают будущие атрибуты, а в объекте заполняют их конкретными данными. Например, в классе «фильм» есть атрибуты-поля «Режиссер» и «Год выхода». А в объекте, определенном фильме, будут конкретные фамилии и даты.

Что еще нужно знать

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

Начинающие программисты предпочитают самые простые способы. А опытные разработчики стараются сделать свой код красивым и лаконичным.

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

Что еще нужно знать:

  • Декораторы — функции, о которых обязательно спросят на собеседовании. При помощи декоратора можно добавить к уже существующей функции новые возможности, не меняя исходный код.
  • Случайные числа — числа из определенного диапазона с некоторой вероятностью выпадения. Их используют для того, чтобы имитировать закон распределения случайной величины. В Python для этого используют библиотеку random или модуль numpy.random .
  • Рекурсия — функция, вызывающая себя саму. Ее используют для выполнения последовательности одинаковых действий. Например, если нужно узнать сумму чисел от 1 до N, есть два способа. Первый — итерационный, в котором прописывают каждый шаг при помощи цикла. А второй — рекурсионный, он оптимальнее для решения сложных задач.
  • Рефакторинг кода — процесс редактирования и оптимизации. Он необходим для того, чтобы улучшить читабельность, сделать код понятнее и красивее. В процессе рефакторинга удаляют неиспользуемые переменные, ненужные и отладочные команды, избавляются от ошибок форматирования.

Сколько времени нужно, чтобы выучить Python

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

Если вы хотите стать Python-разработчиком, то готовьтесь уделять учебе от десяти часов в неделю. Занимаясь такое количество времени, вы сможете освоить Python на уровне джуна примерно в течение года.

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

Попробуйте себя в Python

Полезные материалы для изучения Python

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

Решайте задачи

Существует много разных сайтов, на которых питонисты выкладывают и решают задачи по Python. Это, например:

  • LeetCode
  • Codewars
  • Exercism
  • okpython.net
  • Проект Эйлера
  • CheckiO

Платформа Kaggle подойдет для тех, кто выбрал для дальнейшего развития сферу машинного обучения. На ней проходят групповые соревнования, где организаторы дают разные задачи по Data Science. Участники решают задачи с помощью языка Python. Лучшие решения можно будет положить в портфолио.

Участвуйте в играх

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

В какие игры можно поиграть:

  • Code Monkey — пожалуй, самая популярная игра по Python. В ней нужно помогать обезьянке собирать бананы с помощью цепочки команд.
  • CodeCombat — игра учит базовым навыкам программирования и написанию кода. В ней нужно захватывать земли и уничтожать врагов.
  • Codebattle — это платформа, на которой проходят игры и турниры для разработчиков. Они развивают алгоритмическое мышление и дают полезные связи с разработчиками. Хекслет проводит соревнования разработчиков разных уровней на Codebattle каждый месяц — участвуйте, чтобы приобрести новый опыт и разнообразить свое обучение.

Читайте книги

Есть много хороших книг по изучению Python. Будет здорово, если вы прочитаете некоторые из них:

  • Пол Бэрри «Изучаем программирование на Python»
  • Марк Лутц «Изучаем Python»
  • Эрик Мэтиз. Изучаем Python. Программирование игр, визуализация данных, веб-приложения».

Также у Хекслета есть свой список рекомендованной литературы. Ознакомьтесь с этими книгами — они полезны для программистов любых направлений.

На YouTube-канале Хекслета есть рубрика «Публичные собеседования» , в которой наши студенты проходят учебные интервью у специалистов разных компаний. Посмотрите видео из этой рубрики, чтобы иметь понимание о том, как проходят собеседования и какие знания нужны разработчикам, чтобы успешно их проходить.

Если в процессе обучения вы почувствуете, что вам не хватает поддержки единомышленников и более опытных разработчиков, присоединяйтесь к Хекслет Комьюнити. Там вы сможете обсуждать трудные моменты в учебе, получать помощь и поддержку.

Что дальше

Если хотите быстро и недорого попробовать работать с Python под руководством наставника — запишитесь на наши подготовительные курсы. Двухнедельный интенсив позволит получить крепкую базу знаний и написать свою первую программу на Python.

Как организовать код в Python-проекте, чтобы потом не пожалеть

Python отличается от таких языков программирования, как C# или Java, заставляющих программиста давать классам имена, соответствующие именам файлов, в которых находится код этих классов.

Python — это самый гибкий язык программирования из тех, с которыми мне приходилось сталкиваться. А когда имеешь дело с чем-то «слишком гибким» — возрастает вероятность принятия неправильных решений.

  • Хотите держать все классы проекта в единственном файле main.py ? Да, это возможно.
  • Надо читать переменную окружения? Берите и читайте там, где это нужно.
  • Требуется модифицировать поведение функции? Почему бы не прибегнуть к декоратору!?

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

Но, если вы точно знаете о том, что делаете, последствия гибкости Python не обязательно окажутся плохими.

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

Структура Python-проекта

Сначала обратим внимание на структуру директорий проекта, на именование файлов и организацию модулей.

Рекомендую держать все файлы модулей в директории src , а тесты — в поддиректории tests этой директории:

 ├── src │ ├── /* │ │ ├── __init__.py │ │ └── many_files.py │ │ │ └── tests/* │ └── many_tests.py │ ├── .gitignore ├── pyproject.toml └── README.md

Здесь — это главный модуль проекта. Если вы не знаете точно — какой именно модуль у вас главный — подумайте о том, что пользователи проекта будут устанавливать командой pip install , и о том, как, по вашему мнению, должна выглядеть команда import для вашего модуля.

Часто имя главного модуля совпадает с именем всего проекта. Но это — не некое жёсткое правило.

Аргументы в пользу директории src

Я видел множество проектов, устроенных по-другому.

Например, в проекте может отсутствовать директория src , а все модули будут просто лежать в его корневой директории:

non_recommended_project ├── /* │ ├── __init__.py │ └── many_files.py │ ├── .gitignore │ ├── tests/* │ └── many_tests.py │ ├── pyproject.toml │ ├── /* │ ├── __init__.py │ └── many_files.py │ └── README.md

Уныло смотрится проект, в структуре которого нет никакого порядка из-за того, что его папки и файлы просто расположены по алфавиту, в соответствии с правилами сортировки объектов в IDE.

Главная причина, по которой рекомендуется пользоваться папкой src , заключается в том, чтобы активный код проекта был бы собран в одной директории, а настройки, параметры CI/CD, метаданные проекта находились бы за пределами этой директории.

Единственный минус такого подхода заключается в том, что, без дополнительных усилий, не получится воспользоваться в своём коде командой вида import module_a . Для этого потребуется кое-что сделать. Ниже мы поговорим о том, как решить эту проблему.

Именование файлов

Правило №1: тут нет файлов

Во-первых — в Python нет таких сущностей, как «файлы», и я заметил, что это — главный источник путаницы для новичков.

Если вы находитесь в директории, содержащей файл __init__.py , то это — директория, включающая в себя модули, а не файлы.

Рассматривайте каждый модуль, как пространство имён.

Я говорю о «пространстве имён», так как нельзя сказать с уверенностью — имеется ли в модуле множество функций и классов, или только константы. В нём может присутствовать практически всё что угодно, или лишь несколько сущностей пары видов.

Правило №2: если нужно — держите сущности в одном месте

Совершенно нормально, когда в одном модуле имеется несколько классов. Так и стоит организовывать код (но, конечно, только если классы связаны с модулем).

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

Часто встречается мнение, что это — пример неудачного приёма работы. Те, кто так считают, находятся под влиянием опыта, полученного после использования других языков программирования, которые принуждают к другим решениям (например — это Java и C#).

Правило №3: давайте модулям имена, представляющие собой существительные во множественном числе

Давая модулям имена, следуйте общему правилу, в соответствии с которым эти имена должны представлять собой существительные во множественном числе. При этом они должны отражать особенности предметной области проекта.

Правда, у этого правила есть и исключение. Модули могут называться core , main.py или похожим образом, что указывает на то, что они представляют собой некую единичную сущность. Подбирая имена модулей, руководствуйтесь здравым смыслом, а если сомневаетесь — придерживайтесь вышеприведённого правила.

Реальный пример именования модулей

Вот мой проект — Google Maps Crawler, созданный в качестве примера.

Этот проект направлен на сбор данных из Google Maps с использованием Selenium и на их представление в виде, удобном для дальнейшей обработки (тут, если интересно, можно об этом почитать).

Вот текущее состояние дерева проекта (тут выделены исключения из правила №3):

gmaps_crawler ├── src │ └── gmaps_crawler │ ├── __init__.py │ ├── config.py (форма единственного числа) │ ├── drivers.py │ ├── entities.py │ ├── exceptions.py │ ├── facades.py │ ├── main.py (форма единственного числа) │ └── storages.py │ ├── .gitignore ├── pyproject.toml └── README.md

Весьма естественным кажется такой импорт классов и функций:

from gmaps_crawler.storages import get_storage from gmaps_crawler.entities import Place from gmaps_crawler.exceptions import CantEmitPlace

Можно понять, что в exceptions может иметься как один, так и множество классов исключений.

Именование модулей существительными множественного числа отличается следующими приятными особенностями:

  • Модули не слишком «малы» (в том смысле, что предполагается, что один модуль может включать в себя несколько классов).
  • Их, если нужно, в любой момент можно разбить на более мелкие модули.
  • «Множественные» имена дают программисту сильное ощущение того, что он знает о том, что может быть внутри соответствующих модулей.

Именование классов, функций и переменных

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

Имена функций и методов должны быть глаголами

Функции и методы представляют собой действия, или нечто, выполняющее действия.

Функция или метод — это не просто нечто «существующее». Это — нечто «действующее».

Действия чётко определяются глаголами.

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

def get_orders(): . def acknowledge_event(): . def get_delivery_information(): . def publish(): . 

А вот — несколько неудачных примеров:

def email_send(): . def api_call(): . def specific_stuff(): . 

Тут не очень ясно — возвращают ли функции объект, позволяющий выполнить обращение к API, или они сами выполняют какие-то действия, например — отправку письма.

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

email_send.title = "title" email_send.dispatch()

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

  • Создание функции main() , которую вызовут в главной точке входа приложения — это хороший повод нарушить это правило.
  • Использование @property для того, чтобы обращаться с методом класса как с атрибутом, тоже допустимо.
Имена переменных и констант должны быть существительными

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

Вот примеры удачных имён:

plane = Plane() customer_id = 5 KEY_COMPARISON = "abc"

Вот — неудачные имена:

fly = Plane() get_customer_id = 5 COMPARE_KEY = "abc"

А если переменная или константа представляют собой список или коллекцию — им подойдёт имя, представленное существительным во множественном числе:

planes: list[Plane] = [Plane()] # Даже если содержит всего один элемент customer_ids: set[int] = KEY_MAP: dict[str, str] = # Имена словарей остаются существительными в единственном числе
Имена классов должны говорить сами за себя, но использование суффиксов — это нормально

Отдавайте предпочтение именам классов, понятным без дополнительных пояснений. При этом можно использовать и суффиксы, вроде Service , Strategy , Middleware , но — только в крайнем случае, когда они необходимы для чёткого описания цели существования класса.

Всегда давайте классам имена в единственном, а не во множественном числе. Имена во множественном числе напоминают имена коллекций элементов (например — если я вижу имя orders , то я полагаю, что это — список или итерируемый объект). Поэтому, выбирая имя класса, напоминайте себе, что после создания экземпляра класса в нашем распоряжении оказывается единственный объект.

Классы представляют собой некие сущности

Классы, представляющие нечто из бизнес-среды, должны называться в соответствии с названиями связанных с ними сущностей (и имена должны быть существительными!). Например — Order , Sale , Store , Restaurant и так далее.

Пример использования суффиксов

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

Кто-то может решить, что он может олицетворять некую сущность:

email = Email() # Предполагаемый пример использования email.title = "Title" email.body = create_body() email.send_to = "guilatrova.dev" send_email(email)

Такой класс следует назвать EmailSender или EmailService .

Соглашения по именованию сущностей

Следуйте этим соглашениям по именованию сущностей:

Тип

Общедоступный

Внутренний

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *