Бібліотеки
Огляд
Викладання: 10 хв
Вправи: 10 хвПитання
Як я можу використовувати програмне забезпечення, яке написали інші люди?
Як я можу дізнатися, що робить це програмне забезпечення?
Цілі
Більша частина потужності мови програмування полягає в її бібліотеках.
- Бібліотека — це набір файлів (так званих модулів), які містять
бібліотека функції для використання іншими програмами.
- Може також містити значення даних (наприклад, числові константи) та інші дані.
- Передбачається, що зміст бібліотеки певним чином пов’язаний, але немає засобів це проконтролювати.
- Standard library Python — це великий набір модулів, що постачається з самим Python.
- Багато додаткових бібліотек доступні в PyPI (the Python Package Index).
- Пізніше ми побачимо, як писати нові бібліотеки.
Бібліотеки та модулі
Бібліотека — це набір модулів, але ці терміни часто вважаються взаємозамінними, особливо тому, що багато бібліотек складаються лише з одного модуля, тому не хвилюйтеся, якщо ви їх плутаєте.
Програма повинна імпортувати бібліотечний модуль перед його використанням.
- Використовуйте
import
, щоб завантажити модуль бібліотеки в пам’ять програми. - Потім посилайтеся на функції модуля як
module_name.function_name
.- У Python синтакс
a.b
означає щоa
міститьb
, або іншими словами,b
є частиноюa
.
- У Python синтакс
- Використовуючи
math
, один із модулів у стандартній бібліотеці, маємо:
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
.
Використовуйте help
, щоб дізнатися про вміст бібліотечного модуля.
- Працює так само, як довідка для функції.
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 ...
, щоб завантажити лише певні елементи з бібліотечного модуля. - Потім звертайтеся до них безпосередньо без назви бібліотеки як префікса.
from math import cos, pi
print('cos(pi) is', cos(pi))
cos(pi) is -1.0
Створіть псевдонім для бібліотечного модуля під час його імпорту для скорочення програм.
- Використовуйте
import ... as ...
, щоб надати бібліотеці короткий псевдонім під час її імпорту. - Потім звертайтеся до елементів у бібліотеці, використовуючи цю скорочену назву.
import math as m
print('cos(pi) is', m.cos(m.pi))
cos(pi) is -1.0
- Зазвичай цей прийом використовується для бібліотек, які часто використовуються або мають довгі імена.
- Наприклад, бібліотека для побудови графіків
matplotlib
часто має псевдонімmpl
.
- Наприклад, бібліотека для побудови графіків
- Але це може ускладнювати розуміння програм, оскільки у цьому разі читачі повинні знати псевдоніми вашої програми.
Знайомство з модулем math
- За допомогою якої функції з модуля
math
можна обчислити квадратний корінь без використанняsqrt
?- Оскільки бібліотека містить цю функцію, чому існує
sqrt
?Рішення
- Використовуючи
help(math)
ми бачимо, що у нас єpow(x,y)
на додаток доsqrt(x)
, отже ми можемо застосуватиpow(x, 0.5)
для визначення квадратного кореня.Функція
sqrt(x)
, можливо, легша для читання, ніжpow(x, 0.5)
, коли реалізуються рівняння. Читабельність є наріжним каменем хорошого стилю програмування, отже має сенс надати спеціальну функцію для цього конкретного звичайного випадку.Крім того, дизайн бібліотеки
math
Python бере свій початок у стандарті C, який включає якsqrt(x)
, так іpow(x,y)
, тож трохи історії програмування відображається в назвах функцій Python.
Пошук правильного модуля
Ви хочете вибрати випадковий символ із рядка:
bases = 'ACTTGCTTGAC'
- Який модуль зі standard library може допомогти?
- Яку функцію ви б вибрали з цього модуля? Чи є альтернативи?
- Спробуйте написати програму, яка використовує функцію.
Рішення
Здається, модуль random може допомогти.
Рядок містить 11 символів, кожен з яких має позиційний індекс від 0 до 10. Ви можете використати функцію
random.randrange
(або псевдонімrandom.randint
якщо вам легше запам’ятати), щоб отримати випадкове ціле число від 0 до 10, а потім вибрати символ у цій позиції:from random import randrange random_index = randrange(len(bases)) print(bases[random_index])
або більш компактно:
from random import randrange print(bases[randrange(len(bases))])
Можливо, ви знайшли функцію
random.sample
? Це дозволяє набирати трохи менше коду:from random import sample print(sample(bases, 1)[0])
Зауважте, що ця функція повертає список значень. Ми дізнаємось про списки в episode 11.
Існують також інші функції, які ви можете використовувати, але з більш складним результуючим кодом.
Головоломка (задача Парсона). Приклад програмування
Упорядкуйте наступні оператори таким чином, щоб друкувалась випадкова ДНК база та її індекс в рядку. Не всі оператори можуть бути потрібні. За необхідності додавайте проміжні змінні.
bases="ACTTGCTTGAC" import math import random ___ = random.randrange(n_bases) ___ = len(bases) print("random base ", bases[___], "base index", ___)
Рішення
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
)
Імпорт із псевдонімами
- Заповніть порожні поля так, щоб програма, наведена нижче, надрукувала
90.0
.- Перепишіть програму так, щоб вона використовувала
import
безas
.- Яку форму вам легше читати?
import math as m angle = ____.degrees(____.pi / 2) print(____)
Рішення
import math as m angle = m.degrees(m.pi / 2) print(angle)
можна записати як
import math angle = math.degrees(math.pi / 2) print(angle)
Оскільки ви щойно написали код і знайомі з ним, ви можете насправді вважати, що першу версію легше читати. Але при спробі прочитати величезну купу коду, написаного кимось іншим, або коли повертаєтесь до свого власного величезного фрагменту коду через кілька місяців, нескорочені імена часто легші, за винятком випадку, де є чіткі умовні позначення скорочень.
Існує багато способів імпорту бібліотек!
Зіставте наступні оператори друку з відповідними викликами бібліотеки.
Оператори друку:
print("sin(pi/2) =", sin(pi/2))
print("sin(pi/2) =", m.sin(m.pi/2))
print("sin(pi/2) =", math.sin(math.pi/2))
Виклики бібліотеки:
from math import sin, pi
import math
import math as m
from math import *
Рішення
- Виклики бібліотеки 1 та 4. Для прямого посилання на
sin
таpi
без назви бібліотеки як префікса, вам потрібно використовуватиfrom ... import ...
оператор. Виклик бібліотеки 1 спеціально імпортує дві функціїsin
таpi
, тоді як виклик бібліотеки 4 імпортує всі functions з модуляmath
.- Виклик бібліотеки 3. Тут
sin
таpi
посилаються на скорочену назву бібліотекиm
замістьmath
. Виклик бібліотеки 3 робить саме це за допомогою синтаксисуimport ... as ...
, що створює псевдонім дляmath
в формі скороченої назвиm
.- Виклик бібліотеки 2. Тут
sin
таpi
посилаються на звичайну бібліотекуmath
, тому буде достатньо звичайного викликуimport ...
.
Імпорт певних елементів
- Заповніть порожні поля так, щоб програма, наведена нижче, вивела
90.0
.- Чи вважаєте ви цю версію легшою для читання, ніж попередні?
- Чому не програмісти завжди використовують цю форму
імпорту
?____ math import ____, ____ angle = degrees(pi / 2) print(angle)
Рішення
from math import degrees, pi angle = degrees(pi / 2) print(angle)
Швидше за все, вам легше читати цю версію, оскільки вона менш щільна. Основною причиною не використовувати цю форму імпорту є уникнення зіткнень імен. Наприклад, ви б не імпортували
degrees
таким чином, якби також хотіли використовувати назвуdegrees
для власної змінної або функції. Або якщо вам необхідно також імпортувати функцію з назвоюdegrees
з іншої бібліотеки.
Читання повідомлень про помилки
- Прочитайте наведений нижче код і спробуйте визначити помилки перед його виконанням.
- Запустіть код і прочитайте повідомлення про помилку. Який тип цієї помилки?
from math import log log(0)
Рішення
- Логарифм
x
визначено лише дляx > 0
, тому 0 знаходиться за межами області визначення функції.- Ви отримуєте повідомлення про помилку типу “ValueError”, яке вказує на те, що функція отримала невідповідне значення аргументу. Додаткове повідомлення “math domain error” пояснює, в чому полягає проблема.
Ключові моменти
Більша частина потужності мови програмування полягає в її бібліотеках.
Програма має імпортувати бібліотечний модуль, щоб використовувати його.
Використовуйте
help
, щоб дізнатися про вміст бібліотечного модуля.Імпортуйте певні елементи із бібліотеки для скорочення програм.
Створіть псевдонім для бібліотеки під час її імпорту для скорочення програм.