Читаем Язык программирования Python онлайн бесплатно
Функция range уже упоминалась при рассмотрении цикла for. Эта функция принимает от одного до трех аргументов. Если аргумент всего один, она генерирует список чисел от 0 (включительно) до заданного числа (исключительно). Если аргументов два, то список начинается с числа, указанного первым аргументом. Если аргументов три — третий аргумент задает шаг
Листинг
>>> print range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print range(1, 10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print range(1, 10, 3)
[1, 4, 7]
Функция xrange - аналог range, более предпочтительный для использования при последовательном доступе, например, в цикле for или с итераторами. Она возвращает специальный xrange–объект, который ведет себя почти как список, порождаемый range, но не хранит в памяти все выдаваемые элементы.
Функция map
Для применения некоторой функции ко всем элементам последовательности применяется функция map(f, *args). Первый параметр этой функции — функция, которая будет применяться ко всем элементам последовательности. Каждый следующий n+1–й параметр должен быть последовательностью, так как каждый его элемент будет использован в качестве n–го параметра при вызове функции f. Результатом будет список, составленный из результатов выполнения этой функции.
В следующем примере складываются значения из двух списков:
Листинг
>>> l1 = [2, 7, 5, 3]
>>> l2 = [-2, 1, 0, 4]
>>> print map(lambda x, y: x+y, l1, l2)
[0, 8, 5, 7]
В этом примере применена безымянная функция для получения суммы двух операндов ко всем элементам l1 и l2. В случае если одна из последовательностей короче другой, вместо соответствующего операнда будет None, что, конечно, собьет операцию сложения. В зависимости от решаемой задачи, можно либо видоизменить функцию, либо считать разные по длине последовательности ошибкой, которую нужно обрабатывать как отдельную ветвь алгоритма.
Частный случай применения map - использование None в качестве первого аргумента. В этом случае просто формируется список кортежей из элементов исходных последовательностей:
Листинг
>>> l1 = [2, 7, 5, 3]
>>> l2 = [-2, 1, 0, 4]
>>> print map(None, l1, l2)
[(2, — 2), (7, 1), (5, 0), (3, 4)]
Функция filter
Другой часто встречающейся операцией является фильтрование исходной последовательности в соответствии с некоторым предикатом (условием). Функция filter(f, seq) принимает два аргумента: функцию с условием и последовательность, из которой берутся значения. В результирующую последовательность попадут только те значения из исходной, для которой f возвратит истину. Если в качестве f задано значение None, результирующая последовательность будет состоять из тех значений исходной, которые имеют истинностное значение True.
Например, в следующем фрагменте кода можно избавится от символов, которые не являются буквами:
Листинг
>>> filter(lambda x: x.isalpha, 'Hi, there! I am eating an apple.')
'HithereIameatinganapple'
Списковые включения
Для более естественной записи обработки списков в Python 2 была внесена новинка: списковые включения. Фактически это специальный сокращенный синтаксис для вложенных циклов for и условий if, на самом низком уровне которых определенное выражение добавляется к списку, например:
Листинг
all_pairs = []
for i in range(5):
for j in range(5):
if i <= j:
all_pairs.append((i, j))
Все это можно записать в виде спискового включения так:
Листинг
all_pairs = [(i, j) for i in range(5) for j in range(5) if i <= j]
Как легко заметить, списковые включения позволяют заменить map и filter на более удобные для прочтения конструкции.
В следующей таблице приведены эквивалентные выражения в разных формах:
В форме функции В форме спискового включения
filter(f, lst) [x for x in lst if f(x)]
filter(None, lst) [x for x in lst if x]
map(f, lst) [f(x) for x in lst]
Функция sum
Получить сумму элементов можно с помощью функции sum:
Листинг
>>> sum(range(10))
45
Эта функция работает только для числовых типов, она не может конкатенировать строки. Для конкатенации списка строк следует использовать метод join.
Функция reduce
Для организации цепочечных вычислений (вычислений с накоплением результата) можно применять функцию reduce, которая принимает три аргумента: функцию двух аргументов, последовательность и начальное значение. С помощью этой функции можно, в частности, реализовать функцию sum:
Листинг
def sum(lst, start):
return reduce(lambda x, y: x + y, lst, start)
Совет:
Следует помнить, что в качестве передаваемого объекта может оказаться список, который позволит накапливать промежуточные результаты. Тем самым, reduce может использоваться для генерации последовательностей.
В следующем примере накапливаются промежуточные результаты суммирования:
Листинг
lst = range(10)
f = lambda x, y: (x[0] + y, x[1]+[x[0] + y])
print reduce(f, lst, (0, []))
В итоге получается:
Листинг
(45, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
Функция zip
Эта функция возвращает список кортежей, в котором i–й кортеж содержит i–е элементы аргументов–последовательностей. Длина результирующей последовательности равна длине самой короткой из последовательностей–аргументов:
Листинг
>>> print zip(range(5), «abcde»)
