Разделы инструкций

В сети

Пользователей: 71
Из них просматривают:
Аналоги: 14. Даташиты: 10. Инструкции: 5. Новости: 10. Опросы: 1. Остальное: 7. Ошибки: 1. Программы: 2. Теги: 3. Торрент: 1. Форум: 16. Чат: 1.
Участников: 3
Гостей: 68

Google , wolf170571 , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

Оглавление

5.2. Средства функционального программирования

Существуют три встроенные функции, которые могут быть полезны при работе с последовательностями: filter(), map(), zip() и reduce().

filter(function, sequence) возвращает последовательность (по возможности того же типа, что и sequence), состоящую из тех элементов последовательности sequence, для которых function(item) является истиной. Например, выделим простые числа из списка:

 

>>> def f(x):
...     for y in xrange(2, x):
...             if x%y==0: return 0
...     return 1
...
>>> filter(f, xrange(2, 40))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]

 

map(function, sequence [...] ) возвращает список значений, полученных применением функции function к элементам одной или нескольких последовательностей. Например, создадим список кубов натуральных чисел:

 

>>> def cube(x): return x*x*x
...
>>> map(cube, xrange(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

 

Функция function должна воспринимать столько аргументов, сколько последовательностей передается. Она вызывается с соответствующими элементами из каждой последовательности или None, если какая-нибудь последовательность оказалась короче других. Если function равно None, то используется функция, возвращающая свои аргументы.

Учитывая эти две особенности, мы видим, что 'map(None, list1, list2)' является удобным способом превращения пары списков в список пар:

 

>>> seq = xrange(8)
>>> def square(x): return x*x
...
>>> map(None, seq, map(square, seq))
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49)]

 

Таким образом Вы можете перебирать элементы одновременно несколько последовательностей одинаковой длины:

 

>>> seq1 = ['cat', 'mouse', 'bird']
>>> seq2 = ['кот', 'мышь', 'птица']
>>> for x, y in map(None, seq1, seq2):
...     print x, y
...
cat кот
mouse мышь
bird птица

 

Как мы уже говорили, если какая-либо последовательность оказывается короче других, функция map() дополняет её элементами, равными None. Такое поведение не всегда желательно. Поэтому в версии 2.0 была добавлена функция zip(). zip(sequence[...]) возвращает список кортежей, каждый из которых состоит из соответствующих элементов аргументов-последовательностей. При этом длина полученной последовательности будет равна длине самой короткой последовательности среди аргументов. Например:

 

>>> a = (1, 2, 3, 4)
>>> b = (5, 6, 7, 8)
>>> c = (9, 10, 11)
>>> d = (12, 13)
>>> zip(a, b)
[(1, 5), (2, 6), (3, 7), (4, 8)]
>>> zip(a, d)
[(1, 12), (2, 13)]
>>> zip(a, b, c, d)
[(1, 5, 9, 12), (2, 6, 10, 13)]

 

Если последовательности имеют одинаковую длину, поведение функции zip() полностью аналогично поведению map() с None в качестве первого аргумента. Кроме того, в этом случае действие функций zip() и map() обратимо:

 

>>> a = (1, 2, 3)
>>> b = (4, 5, 6)
>>> x = zip(a, b)
>>> y = zip(*x) # или apply(zip, x)
>>> z = zip(*y) # или apply(zip, y)
>>> x
[(1, 4), (2, 5), (3, 6)]
>>> y
[(1, 2, 3), (4, 5, 6)]
>>> z
[(1, 4), (2, 5), (3, 6)]
>>> x == z
True

 

reduce(function, sequence[, initial]) возвращает значение, полученное путем последовательного применения бинарной функции function сначала к первым двум элементам последовательности sequence, затем к результату и следующему элементу и т. д. Например, вычислим сумму арифметической последовательности:

 

>>> def add(x, y): return x+y
...
>>> reduce(add, xrange(1, 11))
55

 

Если последовательность содержит единственный элемент, возвращается его значение, если же последовательность пуста, то генерируется исключение TypeError.

В качестве третьего аргумента можно указать начальное значение. В этом случае оно возвращается для пустой последовательности, и функция сначала применяется к начальному значению и первому элементу последовательности, затем к результату и следующему элементу и т. д.:

 

>>> def sum(seq):
...     def add(x,y): return x+y
...     return reduce(add, seq, 0)
...
>>> sum(xrange(1, 11))
55
>>> sum([])
0

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити

Разное

Сортировать всякую всячину поможет магнит, завернутый в бумагу или полиэтилен.

Интересно

При первом включении после ремонта (для двухтактных УНЧ):
1. в разрыв "+" и "_" резисторы около 100 Ом для ограничения тока в случае не полного устранения неисправности.

Похожие инструкции