Пост похожий на
полезные функции, но все так не то...
Добавление проверок и вложенных циклов (функция 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 :
Продолжение про генераторы - будет.....
Продолжение про генераторы - будет.....
Комментариев нет:
Отправить комментарий