Повторне використання коду та модульність у Python

Автори: Вільям Туркел і Адам Краймбл Переклали на українську: Мар’яна Юрків, Анастасія Юрків Оригінал уроку: https://programminghistorian.org/en/lessons/code-reuse-and-modularity

Комп’ютерні програми без спеціальних механізмів для керування складністю можуть ставати довгими, громіздкими й заплутаними. У цьому уроці ви побачите, як можна повторно використовувати код, створюючи функції, та ділити програму на модулі, щоб зробити її компактнішою й простішою для налагодження.

Цілі уроку

Комп’ютерні програми без спеціальних механізмів для керування складністю можуть ставати довгими, громіздкими й заплутаними. У цьому уроці ви побачите, як можна повторно використовувати код, створюючи функції, та ділити програму на модулі, щоб зробити її компактнішою й простішою для налагодження. Навіть перенесення лише однієї громіздкої частини програми в окремий модуль значно спрощує роботу з кодом та економить час.

Функції

Часто виникає потреба повторно використовувати певний набір інструкцій, особливо якщо завдання потрібно виконувати багаторазово. Більшість програм складається з підпрограм, які є достатньо потужними та універсальними для повторного застосування. Такі підпрограми називають функціями, і Python надає інструменти для створення нових функцій. Давайте розглянемо простий приклад функції. Припустимо, ви хочете створити універсальну функцію для привітань. Скопіюйте наведений нижче код у ваш редактор коду, наприклад Visual Studio Code, і збережіть файл під назвою greet.py.

# greet.py

def greetEntity(x):
    print("Привіт " + x)

greetEntity("усім")
greetEntity("Цифрові історики")

Рядок, що починається з def, є визначенням функції. У цьому рядку ми визначаємо («def» - define) функцію, яку назвали «greetEntity». (x) — це параметр функції. Незабаром ви зрозумієте, як це працюватиме. Другий рядок містить код функції. Код може складатися з будь-якої кількості рядків, але в цьому прикладі він складається лише з одного.

Зверніть увагу: у Python відступи відіграють ключову роль. Порожній простір перед командою print вказує інтерпретатору, що цей рядок є частиною функції. Ви дізнаєтеся більше про це згодом, але поки дотримуйтеся відступів за допомогою клавіші Tab, як вказано у прикладі. Запустіть програму, і ви побачите наступний результат:

Привіт усім
Привіт Цифрові історики

У цьому прикладі створена одна функція: greetEntity. Вона "викликається" (також можна сказати «активується») двічі. Виклик функції означає, що ми вказуємо програмі виконати код, який містить функція. Наприклад, це можна порівняти з тим, як ви кличете свою собаку і за виконану команду нагороджуєте її улюбленим смаколиком. У кожному виклику функції ми передаємо їй потрібний нам параметр. Спробуйте відредагувати файл greet.py, щоб викликати функцію greetEntity втретє, передавши своє ім’я як параметр. Запустіть програму знову. Тепер ви маєте зрозуміти, що саме робить (x) у визначенні функції.

Перш ніж перейти до наступного кроку, відредагуйте файл greet.py, видаливши виклики функції, але залишивши саме її визначення. Далі ви навчитеся викликати функцію з іншої програми. Після цього ваш файл greet.py повинен виглядати так:

def greetEntity (x):
    print("Привіт " + x)

Модульність

Коли програми невеликі, як у наведеному прикладі, їх зазвичай зберігають у одному файлі. Для виконання такої програми достатньо просто передати файл інтерпретатору. Але якщо програма збільшується і стає громіздкою, буде доцільним розділити її на окремі файли, які називають модулями. Такий підхід спрощує роботу з окремими частинами великих програм. Відлагоджуючи кожну частину окремо перед їх об’єднанням, ви не лише полегшуєте повторне використання окремих модулів у інших проєктах, а й спрощуєте виправлення помилок, адже таким чином легше знайти джерело проблеми. Крім того, розбиття програми на модулі дозволяє приховати деталі реалізації певної функціональності в межах відповідного модуля. Інші модулі не повинні знати, як реалізована певна задача, якщо вони за це не відповідають. Такий принцип називається "інкапсуляцією".

Уявіть, що ви створюєте автомобіль. Ви могли б почати додавати деталі навмання, але логічніше спершу побудувати й протестувати окремий модуль — наприклад, двигун — перш ніж переходити до інших компонентів. Двигун, у свою чергу, може складатися з менших модулів, таких як карбюратор чи система запалювання, а ті, своєю чергою, включають ще більш базові елементи. Такий самий підхід застосовується і в програмуванні: спочатку проблема розбивається на дрібніші частини і вирішують їх поступово.

Ви вже створили модуль, коли написали програму greet.py. Тепер ви напишите іншу програму, using-greet.py, яка імпортує код із вашого модуля та використовує його. У Python є спеціальна команда import, що дозволяє одній програмі отримати доступ до вмісту іншого файлу програми. Це саме те, що ми будемо використовувати.

Важливо, що обидва файли — greet.py та using-greet.py — мають бути збережені в одній і тій самій директорії. Саме тоді Python зможе знайти модуль greet та правильно його імпортувати.

Якщо ж файли ваших програм знаходяться у різних директоріях, то імпортувати модуль можна теж, але для цього доведеться використовувати більш складні підходи, наприклад:

  • додати шлях до директорії з модулем у змінну середовища PYTHONPATH,

  • або вказати шлях безпосередньо в коді через модуль sys (наприклад, import sys;

    sys.path.append("шлях_до_папки")).

На початковому етапі найпростіше зберігати обидва файли в одній папці, щоб імпорт працював без додаткових налаштувань.

Скопіюйте код нижче у ваш редактор і збережіть його як using-greet.py. Цей файл буде вашою основною програмою, а greet.py — модулем.

На початковому етапі найпростіше зберігати обидва файли в одній папці, щоб імпорт працював без додаткових налаштувань.

Скопіюйте код нижче у ваш редактор і збережіть його як using-greet.py. Цей файл буде вашою основною програмою, а greet.py — модулем.

# using-greet.py

import greet
greet.greetEntity("усім")
greet.greetEntity("Цифрові історики")

Тут ми виконали кілька дій. По-перше, ми вказали Python імпортувати (import) модуль greet.py, який ви створили раніше.

Зверніть увагу, що якщо раніше можна було викликати функцію тільки за її назвою, наприклад, greetEntity("усім"), то тепер потрібно додати ім’я модуля, в якому знаходиться функція, та крапку (.) перед самою назвою функції. Простими словами, це означає: "виклич функцію greetEntity, яку знайдеш у модулі greet.py".

Запустіть вашу програму using-greet.py, яку ви створили у вашому редакторі, за допомогою команди "Run Python". Зверніть увагу, що вам не потрібно запускати модуль greet.py окремо — достатньо запустити програму, яка його використовує. Якщо все зроблено правильно, у вікні виводу ви побачите таке:

Привіт усім
Привіт Цифрові історики

Перш ніж рухатися далі, переконайтеся, що ви розумієте різницю між завантаженням файлу даних (наприклад, helloworld.txt) і імпортуванням файлу програми (наприклад, greet.py).

Рекомендовані ресурси

Про авторів

Вільям Туркел, професор історії в Університеті Західного Онтаріо. Адам Краймбл, Університетський коледж Лондона.

Переклад українською: Мар’яна Юрків, доцент кафедри картографії та геопросторового моделювання Національного університету “Львівська політехніка”, ORCID; Анастасія Юрків, випускниця Львівського національного університету імені Івана Франка

Переклад рецензували: Ворожейкін Євген, доцент кафедри інформаційних комунікацій Київського столичного університету імені Бориса Грінченка; Віктор Пахолок, студент програми "Комп’ютерні науки" факультету прикладних наук в Українському Католицькому Університеті.

Рекомендоване цитування: Туркел, Вільям та Краймбл, Адам, "Повторне використання коду та модульність у Python." Programming Historian, переклали Мар’яна Юрків та Анастасія Юрків, Посібник з цифрової історії, 2025. DOI: https://doi.org/10.69915/dh022

Last updated