? Анимация и создание сайтов
Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

>>> 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)

>>> seq = xrange(8)

>>> def square(x): return x*x



>>> reduce(add, xrange(1, 11))

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

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

>>> def sum(seq):

... def add(x,y): return x+y

... return reduce(add, seq, 0)

>>> sum(xrange(1, 11))

>>> sum([]) 0

5.3 Дополнительные возможности при конструировании списков

Начиная с версии 2.0, языка Python, существуют дополнительные возможности конструирования списков, не прибегая к средствам функционального программирования. Такие определения списков записываются с использованием в квадратных скобках выражения и следующих за ним блоков for:

>>> 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 1

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

>>> def add(x, y): return x+y



5.4 Инструкция del

Существует способ удалить не только элемент по его значению, но и элемент с определенным индексом, элементы с индексами в определенном диапазоне (ранее мы произво-

>>> freshfruit = [ banana,

... loganberry ,

... passion fruit ]

>>> [weapon.stripO for weapon in freshfruit]

[banana, loganberry, passion fruit]

>>> vec = [2, 4, 6]

>>> [3*x for x in vec] [6, 12, 18]

>>> [{x: x**2} for x in vec] [{2: 4}, {4: 16}, {6: 36}] >>> [[x,x**2] for x in vec]

[[2, 4], [4, 16], [6, 36]]

Элементы можно фильтровать, указав условие, записываемое с помощью ключевого слова if:

>>> [3*x for x in vec if x > 3]

[12, 18]

>>> [3*x for x in vec if x < 2]

Выражение, дающее кортеж, обязательно должно быть записано в скобках:

>>> [x, x**2 for x in vec] File "<stdin>", line 1 [x, x**2 for x in vec]

SyntaxError: invalid syntax >>> [(x, x**2) for x in vec]

[(2, 4), (4, 16), (6, 36)]

Если в конструкторе указано несколько блоков for, элементы второй последовательности перебираются для каждого элемента первой и т. д., то есть перебираются все комбинации:

>>> vec1 = [2, 4, 6] >>> vec2 = [4, 3, -9]

>>> [x*y for x in vec1 for y in vec2]

[8, 6, -18, 16, 12, -36, 24, 18, -54]

>>> [x+y for x in vec1 for y in vec2]

[6, 5, -7, 8, 7, -5, 10, 9, -3]



0 1 2 3 4 5 6 7 8 9 10 [ 11 ] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145