2013-03-08 2 views
8

Есть ли способ сделать map ленивый? Или есть еще одна реализация его встроенного в Python?Lazy map function in Python

Я хочу что-то вроде этого, чтобы работать:

from itertools import count 

for x in map(lambda x: x**2, count()): 
    print x 

Конечно, приведенный выше код не будет конца, но я хотел бы просто ввести какое-либо условие (или более сложная логика) внутри for и остановитесь в какой-то момент.

+1

Смотрите здесь: [ Знайте, когда быть Ленивым] (http://davywybiral.blogspot.com/2008/08/python-know-when-to-be-lazy.html). Короче: либо использовать выражения генератора, либо использовать модуль itertools. –

+0

@RobertHarvey: Хорошая ссылка. На самом деле, кроме того, что вы делаете 'x * 2' вместо' x ** 2', блог в значительной степени идеально подходит для этого вопроса! – abarnert

+0

@RobertHarvey Очень хорошая статья. Спасибо! –

ответ

27

использование itertools.imap на Python 2.x или перейти на Python 3.x

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

foo = (x**2 for x in count()) 
+5

+1 для рекомендации выражения генератора. Где вам нужно «lambda», 'map()' не является хорошим выбором. –

+0

Спасибо за ваш ответ. Я просто попытался сделать более простой пример кода для вопроса (при использовании 'map'). –

4

itetools.imap ленив.

In [3]: itertools.imap? 
Type:  type 
String Form:<type 'itertools.imap'> 
Docstring: 
imap(func, *iterables) --> imap object 

Make an iterator that computes the function using arguments from 
each of the iterables. Like map() except that it returns 
an iterator instead of a list and that it stops when the shortest 
iterable is exhausted instead of filling in None for shorter 
iterables.