28 ноября 2012 г.

Генераторы и итераторы


Генераторы и итераторы 
все таки без продолжения никак

Генераторы списков, будучи по своей природе циклами for, очень тесно связаны с инструментами функционального программирования (такими как функции map и filter), поэтому мы снова вернемся к ним.

Генераторы списков и функция map:
Встроенная функция ord в языке Python возвращает целочисленный код ASCII единственного символа (обратной к ней является встроенная функция chr – она возвращает символ, соответствующий коду ASCII):
>>> ord(‘s’)
115

Теперь рассмотрим применение ord для нескольких значений:
>>> res = []
>>> for x in ‘spam’:
...     res.append(ord(x))
...
>>> res
[115, 112, 97, 109]

Рассмотрим пример, где мы не заботимся о создании списка и используем инструкцию "map":
>>> res = map(ord, ‘spam’)# Применить функцию к 
>>> res                   #последовательности
[115, 112, 97, 109]

Теперь рассмотрим пример когда нам нужно применить выражение к последовательности:
>>> res = [ord(x) for x in ‘spam’] # Применит выражение к последовательности
>>> res
[115, 112, 97, 109]
Если быть точнее, мы сгенерировали список и на выходе получили совершенно новый (одно из назначений генераторов) присвоив его начальной переменной res. То есть в  res был отправлен результат выражения. Синтаксически генераторы списков заключаются в квадратные скобки!


Генераторы  списков  более  удобны,  особенно,  когда  требуется применить к последовательности произвольное выражение:
#1
>>> [x ** 2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

#2 аналог #1 только используем функцию  map:
>>> map((lambda x: x ** 2), range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

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

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