Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

Применять для обработки данных явные последовательности не всегда эффективно, так как на хранение временных данных может тратиться много оперативной памяти. Более эффективным решением представляется использование итераторов — специальных объектов, обеспечивающих последовательный доступ к данным контейнера. Если в выражении есть операции с итераторами вместо контейнеров, промежуточные данные не будут требовать много места для хранения — ведь они запрашиваются по мере необходимости для вычислений. При обработке данных с использованием итераторов память

будет требоваться только для исходных данных и результата, да и то необязательно вся сразу — ведь данные могут читаться и записываться в файл на диске.

Итераторы можно применять вместо последовательности в операторе for. Более того, внутренне оператор for запрашивает от последовательности ее итератор. Объект файлового типа тоже (построчный) итератор, что позволяет обрабатывать большие файлы, не считывая их целиком в память.

Там, где требуется итератор, можно использовать последовательность.

Работа с итераторами рассматривается в разделе, посвященном функциональному программированию, так как итераторами удобно манипулировать именно в функциональном стиле.

Использовать итератор можно и «вручную». Любой объект, поддерживающий интерфейс итератора, имеет метод next, который при каждом вызове выдает очередное значение итератора. Если больше значений нет, возбуждается исключение StopIteration. Для получения итератора по некоторому объекту необходимо прежде применить к этому объекту функцию iter (цикл for делает это автоматически).

В Python имеется модуль itertools, который содержит набор функций, комбинируя которые, можно составлять достаточно сложные схемы обработки данных с помощью итераторов. Далее рассматриваются некоторые функции этого модуля.

Функция iter

Эта функция имеет два варианта использования. В первом она принимает всего один аргумент, который должен «уметь» предоставлять свой итератор. Во втором один из аргументов — функция без аргументов, другой — стоповое значение. Итератор вызывает указанную функцию до тех пор, пока та не возвратит стоповое значение. Второй вариант встречается много реже первого и обычно внутри метода класса, так как сложно порождать значения «на пустом месте»:

Листинг

it1 = iter([1, 2, 3, 4, 5])

def forit(mystate=[]):

if len(mystate) < 3:

mystate.append(" ")

return " "

it2 = iter(forit, None)

print [x for x in it1]

print [x for x in it2]

Примечание:

Если функция не возвращает значения явно, она возвращает None, что и использовано в примере выше.

Функция enumerate

Эта функция создает итератор, нумерующий элементы другого итератора. Результирующий итератор выдает кортежи, в которых первый элемент — номер (начиная с нуля), а второй — элемент исходной последовательности:

Листинг

>>> print [x for x in enumerate(«abcd»)]

[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

Функция sorted

Эта

функция, появившаяся в Python 2.4, позволяет создавать итератор, выполняющий сортировку:

Листинг

>>> sorted('avdsdf')

['a', 'd', 'd', 'f', 's', 'v']

Далее рассматриваются функции модуля itertools.

Функция itertools.chain

Функция chain позволяет сделать итератор, состоящий из нескольких соединенных последовательно итераторов. Итераторы задаются в виде отдельных аргументов. Пример:

Листинг

from itertools import chain

it1 = iter([1,2,3])

it2 = iter([8,9,0])

for i in chain(it1, it2):

print i,

даст в результате

Листинг

1 2 3 8 9 0

Функция itertools.repeat

Функция repeat строит итератор, повторяющий некоторый объект заданное количество раз:

Листинг

for i in itertools.repeat(1, 4):

print i,

1 1 1 1

Функция itertools.count

Бесконечный итератор, дающий целые числа, начиная с заданного:

Листинг

for i in itertools.count(1):

print i,

if i > 100:

break

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

Функция itertools.cycle

Можно бесконечно повторять и некоторую последовательность (или значения другого итератора) с помощью функции cycle:

Листинг

tango = [1, 2, 3]

for i in itertools.cycle(tango):

print i,

1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2

3 1 2 3 1

2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3

1 2 3 1 2

3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 …

Функции itertools.imap, itertools.starmap и itertools.ifilter

Аналогами map и filter в модуле itertools являются imap и ifilter. Отличие imap от map в том, что вместо значения от преждевременно завершившихся итераторов объект None не подставляется. Пример:

Листинг

for i in map(lambda x, y: (x,y), [1,2], [1,2,3]):

print i,

(1, 1) (2, 2) (None, 3)

from itertools import imap

for i in imap(lambda x, y: (x,y), [1,2], [1,2,3]):

print i,

(1, 1) (2, 2)

Здесь следует заметить, что обычная функция map нормально воспринимает итераторы в любом сочетании с итерабельными (поддающимися итерациям) объектами:

Листинг

for i in map(lambda x, y: (x,y), iter([1,2]), [1,2,3]):

Поделиться:
Популярные книги

Санек 2

Седой Василий
2. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 2

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Восхождение Примарха 2

Дубов Дмитрий
2. Восхождение Примарха
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
Восхождение Примарха 2

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я уже князь. Книга XIX

Лекарь Империи 10

Карелин Сергей Витальевич
10. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 10

Охота

Грехов Тимофей
8. Ярар
Фантастика:
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Охота

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Третий Генерал: Том IX

Зот Бакалавр
8. Третий Генерал
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Третий Генерал: Том IX

Шайтан Иван 5

Тен Эдуард
5. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
5.00
рейтинг книги
Шайтан Иван 5

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12