2012-09-07 35 views
70

Tôi đang học khái niệm về bộ lọc bằng Python. Tôi đang chạy một mã đơn giản như thế này.Bộ lọc trong Python3

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
>>> filter(f, range(2, 25)) 

Nhưng thay vì nhận danh sách, tôi nhận được một số thông báo như thế này.

<filter object at 0x00FDC550> 

Điều này có nghĩa là gì? Điều đó có nghĩa là danh sách đối tượng được lọc của tôi sẽ được lưu trữ tại vị trí bộ nhớ đó không? Làm cách nào để có danh sách mà tôi cần?

Trả lời

118

Dường như bạn đang sử dụng python 3.x. Trong python3, filter, map, zip, v.v. trả về một đối tượng có thể lặp lại, nhưng không phải là danh sách. Nói cách khác,

filter(func,data) #python 2.x 

tương đương với:

list(filter(func,data)) #python 3.x 

tôi nghĩ rằng nó đã được thay đổi bởi vì bạn (thường) muốn làm lọc trong một cảm giác lười biếng - Bạn không cần phải tiêu thụ tất cả các bộ nhớ để tạo ra một danh sách lên phía trước, miễn là iterator trả về cùng một điều một danh sách sẽ trong quá trình lặp.

Nếu bạn đã quen thuộc với comprehensions danh sách và các biểu thức máy phát điện, bộ lọc trên tại là (hầu như) tương đương với sau trong python3.x:

(x for x in data if func(x)) 

Trái ngược với:

[ x for x in data if func(x) ] 

trong python 2.x

+0

Cảm ơn rất nhiều. Ngoài ra, bạn có thể cho tôi biết số này là 0x00FDC550 – user1190882

+3

Đó là ID của đối tượng hay không. Trong CPython, đó là vị trí bộ nhớ. – mgilson

+1

wow ... thú vị ... Tôi nghĩ [] danh sách snd() là tương đương, nhưng [bộ lọc (func, dữ liệu)] không hoạt động giống nhau – user2846569

19

Đây là một iterator được trả về bởi hàm filter.

Nếu bạn muốn có một danh sách, chỉ cần làm

list(filter(f, range(2, 25))) 

Tuy nhiên, bạn chỉ có thể lặp qua đối tượng này với một vòng lặp for.

for e in filter(f, range(2, 25)): 
    do_stuff(e) 
+0

Cảm ơn rất nhiều. Ngoài ra, xin bạn có thể cho tôi biết số này là 0x00FDC550 – user1190882

+0

Đó là địa chỉ bộ nhớ của đối tượng đó. Đó là đầu ra mặc định khi in một đối tượng nếu lớp của đối tượng đó không có ['__repr__()'] (http://docs.python.org/library/functions.html # repr) được sử dụng để kiểm soát đầu ra. – sloth