Файл: Понятие модуля Перед тем как приступить к изучению модулей стандартной библиотеки, необходимо определить то, что в Python называется модулем.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.12.2023

Просмотров: 27

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Python. Лекция 2.
Основные стандартные модули Python.
Одним из важных преимуществ языка Python является наличие большой библиотеки модулей и пакетов, входящих в стандартную поставку. Как говорят, к
Python "приложены батарейки".
Понятие модуля
Перед тем как приступить к изучению модулей стандартной библиотеки, необходимо определить то, что в Python называется модулем.
В соответствии с модульным подходом к программированию большая задача разбивается на несколько более мелких, каждую из которых (в идеале) решает отдельный модуль. В разных методологиях даются различные ограничения на размер модулей, однако при построении модульной структуры программы важнее составить такую композицию модулей, которая позволила бы свести к минимуму связи между ними. Набор классов и функций, имеющий множество связей между своими элементами, было бы логично расположить в одном модуле. Есть и еще одно полезное замечание: модули должно быть легче использовать, чем написать заново. Это значит, что модуль должен иметь удобный интерфейс: набор функций, классов и констант, который он предлагает своим пользователям.
В языке Python набор модулей, посвященных одной проблеме, можно поместить в пакет. Хорошим примером такого пакета является пакет xml
, в котором собраны модули для различных аспектов обработки XML.
В программе на Python модуль представлен объектом-модулем, атрибутами которого являются имена, определенные в модуле:
>>> import datetime
>>> d1 = datetime.date(2004, 11, 20)
В данном примере импортируется модуль datetime
. В результате работы оператора import в текущем пространстве имен появляется объект с именем datetime
Модули для использования в программах на языке Python по своему происхождению делятся на обычные (написанные на Python) и модули расширения, написанные на другом языке программирования (как правило, на C). С точки зрения пользователя они могут отличаться разве что быстродействием. Бывает, что в стандартной библиотеке есть два варианта модуля: на Python и на C. Таковы, например, модули pickle и cPickle
. Обычно модули на Python в чем-то гибче, чем модули расширения.
Модули в Python
Модуль оформляется в виде отдельного файла с исходным кодом. Стандартные модули находятся в каталоге, где их может найти соответствующий интерпретатор языка. Пути к каталогам, в которых Python ищет модули, можно увидеть в значении переменной sys.path
:
>>> sys.path
['',
'/usr/local/lib/python23.zip',


'/usr/local/lib/python2.3',
'/usr/local/lib/python2.3/plat-linux2',
'/usr/local/lib/python2.3/lib-tk',
'/usr/local/lib/python2.3/lib-dynload',
'/usr/local/lib/python2.3/site-packages']
В последних версиях Python модули можно помещать и в zip-архивы для более компактного хранения (по аналогии с jar-архивами в Java).
При запуске программы поиск модулей также идет в текущем каталоге. (Нужно внимательно называть собственные модули, чтобы не было конфликта имен со стандартными или дополнительно установленными модулями.)
Подключение модуля к программе на Python осуществляется с помощью оператора import
. У него есть две формы: import и from-import
: import os import pre as re from sys import argv, environ from string import *
С помощью первой формы с текущей областью видимости связывается только имя, ссылающееся на объект модуля, а при использовании второй - указанные имена
(или все имена, если применена
*
) объектов модуля связываются с текущей областью видимости. При импорте можно изменить имя, с которым объект будет связан, с помощью as
. В первом случае пространство имен модуля остается в отдельном имени и для доступа к конкретному имени из модуля нужно применять точку. Во втором случае имена используются так, как если бы они были определены в текущем модуле: os.system("dir") digits = re.compile("\d+") print argv[0], environ
Повторный импорт модуля происходит гораздо быстрее, так как модули кэшируются интерпретатором. Загруженный модуль можно загрузить еще раз
(например, если модуль изменился на диске) с помощью функции reload()
: import mymodule reload(mymodule)
Однако в этом случае все объекты, являющиеся экземплярами классов из старого варианта модуля, не изменят своего поведения.
При работе с модулями есть и другие тонкости. Например, сам процесс импорта модуля можно переопределить. Подробнее об этом можно узнать в оригинальной документации.
Встроенные функции
В среде Python без дополнительных операций импорта доступно более сотни встроенных объектов, в основном, функций и исключений. Для удобства функции условно разделены по категориям:

1. Функции преобразования типов и классы: coerce
, str
, repr
, int
, list
, tuple
, long
, float
, complex
, dict
, super
, file
, bool
, object
2. Числовые и строковые функции: abs
, divmod
, ord
, pow
, len
, chr
, unichr
, hex
, oct
, cmp
, round
, unicode
3. Функции обработки данных: apply
, map
, filter
, reduce
, zip
, range
, xrange
, max
, min
, iter
, enumerate
, sum
4. Функции определения свойств: hash
, id
, callable
, issubclass
, isinstance
, type
5. Функции для доступа к внутренним структурам: locals
, globals
, vars
, intern
, dir
6. Функции компиляции и исполнения: eval
, execfile
, reload
,
__import__
, compile
7. Функции ввода-вывода: input
, raw_input
, open
8. Функции для работы с атрибутами: getattr
, setattr
, delattr
, hasattr
9. Функции-"украшатели" методов классов: staticmethod
, classmethod
, property
10. Прочие функции: buffer
, slice
Совет:
Уточнить назначение функции, ее аргументов и результата можно в интерактивной сессии интерпретатора Python:
>>> help(len)
Help on built-in function len: len(...) len(object) -> integer
Return the number of items of a sequence or mapping.
Или так:
>>> print len.__doc__ len(object) -> integer
Return the number of items of a sequence or mapping.
Функции преобразования типов и классы
Функции и классы из этой категории служат для преобразования типов данных.
В старых версиях Python для преобразования к нужному типу использовалась одноименная функция. В новых версиях Python роль таких функций играют имена встроенных классов (однако семантика не изменилась). Для понимания сути достаточно небольшого примера:
>>> int(23.5)
23
>>> float('12.345')
12.345000000000001
>>> dict([('a', 2), ('b', 3)])
{'a': 2, 'b': 3}
>>> object

>>> class MyObject(object):
... pass


Числовые и строковые функции
Функции работают с числовыми или строковыми аргументами. В следующей таблице даны описания этих функций. abs(x)
Модуль числа x
. Результат:
|x|
divmod(x, y)
Частное и остаток от деления. Результат: (частное, остаток). pow(x, y[, m])
Возведение x
в степень y
по модулю m
. Результат: x**y % m round(n[, z])
Округление чисел до заданного знака после (или до) точки. ord(s)
Функция возвращает код (или Unicode) заданного ей символа в односимвольной строке. chr(n)
Возвращает строку с символом с заданным кодом. len(s)
Возвращает число элементов последовательности или отображения. oct(n)
, hex(n)
Функции возвращают строку с восьмеричным или шестнадцатеричным представлением целого числа n
cmp(x, y)
Сравнение двух значений. Результат: отрицательный, ноль или положительный, в зависимости от результата сравнения. unichr(n)
Возвращает односимвольную Unicode-строку с символом с кодом n
unicode(s
[, encoding[, errors]])
Создает Unicode-объект, соответствующий строке s
в заданной кодировке encoding. Ошибки кодирования обрабатываются в соответствии с errors, который может принимать значения:
'strict'
(строгое преобразование),
'replace'
(с заменой несуществующих символов) или 'ignore'
(игнорировать несуществующие символы). По умолчанию: encoding='utf-8'
, errors='strict'
Следующий пример строит таблицу кодировки кириллических букв в Unicode: print "Таблица Unicode (русские буквы)".center(18*4) i = 0 for c in "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"\
"абвгдежзийклмнопрстуфхцчшщъыьэюя": u = unicode(c, 'koi8-r') print "%3i: %1s %s" % (ord(u), c, `u`), i += 1 if i % 4 == 0: print
Функции обработки данных
Эти функции подробнее будут рассмотрены в лекции по функциональному программированию. Пример с функциями range()
и enumerate()
:
>>> for i, c in enumerate("ABC"):
... print i, c
0 A
1 B
2 C
>>> print range(4, 20, 2)
[4, 6, 8, 10, 12, 14, 16, 18]

Функции определения свойств
Эти функции обеспечивают доступ к некоторым встроенным атрибутам объектов и другим свойствам. Следующий пример показывает некоторые из этих функций:
>>> s = "abcde"
>>> s1 = "abcde"
>>> s2 = "ab" + "cde"
>>> print "hash:", hash(s), hash(s1), hash(s2) hash: -1332677140 -1332677140 -1332677140
>>> print "id:", id(s), id(s1), id(s2) id: 1076618592 1076618592 1076618656
Здесь, можно увидеть, что для одного и того же строкового литерала "abcde"
получается один и тот же объект, тогда как для одинаковых по значению объектов вполне можно получить разные объекты.
Функции для доступа к внутренним структурам
В современной реализации языка Python глобальные и локальные переменные доступны в виде словаря благодаря функциям globals()
и locals()
. Правда, записывать что-либо в эти словари не рекомендуется.
Функция vars()
возвращает таблицу локальных имен некоторого объекта (если параметр не задан, она возвращает то же, что и locals()
). Обычно используется в качестве словаря для операции форматирования: a = 1 b = 2 c = 3 print "%(a)s + %(b)s = %(c)s" % vars()
Функции компиляции и исполнения
Функция reload()
уже рассматривалась, а из остальных функций этой категории особого внимания заслуживает eval()
. Как следует из названия, эта функция вычисляет переданное ей выражение. В примере ниже вычисляется выражение, которое строится динамически: a = 2 b = 3 for op in "+-*/%": e = "a " + op + " b" print e, "->", eval(e)
У функции eval()
кроме подлежащего вычислению выражения есть еще два параметра - с их помощью можно задать глобальное и локальное пространства имен, из которых будут разрешаться имена выражения. Пример выше, переписанный для использования с собственным словарем имен в качестве глобального пространства имен: for op in "+-*/%": e = "a " + op + " b" print e, "->", eval(e, {'a': 2, 'b': 3})


Функцией eval()
легко злоупотребить. Нужно стараться использовать ее только тогда, когда без нее не обойтись. Из соображений безопасности не следует применять eval()
для аргумента, в котором присутствует непроверенный ввод от пользователя.
Функции ввода-вывода
Функции input()
и raw_input()
используются для ввода со стандартного ввода.
В серьезных программах их лучше не применять. Функция open()
служит для открытия файла по имени для чтения, записи или изменения. В следующем примере файл открывается для чтения: f = open("file.txt", "r", 1) for line in f: f.close()
Функция принимает три аргумента: имя файла (путь к файлу), режим открытия
(" r
" - чтение, " w
" - запись, " a
" - добавление или " w+
", " a+
", " r+
" - изменение.
Также может прибавляться " t
", что обозначает текстовый файл. Это имеет значение только на платформе Windows). Третий аргумент указывает режим буферизации:
0
- без буферизации,
1
- построчная буферизация, больше
1
- буфер указанного размера в байтах.
В новых версиях Python функция open()
является синонимом для file()
Функции для работы с атрибутами
У объектов в языке Python могут быть атрибуты (в терминологии языка C++ - члены-данные и члены-функции). Следующие две программы эквивалентны:
# первая программа: class A: pass a = A() a.attr = 1 try: print a.attr except: print None del a.attr
# вторая программа: class A: pass a = A() setattr(a, 'attr', 1) if hasattr(a, 'attr'): print getattr(a, 'attr') else: print None delattr(a, 'attr')
Функции-"украшатели" методов классов
Эти функции будут рассмотрены в лекции, посвященной ООП.

Обзор стандартной библиотеки
Модули стандартной библиотеки можно условно разбить на группы по тематике.
1. Сервисы периода выполнения. Модули: sys
, atexit
, copy
, traceback
, math
, cmath
, random
, time
, calendar
, datetime
, sets
, array
, struct
, itertools
, locale
, gettext
2. Поддержка цикла разработки. Модули: pdb
, hotshot
, profile
, unittest
, pydoc
Пакеты docutils
, distutils
3. Взаимодействие с ОС (файлы, процессы). Модули: os
, os.path
, getopt
, glob
, popen2
, shutil
, select
, signal
, stat
, tempfile
4. Обработка текстов. Модули: string
, re
,
StringIO
, codecs
, difflib
, mmap
, sgmllib
, htmllib
, htmlentitydefs
. Пакет xml
5. Многопоточные вычисления. Модули: threading
, thread
,
Queue
6. Хранение данных. Архивация. Модули: pickle
, shelve
, anydbm
, gdbm
, gzip
, zlib
, zipfile
, bz2
, csv
, tarfile
7. Платформо-зависимые модули. Для UNIX: commands
, pwd
, grp
, fcntl
, resource
, termios
, readline
, rlcompleter
. Для Windows: msvcrt
,
_winreg
, winsound
8. Поддержка сети. Протоколы Интернет. Модули: cgi
,
Cookie
, urllib
, urlparse
, httplib
, smtplib
, poplib
, telnetlib
, socket
, asyncore
. Примеры серверов:
SocketServer
,
BaseHTTPServer
, xmlrpclib
, asynchat
9. Поддержка Internet. Форматы данных. Модули: quopri
, uu
, base64
, binhex
, binascii
, rfc822
, mimetools
,
MimeWriter
, multifile
, mailbox
. Пакет email
10. Python о себе. Модули: parser
, symbol
, token
, keyword
, inspect
, tokenize
, pyclbr
, py_compile
, compileall
, dis
, compiler
11. Графический интерфейс. Модуль
Tkinter
Примечание:
Очень часто модули содержат один или несколько классов, с помощью которых создается объект нужного типа, а затем речь идет уже не об именах из модуля, а об атрибутах этого объекта. И наоборот, некоторые модули содержат лишь функции, достаточно общие для того, чтобы работать над произвольными объектами (либо достаточно большой категорией объектов).
Сервисы периода выполнения
Модуль sys
Модуль sys содержит информацию о среде выполнения программы, об интерпретаторе Python. Далее будут представлены наиболее популярные объекты из этого модуля: остальное можно изучить по документации. exit([c])
Выход из программы. Можно передать числовой код завершения:
0
в случае успешного завершения, другие числа при аварийном завершении программы. argv
Список аргументов командной строки. Обычно sys.argv[0]
содержит имя запущенной программы, а остальные параметры передаются из командной строки. platform
Платформа, на которой работает интерпретатор. stdin, stdout, stderr
Стандартный ввод, вывод, вывод ошибок. Открытые файловые объекты.

version
Версия интерпретатора. setrecursionlimit(limit)
Установка уровня максимальной вложенности рекурсивных вызовов. exc_info()
Информация об обрабатываемом исключении.
Модуль copy
Этот модуль содержит функции для копирования объектов. Вначале предлагается к рассмотрению "парадокс", который вводит в замешательство новичков в
Python: lst1 = [0, 0, 0] lst = [lst1] * 3 print lst lst[0][1] = 1 print lst
В результате получается, возможно, не то, что ожидалось:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
Дело в том, что список lst содержит ссылки на один и тот же список! Для того чтобы действительно размножить список, необходимо применить функцию copy()
из модуля copy
: from copy import copy lst1 = [0, 0, 0] lst = [copy(lst1) for i in range(3)] print lst lst[0][1] = 1 print lst
Теперь результат тот, который ожидался:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 1, 0], [0, 0, 0], [0, 0, 0]]
В модуле copy есть еще и функция deepcopy()
для глубокого копирования, при которой объекты копируются на всю возможную глубину, рекурсивно.
Модули math и cmath
В этих модулях собраны математические функции для действительных и комплексных аргументов. Это те же функции, что используются в языке C. В таблице ниже даны функции модуля math. Там, где аргумент обозначен буквой z, аналогичная функция определена и в модуле cmath.
Функция или
константа
Описание
acos(z)
арккосинус z
asin(z)
арксинус z
atan(z)
арктангенс z
atan2(y,x)
atan(y/x)
ceil(x)
наименьшее целое, большее или равное x
cos(z)
косинус z
cosh(x)
гиперболический косинус x
e константа e
exp(z)
экспонента (то есть, e**z
) fabs(x)
абсолютное значение x
floor(x)
наибольшее целое, меньшее или равное x
fmod(x,y)
остаток от деления x
на y
frexp(x)
возвращает мантиссу и порядок x
как пару
(m, i)
, где m
- число с плавающей точкой, а i
- целое, такое, что x = m * 2.**i
. Если
0
, возвращает
(0,0)
, иначе
0.5 <= abs(m) < 1.0
hypot(x,y)
sqrt(x*x + y*y)
ldexp(m,i)
m * (2**i)
log(z)
натуральный логарифм z
log10(z)
десятичный логарифм z
modf(x)
возвращает пару
(y,q)
- целую и дробную часть x
. Обе части имеют знак исходного числа pi константа пи pow(x,y)
x**y sin(z)
синус z
sinh(z)
гиперболический синус z
sqrt(z)
корень квадратный от z
tan(z)
тангенс z
tanh(z)
гиперболический тангенс z
Модуль random
Этот модуль генерирует псевдослучайные числа для нескольких различных распределений. Наиболее используемые функции: random()
Генерирует псевдослучайное число из полуоткрытого диапазона
[0.0, 1.0)
choice(s)
Выбирает случайный элемент из последовательности s
shuffle(s)
Размешивает элементы изменчивой последовательности s
на месте. randrange([start,] stop[, step])
Выдает случайное целое число из диапазона range(start, stop, step)
. Аналогично choice(range(start, stop, step)
). normalvariate(mu, sigma)
Выдает число из последовательности нормально распределенных псевдослучайных чисел. Здесь mu
- среднее, sigma
- среднеквадратическое отклонение
(sigma > 0)
Остальные функции и их параметры можно уточнить по документации. Следует отметить, что в модуле есть функция seed(n)
, которая позволяет установить генератор случайных чисел в некоторое состояние. Например, если возникнет необходимость многократного использования одной и той же последовательности псевдослучайных чисел.