... 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.
3. Обработка текстов. Модули: string, re, StringIO, codecs, difflib, mmap, sgmllib, htmllib, htmlentitydefs. Пакет xml.
3. Многопоточные вычисления. Модули: threading, thread, Queue.
4. Хранение данных. Архивация. Модули: pickle, shelve, anydbm, gdbm, gzip, zlib, zipfile, bz2, csv, tarfile.
5. Платформо–зависимые модули. Для UNIX: commands, pwd, grp, fcntl, resource, termios, readline, rlcompleter. Для Windows: msvcrt, _winreg, winsound.
6. Поддержка сети. Протоколы Интернет. Модули: cgi, Cookie, urllib, urlparse, httplib, smtplib, poplib, telnetlib, socket, asyncore. Примеры серверов: SocketServer, BaseHTTPServer, xmlrpclib, asynchat.
7. Поддержка Internet. Форматы данных. Модули: quopri, uu, base64, binhex, binascii, rfc822, mimetools, MimeWriter, multifile, mailbox. Пакет email.
8. Python о себе. Модули: parser, symbol, token, keyword, inspect, tokenize, pyclbr, py_compile, compileall, dis, compiler.
9. Графический интерфейс. Модуль Tkinter.
Очень часто модули содержат один или несколько классов, с помощью которых создается объект нужного типа, а затем речь идет уже не об именах из модуля, а об атрибутах этого объекта. И наоборот, некоторые модули содержат лишь функции, слишком общие для того, чтобы работать над произвольными объектами (либо достаточно большой категорией объектов).
Сервисы периода выполнения
Модуль sys содержит информацию о среде выполнения программы, об интерпретаторе Python. Далее будут представлены наиболее популярные объекты из этого модуля: остальное можно изучить по документации.
exit([c]) | Выход из программы. Можно передать числовой код завершения: 0 в случае успешного завершения, другие числа при аварийном завершении программы. |
argv | Список аргументов командной строки. Обычно sys.argv[0] содержит имя запущенной программы, а остальные параметры передаются из командной строки. |
platform | Платформа, на которой работает интерпретатор. |
stdin, stdout, stderr | Стандартный ввод, вывод, вывод ошибок. Открытые файловые объекты. |
version | Версия интерпретатора. |
setrecursionlimit(limit) | Установка уровня максимальной вложенности рекурсивных вызовов. |
exc_info() | Информация об обрабатываемом исключении. |
Этот модуль содержит функции для копирования объектов. Вначале предлагается к рассмотрению «парадокс», который вводит в замешательство новичков в 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]