Повторне використання коду та модульність у 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