Перейти до вмісту

Підручник мови Python/Короткий огляд стандартної бібліотеки

Матеріал з Вікіпідручника

Інтерфейс операційної системи

[ред.]

Модуль os містить функції взаємодії з операційною системою:

>>> import os
>>> os.system('time 0:02')
0
>>> os.getcwd() # Повертає поточну робочу директорію
'C:\\Python24'
>>> os.chdir('/server/accesslogs')

Пам'ятайте, що слід використовувати "import os" замість "from os import *". Це дозволить запобігти перекриванню вбудовано функції open() функцією os.open(), яка має зовсім інше призначення.

Вбудовані функції dir() та help() є дуже корисними для отримання допомоги при роботі з такими великими модулями як os:

>>> import os
>>> dir(os) # повертає список усіх функцій модуля
>>> help(os) # повертає інструкцію створену збиранням до купи рядків документації модуля

Для щоденних потреб, пов'язаних з файлами та директоріями, модуль shutil надає інтерфейс більш високого рівня, що спрощує програмування:

>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db') # копіювання
>>> shutil.move('/build/executables', 'installdir') # переміщення

Шаблони розширення файлових назв

[ред.]

Модуль glob містить функцію, що дозволяє створювати списки файлів за допомогою шаблонів розширення, застосованих до директорій:

>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

Аргументи командного рядка

[ред.]

Скрипти часто використовують аргументи, подані з командного рядка. Ці аргументи зберігаються у вигляді списку атрибута argv, що знаходиться в модулі sys. Наприклад, якщо з командного рядка було запущено команду "python demo.py one two three", то ми можемо отримати такий вивід:

>>> import sys
>>> print sys.argv
['demo.py', 'one', 'two', 'three']

Модуль getopt оброблює sys.argv на основі конвенцій юніксової функції getopt(). Потужнішу і гнучкішу обробку командного рядка можна знайти у модулі optparse.

Переспрямування виводу помилок та вихід із програми

[ред.]

Модуль sys має також атрибути stdin, stdout та stderr ("стандартний ввід", "стандартний вивід" та "стандартний вивід помилок" відповідно ). Останній корисний для виводу попереджень і помилок при переспрямуванні stdout:

>>> sys.stderr.write('Попередження: файл для запису не знайдено; створюється новий файл')
Попередження: файл для запису не знайдено; створюється новий файл

Найпростіший шлях виходу з програми — це виклик "sys.exit()".

Пошук за шаблоном

[ред.]

Модуль re містить утиліти регулярних виразів для пошуку за шаблоном всередині рядків. Регулярні вирази надають компактні оптимальні вирішення при застосуванні доволі складних правил пошуку:

>>> import re
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'

Якщо потрібні лише простенькі маніпуляції, то найліпше застосовувати методи рядків, які набагато простіше читати та зневаджувати:

>>> 'tea for too'.replace('too', 'two')
'tea for two'

Математика

[ред.]

Модуль math надає можливість доступу до функцій бібліотеки C для роботи з дробовими числами:

>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
>>> math.log(1024, 2)
10.0

Модуль random містить утиліти для роботи з випадковими числами:

>>> import random
>>> print random.choice(['яблуко', 'груша', 'банан'])
'яблуко'
>>> random.sample(xrange(100), 10)   # вибір без заміщення
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # випадкове число з рухомою комою
0.17970987693706186
>>> random.randrange(6)    # випадкове ціле число, вибране з послідовності range(6)
4

Доступ до інтернету

[ред.]

Існують кілька модулів для доступу до інтернету та обробки його протоколів. Два найпростіші — це urllib2 (для отримання даних з інтернет-адрес) та smtplib для відправлення електронної пошти:

>>> import urllib2
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... if 'EST' in line:      # шукаємо Eastern Standard Time
...     print line
    
Nov. 25, 09:43:32 PM EST

>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@tmp.org', 'jceasar@tmp.org',
"""To: jceasar@tmp.org
From: soothsayer@tmp.org

Beware the Ides of March.
""")
>>> server.quit()

Час і число

[ред.]

Модуль datetime містить класи для роботи з даними, що виражають час та число, як у складний так і в простий спосіб. Він придатний і для арифметики часових даних, хоча основна увага приділяється ефективному витягу даних для форматування та їхньої обробки. Модуль також має об'єкти, що розрізняють різні часові зони.

# створення та форматування чисел дуже просте
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y or %d%b %Y is a %A on the %d day of %B")
'12-02-03 or 02Dec 2003 is a Tuesday on the 02 day of December'

# часові дані придатні для застосування календарної арифметики
>>> birthday = date(1964, 7, 31)
>>> age = now  birthday
>>> age.days
14368

Ущільнення даних

[ред.]

Поширені формати ущільнення та архівації даних напряму підтримуються такими модулями як zlib, gzip, bz2, zipfile та tarfile.

>>> import zlib
>>> s = 'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
'witch which has which witches wrist watch'
>>> zlib.crc32(t)
-1438085031

Обчислення продуктивності

[ред.]

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

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

>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.60864915603680925
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.8625194857439773

На відміну від високого рівня детальності модуля timeit, модулі profile та pstats мають інструменти для ідентифікації критичних ділянок коду у більших блоках коду.

Контроль якості

[ред.]

Один із способів для створення якісного програмного забезпечення - це написання спеціальних тестів для кожної функції, і часте використання цих тестів під час процесу розробки.

Модуль doctest має спеціальні інструменти для сканування модуля та перевірки тестів, що вказані в рядках документації. Створення ж тестів — дуже просте і полягає у копіюванні та вставці типового виклику функції та її результату в рядок документації. Додання прикладу вдосконалює документацію а також дозволяє модулю doctest перевірити, чи відповідає код документації:

def average(values):
    """Виводить середнє арифметичне для даного списку чисел.

    >>> print average([20, 30, 70])
    40.0
    """
    return sum(values, 0.0) / len(values)

import doctest
doctest.testmod()   # автоматично перевірити тести

Модуль unittest є дещо складнішим за doctest, але натомість дозволяє провести більш ґрунтовне тестування за допомогою правил, що здебільшого задаються в окремому файлі:

import unittest

class TestStatisticalFunctions(unittest.TestCase):

    def test_average(self):
        self.assertEqual(average([20, 30, 70]), 40.0)
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
        self.assertRaises(ZeroDivisionError, average, [])
        self.assertRaises(TypeError, average, 20, 30, 70)

unittest.main() # Виклик з командного рядка запускає всі тести

Батарейки додаються

[ред.]

Коротко філософію Пайтона можна висловити так: "батарейки додаються". Це найкраще видно через складні та потужні властивості більших пакетів. Зокрема:

  • Модулі xmlrpclib та SimpleXMLRPCServer роблять розробку викликів віддалених процедур досить тривіальною справою. Не зважаючи на назви, їхнє використання не потребує спеціальних навичок роботи з XML.
  • Пакет email — це бібліотека для роботи з електронними повідомленнями, що включає MIME та інші документи повідомлень, які визначаються у RFC 2822. На відміну від smtplib та poplib, які просто надсилають та отримують повідомлення, цей пакет має повний інструментарій для створення та кодування складних структур повідомлень (включно з доданими документами) та для імплементації інтернет-кодувань та протоколів заголовків.
  • Пакети xml.dom та xml.sax мають потужну підтримку для обробки цього популярного формату для обміну даними. Подібно до нього модуль csv підтримує зчитування і запис розповсюдженого формату бази даних. Разом ці модулі та пакети значно спрощують обмін даними між Пайтоном та іншими програмами та утилітами.
  • Кілька модулів присвячено інтернаціоналізації, зокрема gettext, locale та codecs.