3 декабря 2012 г.

Другое


Пост похожий на 
полезные функции, но все так не то...

Добавление проверок и вложенных циклов (функция filter):
Добавив после цикла for
оператор if получим реализацию логики выбора. Генераторы списков с оператором if можно  представить  как аналог  встроенной функции filter – они пропускают элементы, для которых условное выражение в операторе if возвращает ложь.

Две версии реализации выбора четных чисел в диапазоне от
0 до  4 –  с помощью генератора списка и  с помощью функции filter:
№1
>>> [x for x in range(5) if x % 2 == 0]
[0, 2, 4]
№2 (filter+lambda) 
>>> list(filter((lambda x: x % 2 == 0), range(5)))
[0, 2, 4]

Добиваемся эффекта действия функций filter и map в единственном выражении:
>>> list(map((lambda x: x**2), filter((lambda x: x % 2 == 0), range(10))))
[0, 4, 16, 36, 64]
-----------------------------------------------------------------

Генераторы списков и матрицы
В примере определяются две матрицы 3x3 в виде вложенных 
списков:
>>> M = [[1, 2, 3],
...      [4, 5, 6],
...      [7, 8, 9]]

>>> N = [[2, 2, 2],
...      [3, 3, 3],
...      [4, 4, 4]]

Индексирование(обращение к элементам списка), будет происходить так:
>>> M[1]
[4, 5, 6]
>>> M[1][2]
6
Индексирования с помощью цикла for:
>>> [row[1] for row in M]
[2, 5, 8]

>>> [M[row][1] for row in (0, 1, 2)]
[2, 5, 8]

Индексирования с помощью цикла генератора списка range:
>>> [M[i][i] for i in range(len(M))]
[1, 5, 9]

>>> [M[row][col] * N[row][col] for row in range(3) for col in range(3)]
[2, 4, 6, 12, 15, 18, 28, 32, 36]
>>> [[M[row][col] * N[row][col] for col in range(3)] for row in range(3)]
[[2, 4, 6], [12, 15, 18], [28, 32, 36]]
-----------------------------------------------------------------

Функции-генераторы: инструкция yield вместо return:
Пример - генерация серии квадратов чисел
>>> def gensquares(N):
...     for i in range(N):
...         yield i ** 2# Позднее продолжить работу с этого места
...
Вызов функции:
>>> for i in gensquares(5):    # Возобновить работу функции
...     print(i, end = ‘ : ‘)  # Вывести последнее полученное 
...                            # значение
0 : 1 : 4 : 9 : 16 :
Аналоги:

>>> for x in [n**2 for n in range(5)]:
...     print(x, end=’ : ‘)
...
0 : 1 : 4 : 9 : 16 :
>>> for x in map((lambda x:x**2), range(5)):
...     print(x, end=’ : ‘)
...
0 : 1 : 4 : 9 : 16 :

Продолжение про генераторы - будет.....

Комментариев нет:

Отправить комментарий