Меню сайта
Статистика
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
Лекция 2.Содержание
Одним из важных преимуществ языка 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 без дополнительных операций импорта доступно более сотни встроенных объектов, в основном, функций и исключений. Для удобства функции условно разделены по категориям:
Функции преобразования типов и классыФункции и классы из этой категории служат для преобразования типов данных. В старых версиях Python для преобразования к нужному типу использовалась одноименная функция. В новых версиях Python роль таких функций играют имена встроенных классов (однако семантика не изменилась). Для понимания сути достаточно небольшого примера: >>> int(23.5) 23 >>> float('12.345') 12.345000000000001 >>> dict([('a', 2), ('b', 3)]) {'a': 2, 'b': 3} >>> object <type 'object'> >>> class MyObject(object): ... pass ... Числовые и строковые функцииФункции работают с числовыми или строковыми аргументами. В следующей таблице даны описания этих функций.
Следующий пример строит таблицу кодировки кириллических букв в 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') Функции-"украшатели" методов классовЭти функции будут рассмотрены в лекции, посвященной ООП. Обзор стандартной библиотекиМодули стандартной библиотеки можно условно разбить на группы по тематике.
Сервисы периода выполненияМодуль sysМодуль sys содержит информацию о среде выполнения программы, об интерпретаторе Python. Далее будут представлены наиболее популярные объекты из этого модуля: остальное можно изучить по документации.
Модуль 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.
Модуль randomЭтот модуль генерирует псевдослучайные числа для нескольких различных распределений. Наиболее используемые функции:
Остальные функции и их параметры можно уточнить по документации. Следует отметить, что в модуле есть функция seed(n), которая позволяет установить генератор случайных чисел в некоторое состояние. Например, если возникнет необходимость многократного использования одной и той же последовательности псевдослучайных чисел. Модуль timeЭтот модуль дает функции для получения текущего времени и преобразования форматов времени. Модуль setsМодуль реализует тип данных для множеств. Следующий пример показывает, как использовать этот модуль. Следует заметить, что в Python 2.4 и старше тип set стал встроенным, и вместо sets.Set можно использовать set: import sets A = sets.Set([1, 2, 3]) B = sets.Set([2, 3, 4]) print A | B, A & B, A - B, A ^ B for i in A: if i in B: print i, В результате будет выведено: Set([1, 2, 3, 4]) Set([2, 3]) Set([1]) Set([1, 4]) 2 3 Модули array и structЭти модули реализуют низкоуровневый массив и структуру данных. Основное их назначение - разбор двоичных форматов данных. Модуль itertoolsЭтот модуль содержит набор функций для работы с итераторами. Итераторы позволяют работать с данными последовательно, как если бы они получались в цикле. Альтернативный подход - использование списков для хранения промежуточных результатов - требует подчас большого количества памяти, тогда как использование итераторов позволяет получать значения на момент, когда они действительно требуются для дальнейших вычислений. Итераторы будут рассмотрены более подробно в лекции по функциональному программированию. Модуль localeМодуль locale применяется для работы с культурной средой. В конкретной культурной среде могут использоваться свои правила для написания чисел, валют, времени и даты и т.п. Следующий пример выводит дату сначала в культурной среде "C", а затем на русском языке: import time, locale locale.setlocale(locale.LC_ALL, None) print time.strftime("%d %B %Y", time.localtime (time.time())) locale.setlocale(locale.LC_ALL, "ru_RU.KOI8-R") print time.strftime("%d %B %Y", time.localtime (time.time())) В результате: 18 November 2004 18 Ноября 2004 Модуль gettextПри интернационализации программы важно не только предусмотреть возможность использования нескольких культурных сред, но и перевод сообщений и меню программы на соответствующий язык. Модуль gettext позволяет упростить этот процесс достаточно стандартным способом. Основные сообщения программы пишутся на английском языке. А переводы строк, отмеченных в программе специальным образом, даются в виде отдельных файлов, по одному на каждый язык (или культурную среду). Уточнить нюансы использования gettext можно по документации к Python. |
Поиск
Друзья сайта
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||