Бібліотеки

Останнє оновлення 2025-04-24 | Редагувати цю сторінку

Приблизний час: 20 хвилин

Огляд

Питання

  • Як використовувати програмне забезпечення, написане іншими людьми?
  • Як дізнатися, які саме функції виконує це програмне забезпечення?

Цілі

  • Переваги створення та використання бібліотек програмного забезпечення.
  • Імпорт та використання стандартних бібліотек Python у власних програмах.
  • Пошук документації про стандартні бібліотеки в інтерактивному режимі (в інтерпретаторі) або онлайн.

Більша частина потужності мови програмування полягає в її бібліотеках.


  • Бібліотека - це колекція файлів (так званих модулів), що містить функції для використання іншими програмами.
    • Може також визначати значення даних (наприклад, числові константи) та інші речі.
    • Передбачається, що зміст бібліотеки певним чином взаємопов’язаний, але немає засобів це проконтролювати.
  • Стандартна бібліотека Python — це великий набір модулів, що входить до складу базової інсталяції Python.
  • Багато додаткових бібліотек доступні в PyPI (Python Package Index - репозиторій програм для Python).
  • Пізніше ми побачимо, як писати нові бібліотеки.

Бібліотеки та модулі

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

Щоб використати бібліотечний модуль, його спочатку потрібно імпортувати.


  • Для завантаження бібліотечного модуля в пам’ять програми використовуйте import.
  • Потім посилайтеся на функції модуля за допомогою module_name.function_name.
    • У Python синтаксис a.b означає що a містить b, або іншими словами, b є частиною a, або b належить до a.
  • Використовуючи math, один із модулів стандартної бібліотеки, маємо:

PYTHON

import math

print('pi is', math.pi)
print('cos(pi) is', math.cos(math.pi))

ВИХІД

pi is 3.141592653589793
cos(pi) is -1.0
  • На кожен елемент модуля потрібно посилатися разом з його назвою.
    • math.cos(pi) не спрацює: посилання на pi жодним чином не “успадковує” посилання на math при виклику функції cos().

Використовуйте help, щоб дізнатися про вміст бібліотечного модуля.


  • Працює так само, як довідка для функції.

PYTHON

help(math)

ВИХІД

Help on module math:

NAME
    math

MODULE REFERENCE
    http://docs.python.org/3/library/math

    The following documentation is automatically generated from the Python
    source files.  It may be incomplete, incorrect or include features that
    are considered implementation detail and may vary between Python
    implementations.  When in doubt, consult the module reference at the
    location listed above.

DESCRIPTION
    This module is always available.  It provides access to the
    mathematical functions defined by the C standard.

FUNCTIONS
    acos(x, /)
        Return the arc cosine (measured in radians) of x.
⋮ ⋮ ⋮

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


  • Використовуйте from ... import ..., щоб завантажити лише певні елементи з бібліотечного модуля.
  • Потім звертайтеся до них безпосередньо без назви бібліотеки як префікса.

PYTHON

from math import cos, pi

print('cos(pi) is', cos(pi))

ВИХІД

cos(pi) is -1.0

Створіть псевдонім для бібліотечного модуля під час його імпорту для скорочення програм.


  • Використовуйте import ... ... as ..., щоб надати бібліотеці короткий псевдонім під час її імпорту.
  • Потім звертайтеся до елементів у бібліотеці, використовуючи цю скорочену назву.

PYTHON

import math as m

print('cos(pi) is', m.cos(m.pi))

ВИХІД

cos(pi) is -1.0
  • Зазвичай цей метод використовується для бібліотек, які дуже поширені або мають довгі імена.
    • Наприклад, бібліотека для побудови графіків matplotlib часто має псевдонім mpl.
  • Але цей спосіб ускладнює програми, оскільки читачі мають вивчити псевдоніми вашої програми.

Знайомство з модулем math

  1. За допомогою якої функції з модуля math можна обчислити квадратний корінь без використання sqrt?
  2. Оскільки бібліотека містить цю функцію, чому існує sqrt?
  1. Використовуючи help(math) ми бачимо, що у нас є pow(x,y) на додаток до sqrt(x), отже ми можемо застосувати pow(x, 0.5) для визначення квадратного кореня.

  2. Функція sqrt(x), ймовірно, легша для читання в вихідному коді, ніж pow(x, 0.5). Читабельність є основою хорошого стилю програмування, отже має сенс надати спеціальну функцію для цього конкретного поширеного випадку.

Крім того, дизайн бібліотеки math у Python бере свій початок у стандарті мови C, яка включає як sqrt(x), так і pow(x,y), тож трохи історії програмування відображається в назвах функцій Python.

Пошук правильного модуля

Припустимо, ви хочете вибрати випадковий символ з рядка:

PYTHON

bases = 'ACTTGCTTGAC'
  1. Який модуль зі стандартної бібліотеки може допомогти?
  2. Яку функцію ви б вибрали з цього модуля? Чи є альтернативи?
  3. Спробуйте написати програму, яка використовує цю функцію.

Здається, модуль random може допомогти.

Рядок містить 11 символів, кожен з яких має позиційний індекс від 0 до 10. Ви можете використовувати функції random.randrange або random.randint, щоб отримати випадкове число від 0 до 10, а потім вибрати символ з bases в цій позиції:

PYTHON

from random import randrange

random_index = randrange(len(bases))
print(bases[random_index])

або більш компактно:

PYTHON

from random import randrange

print(bases[randrange(len(bases))])

Можливо, ви знайшли ще функцію random.sample? Ця функція дозволяє використовувати трохи менше коду, але може бути трохи складнішою для розуміння при читанні:

PYTHON

from random import sample

print(sample(bases, 1)[0])

Зверніть увагу, що ця функція повертає список (list) значень. Ми дізнаємося про списки у епізоді 11.

Найпростіше і найкоротше рішення - це функція random.choice, яка виконує саме те, чого ми хочемо:

PYTHON

from random import choice

print(choice(bases))

Головоломка (задача Парсона). Приклад програмування

Упорядкуйте наступні оператори таким чином, щоб друкувалась випадкова основа ДНК та її індекс в рядку. Не всі оператори можуть бути потрібні. За необхідності додавайте проміжні змінні.

PYTHON

bases="ACTTGCTTGAC"
import math
import random
___ = random.randrange(n_bases)
___ = len(bases)
print("random base ", bases[___], "base index", ___)

PYTHON

import math 
import random
bases = "ACTTGCTTGAC" 
n_bases = len(bases)
idx = random.randrange(n_bases)
print("random base", bases[idx], "base index", idx)

Коли доступна допомога?

Ваш колега виконав запит help(math). Python повернув помилку:

ПОМИЛКА

NameError: name 'math' is not defined

Що забув зробити ваш колега?

Імпортувати модуль math (import math)

Імпорт із псевдонімами

  1. Заповніть порожні поля так, щоб програма, наведена нижче, вивела 90.0.
  2. Перепишіть програму так, щоб вона використовувала import без as.
  3. Яку форму вам легше читати?

PYTHON

import math as m
angle = ____.degrees(____.pi / 2)
print(____)

PYTHON

import math as m
angle = m.degrees(m.pi / 2)
print(angle)

можна записати як

PYTHON

import math
angle = math.degrees(math.pi / 2)
print(angle)

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

Існує багато способів імпорту бібліотек!

Зіставте наступні команди друку з відповідними викликами бібліотеки.

Команди друку:

  1. print("sin(pi/2) =", sin(pi/2))
  2. print("sin(pi/2) =", m.sin(m.pi/2))
  3. print("sin(pi/2) =", math.sin(math.pi/2))

Виклик бібліотеки:

  1. from math import sin, pi
  2. import math
  3. import math as m
  4. from math import *
  1. Виклики бібліотеки 1 та 4. Для прямого посилання на sin та pi без назви бібліотеки як префікса, вам потрібно використовувати оператор from ... import .... Виклик бібліотеки 1 явним чином імпортує дві функції sin та pi, тоді як виклик бібліотеки 4 імпортує всі функції з модуля math.
  2. Виклик бібліотеки 3. Тут sin та pi посилаються на скорочену назву бібліотеки m замість math. Це стає можливим завдяки команді import ... as ... яка створює псевдонім для math в формі короткого імені m.
  3. Виклик бібліотеки 2. Тут sin та pi посилаються на бібліотеку math за її стандартним імʼям, тому буде достатньо звичайного виклику import ... .

Примітка: хоча виклик бібліотеки 4 працює, імпорт всіх імен модуля за допомогою шаблона * не рекомендується, тому що в такому разі невідомо, які імена з модуля використовуються в коді. Загалом, краще робити імпорт якомога точнішим та імпортувати лише те, що використовує ваш код. У виклику бібліотеки 1 оператор import явно повідомляє нам що функція sin імпортується з модуля math, але виклик бібліотеки 4 не передає цю інформацію.

Імпорт певних елементів

  1. Заповніть порожні поля так, щоб програма, наведена нижче, вивела 90.0.
  2. Чи вважаєте ви цю версію легшою для читання, ніж попередні?
  3. Чому програмісти не завжди використовують цю форму import?

PYTHON

____ math import ____, ____
angle = degrees(pi / 2)
print(angle)

PYTHON

from math import degrees, pi
angle = degrees(pi / 2)
print(angle)

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

Читання повідомлень про помилки

  1. Прочитайте наведений нижче код і спробуйте визначити без його запуску, у чому полягають помилки.
  2. Запустіть код і прочитайте повідомлення про помилку. Який це тип помилки?

PYTHON

from math import log
log(0)

ВИХІД

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-d72e1d780bab> in <module>
      1 from math import log
----> 2 log(0)

ValueError: math domain error
  1. Логарифм x визначено лише для x > 0, тому 0 знаходиться за межами області визначення функції.

  2. Ви отримуєте повідомлення про помилку типу ValueError, яке вказує на те, що функція отримала неприпустиме значення аргументу. Додаткове повідомлення “math domain error” пояснює, в чому полягає проблема.

Ключові моменти

  • Більша частина потужності мови програмування полягає в її бібліотеках.
  • Щоб використати бібліотечний модуль, його спочатку потрібно імпортувати.
  • Використовуйте help, щоб дізнатися про вміст бібліотечного модуля.
  • Імпортуйте певні елементи з бібліотечного модуля, щоб скоротити програми.
  • Створюйте псевдонім для бібліотечного модуля під час його імпорту для скорочення програм.