Что нового в Python 2.3. Орехов А.И.
Введение.
Приближается выход новой, стабильной версии Python 2.3. Одни ждут этого с нетерпением. Другие привыкли к текущей, ведь многие программисты весьма консервативны. Попробуем рассмотреть — что новое несет в себе версия 2.3. Насколько сильны отличия.
Хорошая черта Python — совместимость. То что написано для Python 2.2 должно нормально работать и в новой версии. Но, как мы скоро увидим, программирование становится значительно более гибким благодаря новым встроенным функциям и типам. Затронули изменения и стандартные библиотеки.
Интерпретатор стал быстрее. Скорость работы программ может возрасти на 10–20%. На некоторых операциях, например на целочисленном умножении, скорость возрастает почти в два раза (по сравнению с Python 2.2).
Улучшения языка.
Без сомнения, больше всего вызывают интерес новые возможности, встроенные в сам интерпретатор. А также, средства характерные для Python, как для языка программирования.
Несколько расширены возможности создания срезов. Введен дополнительный параметр, задающий шаг. Как видно из примера, можно получить срез строки с нужным интервалом между символами. Причем шаг может быть отрицательным — автоматически получаем результат в обратном порядке.
>>> print 'Привет мир'[::2] Пие и >>> print 'Привет мир'[::-2] рмтвр
Добавлен новый тип данных basestring. От него наследуются и обычные строки, и UNICODE.
slice и buffer стали типами.
В язык введен новый тип — логический bool. True / False. До этого приходилось применять в логических отношениях 1 / 0 или Ellipsis / None. (Более того — None не рекомендуется использовать вообще. Это ключевое слово может исчезнуть в последующих версиях интерпретатора.) bool() по умолчанию имеет значение False.
Посмотрите, как теперь работает in. Python 2.2:
>>> print "П" in "Привет мир" 1Python 2.3:
>>> print "П" in "Привет мир" TrueПричем,
in теперь может работать и с подстроками:
>>> print "вет" in "Привет мир" TrueРаньше это вызвало бы исключение:
>>> print "вет" in "Привет мир" Traceback (most recent call last): File "", line 1, in ? TypeError: 'in ' requires character as left operand
Так как этот оператор работал только с одиночными элементами последовательности, в Python 2.2:
>>> print "в" in "Привет мир" 1
Добавлен новый режим открытия текстовых файлов U — универсальный readlines. В этом режиме любые окончания строк ('\r', '\n', '\r\n') переводятся в '\n'.
Встроенная функция filter() будет всегда возвращать UNICODE, если на входе данные в формате UNICODE.
Появились новые способы создания словарей:
>>> x = dict(a=23, b=45, c=67, d=89) >>> x {'a': 23, 'c': 67, 'b': 45, 'd': 89} >>> y = dict.fromkeys(range(4), 'ho') >>> y {0: 'ho', 1: 'ho', 2: 'ho', 3: 'ho'}
Также метод pop для словарей, подобно тому, как это было в списках:
>>> x.pop('c') 67 >>> x {'a': 23, 'b': 45, 'd': 89}
Обратите внимание:
>>> x.pop('z') Traceback (most recent call last): File "", line 1, in ? KeyError: 'z' >>> x.pop('z', 55) 55
Т.е. можно задать значение по умолчанию (похоже на метод get). Если ключ в словаре не найден, будет использовано это значение.
compile(), eval(), exec теперь полностью поддерживают UNICODE.
Целые числа типа int автоматически будут преобразованы в бесконечное целое long при переполнении. Соответствующее исключение для целых чисел больше возникать не будет. Это касается и встроенных функций. Например range:
>>> range(2**100, 2**101, 2**100) [1267650600228229401496703205376L]
raw_input() может возвращать строки UNICODE, если позволяют средства операционной системы.
Очень интересное нововведение касается импорта (import). Теперь эта команда работает с архивированными файлами в формате ZIP. Программы на Python и так выгодно отличались от многих других языков своей компактностью. Даже крупные программные комплексы на Python будут занимать немного места на жестком диске. Обеспечивает эту возможность модуль zipimport, который вызывается автоматически.
Кстати, разработчики Python рекомендуют первой или второй строкой в программе ставить комментарий вида: # -*- Кодировка Файла -*-. Например # -*- KOI8-R -*-. Благодаря этому может применяться удобная форма записи UNICODE строк, содержащих русские символы: u"Привет".
Новые встроенные функции.
Встроенные функции — важнейшая составляющая любого языка программирования. Они определяют мощь и слабость той или иной системы. Что же нам предлагают разработчики Python 2.3.
Новая встроенная функция enumerate создает список кортежей (индекс, значение) из обычного списка:
>>> for x in enumerate('ciao'): print x ... (0, 'c') (1, 'i') (2, 'a') (3, 'o')
Поддерживаются объекты-сущности, тип которых не совпадает с классом. Для различения этих понятий введены функции: isinstance(), super().
Наконец-то появилась функция суммирования чисел sum(seq, start). Аналогично reduce(operator.add, seq, start), но работает быстрее. В одном обзоре по функциональным языкам программирования был забавный пример, где для суммирования в Python пришлось написать функцию. В других же языках программа смотрелась намного красивее, благодаря встроенной sum().
Изменения в библиотеках.
Многие улучшения прозрачны для программиста. Сделано много доработок в уже существовавших модулях.
Использован новый генератор псевдослучайных чисел — "Mersenne Twister" (модуль random). В модуле pickle применен более эффективный протокол, а bsddb поддерживает современную версию Sleepycat Berkeley DB.
Полезные дополнения для sys: sys.getfilesystemencoding() возвращает кодировку файловой системы, sys.exc_clear() — сбрасывает текущее исключение
Немного о грустном. Система безопасного выполнения программ Python (модули rexec и Bastion) была признана слабой. Соответствующие модули удалены из стандартных библиотек. Заметим, что проблема безопасного выполнения программ не является бедой одного Python. Давно взломана защита Java. Пожалуй, нет ни одного распространенного языка программирования, который мог бы похвастаться надежной "клеткой" для сомнительных программ. Лучше прибегнуть к средствам разграничения прав операционной системы. Во всяком случае, работы по созданию новой концепции безопасности для Python ведутся.
imaplib теперь поддерживает SSL.
Новые модули стандартных библиотек.
Для Python очень характерен сильный акцент на стандартные библиотеки. Они настолько удачны, что воспринимаются, как неотъемлемая часть языка. Рассмотрим некоторые модули, появившиеся в версии 2.3.
Новый модуль для работы с архивированной информацией — bz2. Использует библиотеку bzip2.
Для анализа аргументов командной строки создан модуль optparse. Он более мощный, чем getopt.
Для вычислений, связанных с календарем, датами и т.п. удобно применять datetime. К примеру, для вычисления количества дней между двумя датами, достаточно написать:
>>> from datetime import date >>> print date(2003,3,23)-date(2002,10,1) 173 days, 0:00:00
heapq содержит средства, позволяющие использовать список, как приоритетную очередь. Для примера, рассмотрим следующий исходный текст:
from heapq import heappush, heappop
class PriorityQueue(object):
def __init__(self):
self.q = []
def __len__(self):
return len(self.q)
def arrival(self, cost, item):
heappush(self.q, (cost, item))
def departure(self):
cost, item = heappop(self.q)
return item
Функция arrival добавляет элемент с соответствующем весом cost в приоритетную очередь. Метод departure возвращает (и удаляет из очереди) элемент с наименьшим весом.
itertools — библиотека для работы с итераторами. Используя ее, можно легко выполнять операции над итераторами. Вот так можно эмулировать встроенный тип enumerate:
import itertools
def enumerate(sequence):
return itertools.izip(itertools.icount(), sequence)
Модуль sets содержит новый тип данных — множество set. Соответствует математическому понятию. Пример — получим пересечение двух строк (символы, представленные в обеих строках):
>>> import sets >>> ''.join(sets.Set('ciao there!') & sets.Set('hello!')) '!heo'
Необходимо отметить, что множества set — неупорядочены. Результат может выдаваться в произвольном порядке.
csv — возможность читать и записывать файлы в формате с разделителем.
timeit — скорость фрагментов кода.
platform — информация о среде выполнения программы.
DocXMLRPCServer — сервер документации в формате XML.
ossaudiodev — интерфейс к Open Sound System. Это стандартный программный интерфейс для Linux и некоторых BSD систем.
textwrap — форматирование параграфов текста.
Заключение.
Многие улучшения носят локальный характер и незаметны сами по себе. Но, как мы рассмотрели, есть и достаточно крупные нововведения. Программирование на Python становится более гибким, а программы компактнее и быстрее. Замечательная черта языка заключается в том, что гибкость и большие выразительные возможности сочетаются с простотой.
Автор: Орехов Антон Игоревич (Quiet) i-quiet@narod.ru. Ведущий специалист АСУ ФГУП РИТМ.
