Бібліотеки

Огляд

Викладання: 10 хв
Вправи: 10 хв
Питання
  • Як я можу використовувати програмне забезпечення, яке написали інші люди?

  • Як я можу дізнатися, що робить це програмне забезпечення?

Цілі

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

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

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

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

import math

print('pi is', math.pi)
print('cos(pi) is', math.cos(math.pi))
pi is 3.141592653589793
cos(pi) is -1.0

Використовуйте 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 math import cos, pi

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

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

import math as m

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

Знайомство з модулем 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.

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

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

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

Рішення

Здається, модуль 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)

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

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

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

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

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

Оператори друку:

  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 імпортує всі functions з модуля math.
  2. Виклик бібліотеки 3. Тут sin та pi посилаються на скорочену назву бібліотеки m замість math. Виклик бібліотеки 3 робить саме це за допомогою синтаксису import ... as ... , що створює псевдонім для math в формі скороченої назви m.
  3. Виклик бібліотеки 2. Тут sin та pi посилаються на звичайну бібліотеку math, тому буде достатньо звичайного виклику import ... .

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

  1. Заповніть порожні поля так, щоб програма, наведена нижче, вивела 90.0.
  2. Чи вважаєте ви цю версію легшою для читання, ніж попередні?
  3. Чому не програмісти завжди використовують цю форму імпорту?
____ math import ____, ____
angle = degrees(pi / 2)
print(angle)

Рішення

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

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

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

  1. Прочитайте наведений нижче код і спробуйте визначити помилки перед його виконанням.
  2. Запустіть код і прочитайте повідомлення про помилку. Який тип цієї помилки?
from math import log
log(0)

Рішення

  1. Логарифм x визначено лише для x > 0, тому 0 знаходиться за межами області визначення функції.
  2. Ви отримуєте повідомлення про помилку типу “ValueError”, яке вказує на те, що функція отримала невідповідне значення аргументу. Додаткове повідомлення “math domain error” пояснює, в чому полягає проблема.

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

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

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

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

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

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