Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!

Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount

Модулі та пакети


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

Writing modules

Модулі в Python — це просто файли Python з розширенням .py. Назва модуля відповідає назві файлу. Python модуль може містити набір функцій, класів чи змінних, визначених і реалізованих у ньому. Наведений вище приклад містить два файли:

mygame/

  • mygame/game.py

  • mygame/draw.py

Python-скрипт game.py реалізує гру. Він використовує функцію draw_game з файлу draw.py, або іншими словами, з модуля draw, що реалізує логіку відображення гри на екрані.

Модулі імпортуються з інших модулів за допомогою команди import. У цьому прикладі скрипт game.py може виглядати таким чином:

Модуль draw може виглядати наступним чином:

У цьому прикладі модуль game імпортує модуль draw, що дозволяє йому використовувати функції, реалізовані в цьому модулі. Функція main використовує локальну функцію play_game для запуску гри і потім відображає результат за допомогою функції draw_game, реалізованої в модулі draw. Щоб використовувати функцію draw_game з модуля draw, нам потрібно вказати, в якому модулі функція реалізована, використовуючи оператор крапки. Для звернення до функції draw_game з модуля game, ми повинні імпортувати модуль draw і потім викликати draw.draw_game().

Коли виконується директива import draw, інтерпретатор Python шукає файл у директорії, в якій скрипт був виконаний, із назвою модуля та суфіксом .py. У цьому випадку шукатиме draw.py. Якщо він знайдений, він буде імпортований. Якщо не знайдений, він продовжить шукати вбудовані модулі.

Ви могли помітити, що при імпорті модуля створюється файл .pyc. Це — скомпільований файл Python. Python компілює файли у байт-код Python, щоб не потрібно було аналізувати файли при щоразове завантаження модулів. Якщо файл .pyc існує, він завантажується замість .py файлу. Цей процес є прозорим для користувача.

Importing module objects to the current namespace

Простір імен — це система, у якій кожен об’єкт має ім'я та може бути доступний у Python. Ми імпортуємо функцію draw_game у простір імен основного скрипта, використовуючи команду from.

Ви могли помітити, що в цьому прикладі назва модуля не передує draw_game, тому що ми вказали ім'я модуля, використовуючи команду import.

Переваги такого запису полягають у тому, що вам не потрібно щораз посилатися на модуль. Однак, простір імен не може мати два об’єкти з однаковими іменами, тому команда import може замінити існуючий об’єкт в просторі імен.

Importing all objects from a module

Ви можете використовувати команду import * для імпорту всіх об'єктів у модулі, наприклад так:

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

Custom import name

Модулі можуть бути завантажені під будь-яким ім'ям, яке ви бажаєте. Це корисно, коли ви імпортуєте модуль умовно щоб використовувати однакове ім'я в решті коду.

Наприклад, якщо у вас є два модулі draw з трохи різними іменами, ви можете зробити наступне:

Module initialization

Уперше модуль завантажується в запущений скрипт Python, він ініціалізується шляхом виконання коду в модулі один раз. Якщо інший модуль у вашому коді знову імпортує той самий модуль, він не буде завантажений ще раз, тому локальні змінні всередині модуля поводяться як "синглтон", тобто вони ініціалізуються тільки один раз.

Ви можете використовувати це для ініціалізації об'єктів. Наприклад:

Extending module load path

Існує кілька способів вказати інтерпретатору Python, де шукати модулі, на додаток до використання за замовчуванням локального каталогу та вбудованих модулів. Ви можете використовувати змінну оточення PYTHONPATH для вказання додаткових каталогів для пошуку модулів, наприклад так:

Це виконує game.py, і дозволяє скрипту завантажувати модулі з каталогу foo, а також з локального каталогу.

Ви можете також використовувати функцію sys.path.append. Виконуйте її перед запуском команди import:

Тепер каталог foo доданий до списку шляхів, де шукаються модулі.

Exploring built-in modules

Ознайомтеся з повним списком вбудованих модулів у стандартній бібліотеці Python тут.

Дві дуже важливі функції стануть у нагоді при вивченні модулів у Python - функції dir та help.

Щоб імпортувати модуль urllib, який дозволяє нам читати дані з URL-адрес, ми import модуль:

Ми можемо подивитися, які функції реалізовані в кожному модулі, за допомогою функції dir:

Коли ми знаходимо функцію в модулі, яку хочемо використовувати, ми можемо дізнатися більше про неї за допомогою функції help, використовуючи інтерпретатор Python:

Writing packages

Пакети - це простори імен, що містять кілька пакетів і модулів. Вони просто директорії, але з певними вимогами.

Кожен пакет у Python - це директорія, яка ПОВИННА містити спеціальний файл під назвою __init__.py. Цей файл, який може бути порожнім, вказує, що директорія є пакетом Python. Завдяки цьому його можна імпортувати так само, як модуль.

Якщо ми створимо директорію під назвою foo, що визначає назву пакету, ми можемо створити модуль всередині цього пакету під назвою bar. Потім ми додаємо файл __init__.py всередину директорії foo.

Щоб використовувати модуль bar, ми можемо імпортувати його двома способами:

або:

У першому прикладі вище, ми повинні використовувати префікс foo кожного разу, коли звертаємося до модуля bar. У другому прикладі це не потрібно, тому що ми імпортували модуль у простір імен нашого модуля.

Файл __init__.py також може визначити, які модулі пакет експортує як API, зберігаючи інші модулі внутрішніми, перевизначаючи змінну __all__, наприклад так:

Exercise

У цій вправі, надрукуйте список всіх функцій в модулі re, що містять слово find, відсортований в алфавітному порядку.

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!

Previous Tutorial Next Tutorial Take the Test
Copyright © learnpython.org. Read our Terms of Use and Privacy Policy