справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
partial(function [, *args [, **kwargs]]) Создает объект типа partial, напоминающий функцию, который при вы- зове обращается к функции function и передает ей позиционные аргумен- ты args, именованные аргументы kwargs, а также любые дополнительные позиционные и именованные аргументы, переданные объекту при его вы- зове. Дополнительные позиционные аргументы добавляются в конец args, а дополнительные именованные аргументы добавляются в словарь kwargs, затирая ранее определенные значения с теми же ключами (если таковые имеются). Обычно функция partial() используется, когда требуется много- кратно вызвать одну и ту же функцию, большая часть аргументов которой остаются неизменными. Например: from functools import partial mybutton = partial(Button, root, fg=”black”,bg=”white”,font=”times”,size=”12”) b1 = mybutton(text=”Ok”) # Вызовет Button() с аргументами text=”Ok” b2 = mybutton(text=”Cancel”) # и остальными, которые были переданы функции b3 = mybutton(text=”Restart”)# partial() выше Экземпляр p объекта, созданного функцией partial(), имеет следующие атрибуты: Атрибут Описание p.func Функция, которая вызывается при вызове объекта p. p.args Кортеж, содержащий первые позиционные аргументы, которые передаются функции p.func при вызове. Дополнительные позици- онные аргументы добавляются в конец этого значения. p.keywords Словарь, содержащий именованные аргументы, которые переда- ются функции p.func при вызове. Дополнительные именованные аргументы добавляются в этот словарь. Будьте внимательны при использовании объектов типа partial в качестве замены обычным функциям. Результат, возвращаемый объектом, будет отличаться от того, что возвращается обычной функцией. Например, если функцию partial() использовать внутри определения класса, полученный объект будет вести себя, как статический метод, а не как метод экземпляра. reduce(function, items [, initial]) Применяет функцию function к элементам в итерируемом объекте items и возвращает единственное значение. Функция function должна принимать два аргумента, и при первом вызове ей передаются два первых элемента из объекта items. Затем она будет получать этот результат и все последую- щие элементы по очереди, пока не будут исчерпаны все элементы в объекте items . В необязательном аргументе initial передается начальное значение, которое будет использоваться при первом вызове функции function, а так- же в случае пустого объекта items. Эта функция является полным анало- гом функции reduce(), которая в Python 2 была встроенной функцией. Для сохранения совместимости с будущими версиями интерпретатора исполь- зуйте функцию из модуля functools. Модуль heapq 341 update_wrapper(wrapper, wrapped [, assigned [, updated]]) Э ту вспомогательную функцию удобно использовать при создании декора- торов. Она копирует атрибуты функции wrapped в функцию-обертку wrapper, делая ее похожей на оригинальную функцию. В аргументе assigned пере- дается кортеж с именами атрибутов для копирования, который по умолча- нию имеет значение (‘__name__’,’__module__’,’__doc__’). В аргументе updated передается кортеж с именами атрибутов функции, являющихся словаря- ми, значения из которых должны быть добавлены в функцию-обертку. По умолчанию является кортежем (‘__dict__’,). wraps(function [, assigned [, updated ]]) Декоратор, который выполняет ту же задачу, что и декоратор update_wrap- per() . Аргументы assigned и updated имеют такое же назначение. Обычно этот декоратор используется при создании других декораторов. Например: from functools import wraps def debug(func): @wraps(func) def wrapped(*args,**kwargs): print(“Вызывается %s” % func.__name__) r = func(*args,**kwargs) print(“Выполнен вызов %s” % func.__name__) return wrapped ёё @debug def add(x,y): return x+y См. также Глава 6 «Функции и функциональное программирование». Модуль heapq Модуль heapq реализует очереди с приоритетами, используя алгоритмы ра- боты с «кучами». Куча – это простой список упорядоченных элементов, для которого выполняются условия, свойственные куче. В частности, heap[n] <= heap[2*n+1] и heap[n] <= heap[2*n+2] для всех n, начиная с n = 0. Элемент heap[0] всегда содержит наименьший элемент. heapify(x) Преобразует список x в кучу. heappop(heap) Удаляет и возвращает наименьший элемент из кучи heap с соблюдением условий, предъявляемых к кучам. Возбуждает исключение IndexError, если куча heap не содержит элементов. heappush(heap, item) Добавляет элемент item в кучу с соблюдением условий, предъявляемых к кучам. 342 Глава 15. Структуры данных, алгоритмы и упрощение программного кода heappushpop(heap, item) Добавляет элемент item в кучу и одновременно удаляет наименьший эле- мент кучи. Это более эффективный способ, чем последовательность вызо- вов heappush() и heappop(). heapreplace(heap, item) Удаляет и возвращает наименьший элемент из кучи heap. Одновременно добавляет новый элемент item. Операция выполняется с соблюдением усло- вий, предъявляемых к кучам. Это более эффективный способ, чем после- довательность вызовов heappop() и heappush(). Кроме того, возвращаемое значение извлекается из кучи до того, как будет добавлен новый элемент. Поэтому возвращаемое значение может оказаться больше значения item. Возбуждает исключение IndexError, если куча heap не содержит элементов. merge(s1, s2, ...) Создает итератор, объединяющий отсортированные итерируемые объекты s1 , s2 и так далее в одну отсортированную последовательность. Эта функ- ция не выполняет обход объектов, полученных в виде аргументов, а возвра- щает итератор, который выполняет последовательную обработку данных. nlargest(n, iterable [, key]) Создает список, содержащий n наибольших элементов в итерируемом объ- екте items. Первым в возвращаемом списке будет стоять наибольший эле- мент. В необязательном аргументе key передается функция, принимаю- щая единственный аргумент и вычисляющая ключ для каждого элемента в объекте iterable, который будет использоваться в операции сравнивания. nsmallest(n, iterable [, key]) Создает список, содержащий n наименьших элементов в итерируемом объ- екте items. Первым в возвращаемом списке будет стоять наименьший эле- мент. В необязательном аргументе key передается функция, принимающая единственный аргумент и вычисляющая ключ. Примечание Теоретическое обоснование и примеры реализации очередей с приоритетами можно найти во многих книгах, посвященных алгоритмам. Модуль itertools Модуль itertools содержит функции, создающие эффективные итераторы, которые позволяют выполнять итерации по данным различными способа- ми. Все функции в этом модуле возвращают итераторы, которые можно ис- пользовать в инструкции for и в других функциях, где применяются ите- раторы, например в функциях-генераторах и в выражениях-генераторах. chain(iter1, iter2, ..., iterN) На основе группы итераторов (iter1,... , iterN) создает новый итератор, объединяющий все итераторы воедино. Возвращаемый итератор воспроиз- Модуль itertools 343 водит элементы из объекта iter1 до их исчерпания. Затем воспроизводятся элементы из объекта iter2. Этот процесс продолжается, пока не будут ис- черпаны все элементы в iterN. chain.from_iterable(iterables) Альтернативный конструктор создания цепочки итерируемых объектов, где в аргументе iterables передается итерируемый объект, возвращающий последовательность итерируемых объектов. Эта операция возвращает тот же результат, который дает следующий фрагмент генератора: for it in iterables: for x in it: yield x combinations(iterable, r) Создает итератор, который возвращает все возможные последовательности из r элементов, взятых из итерируемого объекта iterable. Элементы в воз- вращаемых последовательностях располагаются в том же порядке, в ка- ком они встречаются в исходном объекте iterable. Например, если в аргу- менте iterable передать список [1,2,3,4], то вызов combinations([1,2,3,4], 2) воспроизведет последовательность [1,2], [1,3], [1,4], [2,3], [3,4]. count([n]) Создает итератор, который воспроизводит упорядоченную и непрерывную последовательность целых чисел, начиная с n. Если аргумент n опущен, в качестве первого значения возвращается число 0. (Обратите внимание, что этот итератор не поддерживает длинные целые числа. По достижении значения sys.maxint счетчик переполнится и итератор продолжит воспро- изводить значения, начиная с -sys.maxint - 1.) cycle(iterable) Создает итератор, который в цикле многократно выполняет обход элемен- тов в объекте iterable. За кулисами создает копию элементов в объекте iterable . Эта копия затем используется для многократного обхода элемен- тов в цикле. dropwhile(predicate, iterable) Создает итератор, который отклоняет элементы из объекта iterable, пока функция predicate(item) возвращает значение True. Как только функция predicate вернет False, итератор воспроизведет этот элемент и все последую- щие элементы в итерируемом объекте iterable. groupby(iterable [, key]) Создает итератор, который группирует одинаковые элементы из итериру- емого объекта iterable, следующие друг за другом. Процесс группировки основан на поиске одинаковых элементов. Например, если итерируемый объект iterable возвращает один и тот же элемент несколько раз подряд, этот элемент образует группу. Если функция применяется к отсортиро- ванному списку, она образует группы по числу уникальных элементов в списке. В необязательном аргументе key может передаваться функция, которая будет применяться к каждому элементу; в этом случае в сравнива- 344 Глава 15. Структуры данных, алгоритмы и упрощение программного кода нии соседних элементов участвуют возвращаемые значения этой функции, а не значения самих элементов. Итератор, возвращаемый функцией, вос- производит кортежи (key, group), где элемент key – это значение ключа для группы, а элемент group – это итератор, который возвращает все элементы, попавшие в группу. ifilter(predicate, iterable) Создает итератор, который воспроизводит только те элементы из объекта iterable , для которых функция predicate(item) возвращает True. Если в аргу- менте predicate передать None, все элементы в объекте iterable будут оцени- ваться как True и будут возвращаться итератором. ifilterfalse(predicate, iterable) Создает итератор, который воспроизводит только те элементы из объекта iterable , для которых функция predicate(item) возвращает False. Если в ар- гументе predicate передать None, все элементы в объекте iterable будут оце- ниваться как False и будут возвращаться итератором. imap(function, iter1, iter2, ..., iterN) Создает итератор, который воспроизводит элементы function(i1,i2, ... iN), где i1, i2,..., iN – это элементы, полученные из итераторов iter1, iter2, ..., iterN соответственно. Если в аргументе function передать None, функция imap() вернет кортежи вида (i1, i2, ..., iN). Итерации прекращаются, ког- да один из указанных итераторов прекращает воспроизводить значения. islice(iterable, [start,] stop [, step]) Создает итератор, воспроизводящий элементы, которые вернула бы опера- ция извлечения среза iterable[start:stop:step]. Первые start элементов про- пускаются и итерации прекращаются по достижении позиции, указанной в аргументе stop. В необязательном аргументе step передается шаг выборки элементов. В отличие от срезов, в аргументах start, stop и step не допуска- ется использовать отрицательные значения. Если аргумент start опущен, итерации начинаются с 0. Если аргумент step опущен, по умолчанию ис- пользуется шаг 1. izip(iter1, iter2, ... iterN) Создает итератор, который воспроизводит кортежи (i1, i2, ..., iN), где зна- чения i1, i2, ..., iN извлекаются из итераторов iter1, iter2, ..., iterN соответ- ственно. Итерации останавливаются, когда какой-либо из исходных ите- раторов прекращает возвращать значения. Итератор, возвращаемый этой функцией, воспроизводит те же значения, что и встроенная функция zip(). izip_longest(iter1, iter2, ..., iterN [,fillvalue=None]) То же, что и функция izip(), за исключением того, что возвращаемый ите- ратор продолжает итерации, пока не будут исчерпаны все значения, вос- производимые итераторами iter1, iter2 и так далее. В качестве недостаю- щих значений для итераторов, которые оказались исчерпаны раньше всех, используется None, если не было указано иное значение в именованном ар- гументе fillvalue. Модуль itertools 345 permutations(iterable [, r]) Создает итератор, который возвращает все возможные перестановки из r элементов, взятых из итерируемого объекта iterable. Если аргумент r опу- щен, перестановки будут содержать то же количество элементов, что и в исходном объекте iterable. product(iter1, iter2, ... iterN, [repeat=1]) Создает итератор, который воспроизводит кортежи, представляющие де- картово произведение элементов из iter1, iter2 и так далее. Необязатель- ный именованный аргумент repeat определяет количество повторений вос- произведенной последовательности. repeat(object [, times]) Создает итератор, который многократно воспроизводит объект object. В не- обязательном аргументе times передается количество повторений. Если этот аргумент не задан, количество повторений будет бесконечным. starmap(func, iterable) Создает итератор, который воспроизводит значения func(*item), где значе- ние item извлекается из итерируемого объекта iterable. Может действовать, только если объект iterable возвращает элементы, пригодные для исполь- зования в вызове функции таким способом. takewhile(predicate, iterable) Создает итератор, который воспроизводит элементы из итерируемого объ- екта iterable, пока функция predicate(item) возвращает True. Итерации пре- кращаются, как только функция predicate вернет False. tee(iterable [, n]) Создает n независимых итераторов из итерируемого объекта iterable. Соз- данные итераторы возвращаются в виде кортежа из n элементов. По умол- элементов. По умол- . По умол- По умол- чанию аргумент n имеет значение 2. Эта функция может принимать любые итерируемые объекты. При этом, когда оригинальный итератор клониру- объекты. При этом, когда оригинальный итератор клониру- объекты. При этом, когда оригинальный итератор клониру- . При этом, когда оригинальный итератор клониру- При этом, когда оригинальный итератор клониру- ется, в кэше сохраняется его копия, которая используется во всех далее создаваемых итераторах. Будьте очень внимательны и не используйте ори- гинальный итератор iterable после вызова функции tee(). В противном слу- чае механизм кэширования будет работать некорректно. Примеры Следующие примеры демонстрируют, как действуют некоторые функции из модуля itertools: from itertools import * # Выполнить обход последовательности чисел 0,1,...,10,9,8,...,1 # в бесконечном цикле for i in cycle(chain(range(10),range(10,0,-1))): print i ёё # Создать список уникальных элементов в объекте a a = [1,4,5,4,9,1,2,3,4,5,1] 346 Глава 15. Структуры данных, алгоритмы и упрощение программного кода a.sort() b = [k for k,g in groupby(a)] # b = [1,2,3,4,5,9] ёё # Выполнить обход всех возможных пар значений из объектов x и y x = [1,2,3,4,5] y = [10,11,12] for r in product(x,y): print(r) # Выведет (1,10),(1,11),(1,12), ... (5,10),(5,11),(5,12) Модуль operator М одуль operator содержит функции, обеспечивающие доступ к встроен- ным операторам и специальным методам интерпретатора, которые опи- сываются в главе 3 «Типы данных и объекты». Например, вызов функции add(3, 4) – это аналог операции 3 + 4. Для операций, имеющих версии, ко- торые изменяют сами операнды, можно использовать такие функции как iadd(x,y) , которая является аналогом операции x += y. В следующем списке перечислены функции, содержащиеся в модуле operator, и их аналоги сре- ди операторов: Функция Описание add( a, b) Возвращает результат выражения a + b для чисел sub( a, b) Возвращает результат выражения a - b mul( a, b) Возвращает результат выражения a * b для чисел div( a, b) Возвращает результат выражения a / b (старая версия) floordiv( a, b) Возвращает результат выражения a // b truediv( a, b) Возвращает результат выражения a / b (новая версия) mod( a, b) Возвращает результат выражения a % b neg( a) Возвращает –a pos( a) Возвращает +a abs( a) Возвращает абсолютное значение a inv( a), invert(a) Возвращает инвертированное значение a lshift( a, b) Возвращает результат выражения a << b rshift( a, b) Возвращает результат выражения a >> b and_( a, b) Возвращает результат выражения a & b (битовое И) or_( a, b) Возвращает результат выражения a | b (битовое ИЛИ) xor( a, b) Возвращает результат выражения a ^ b (битовое ИСКЛЮ- ЧАЮЩЕЕ ИЛИ) not_( a) Возвращает результат выражения not a lt( a, b) Возвращает результат проверки a < b le( a, b) Возвращает результат проверки a <= b Модуль operator 347 eq( a, b) Возвращает результат проверки a == b ne( a, b) Возвращает результат проверки a != b gt(a, b) Возвращает результат проверки a > b ge( a, b) Возвращает результат проверки a >= b truth( a) Возвращает True, если значение a является истинным, и False – в противном случае concat( a, b) Возвращает результат выражения a + b для последователь- ностей repeat(a, b) Возвращает результат выражения a * b для последователь- ности a и целого числа b contains( a, b) Возвращает результат выражения a in b countOf( a, b) Возвращает количество вхождений b в a indexOf( a, b) Возвращает индекс первого вхождения b в a getitem( a, b) Возвращает a[b] setitem( a, b, c) Выполняет операцию a[b] = c delitem( a, b) Выполняет операцию del a[b] getslice( a, b, c) Возвращает срез a[b:c] setslice(a, b, c, v) Выполняет операцию a[b:c] = v delslice( a, b, c) Выполняет операцию del a[b:c] is_( a, b) Возвращает результат выражения a is b is_not( a, b) Возвращает результат выражения a is not b На первый взгляд кажется непонятным, кому может прийти в голову ис- пользовать эти функции, если операции, которые они выполняют, проще запрограммировать, применяя обычный синтаксис операторов. Тем не ме- нее эти функции могут пригодиться везде, где используются функции об- ратного вызова, или там, где в противном случае пришлось бы создавать анонимные функции с помощью инструкции lambda. Например, взгляните на результаты тестирования производительности программного кода, ис- пользующего функцию functools.reduce(): >>> from timeit import timeit >>> timeit(“reduce(operator.add,a)”,”import operator; a = range(100)”) 12.055853843688965 >>> timeit(“reduce(lambda x,y: x+y,a)”,”import operator; a = range(100)”) 25.012306928634644 >>> Обратите внимание, что фрагмент, где в качестве функции обратного вызо- ва используется функция operator.add, выполняется более чем в два раза бы- стрее по сравнению с версией, где используется выражение lambda x,y: x+y. 348 Глава 15. Структуры данных, алгоритмы и упрощение программного кода Кроме того, модуль operator определяет следующие функции, которые слу- жат обертками вокруг операций доступа к атрибутам и элементам, а также вокруг вызовов методов. attrgetter(name [, name2 [, ... [, nameN]]]) Создает вызываемый объект f , при вызове которого f(obj) возвращается значение obj.name. Если функции передается более одного аргумента, вызов f(obj) возвращает кортеж с результатами. Например, если объект f был соз- дан вызовом attrgetter(‘name’,’shares’), то вызов f(obj) вернет кортеж (obj. name, obj.shares) . Аргументы name могут включать оператор точки доступа к атрибутам. Например, если в аргументе name передать строку “address. hostname” , то вызов f(obj) вернет значение obj.address.hostname. itemgetter(item [, item2 [, ... [, itemN]]]) Создает вызываемый объект f , при вызове которого f(obj) возвращается значение obj[item]. Если функции передается более одного аргумента, то вызов f(obj) вернет кортеж (obj[item], obj[item2], ..., obj[itemN]). methodcaller(name [, *args [, **kwargs]]) Создает вызываемый объект f , при вызове которого f(obj) возвращается obj.name(*args, **kwargs) Эти функции могут пригодиться для оптимизации производительности операций, связанных с обращением к функциям обратного вызова, осо- бенно в таких распространенных операциях, как сортировка данных. На- пример, чтобы отсортировать список кортежей строк по второму столбцу, можно было бы использовать вызов sorted(rows, key=lambda r: r[2]) или sorted( rows, key=itemgetter(2)) . Вторая версия действует намного быстрее, потому что в ней не выполняются лишние операции, связанные с инструк- цией lambda. |