2013-03-08 13 views
8

Có cách nào để làm cho map lười biếng không? Hoặc là có một thực hiện khác của nó được xây dựng trong Python?Chức năng bản đồ lười biếng trong Python

Tôi muốn một cái gì đó như thế này để làm việc:

from itertools import count 

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

Tất nhiên, các mã trên sẽ không kết thúc, nhưng tôi muốn chỉ để nhập bất kỳ điều kiện (hoặc logic phức tạp hơn) bên trong for và dừng lại ở một số điểm.

+1

Xem ở đây: [ Biết khi nào là Lười biếng] (http://davywybiral.blogspot.com/2008/08/python-know-when-to-be-lazy.html). Trong ngắn hạn: hoặc sử dụng biểu thức máy phát điện hoặc sử dụng mô-đun itertools. –

+0

@RobertHarvey: Liên kết đẹp. Trong thực tế, ngoài việc thực hiện 'x * 2' thay vì' x ** 2', blog hoàn toàn phù hợp với câu hỏi này! – abarnert

+0

@RobertHarvey Bài viết rất hay. Cảm ơn bạn! –

Trả lời

27

sử dụng itertools.imap trên Python 2.x hoặc nâng cấp lên Python 3.x

Bạn cũng có thể chỉ cần sử dụng một biểu thức máy phát điện đơn giản mà là xa pythonic hơn:

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

+1 để đề xuất biểu thức trình tạo. Bất cứ nơi nào bạn cần 'lambda',' map() 'không phải là một lựa chọn tốt. –

+0

Cảm ơn bạn đã trả lời. Tôi chỉ cố gắng tạo một mẫu mã đơn giản hơn cho câu hỏi (khi sử dụng 'map'). –

4

itetools.imap lười.

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.