2013-09-22 33 views
19

Tôi đang đọc qua tài liệu Python để thực sự hiểu sâu về ngôn ngữ Python và đi qua chức năng lọc và bản đồ. Tôi đã sử dụng bộ lọc trước đây, nhưng không bao giờ bản đồ, mặc dù tôi đã thấy cả hai trong câu hỏi Python khác nhau ở đây trên SO.Python: Sự khác biệt giữa bộ lọc (chức năng, trình tự) và bản đồ (chức năng, trình tự)

Sau khi đọc về chúng trong hướng dẫn Python, tôi đang bối rối về sự khác biệt giữa hai. Ví dụ, từ 5.1.3. Functional Programming Tools:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
... 
>>> filter(f, range(2, 25)) 
[5, 7, 11, 13, 17, 19, 23] 

>>> def cube(x): return x*x*x 
... 
>>> map(cube, range(1, 11)) 
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] 

Những trông gần như giống hệt nhau trong chức năng đối với tôi, vì vậy tôi đã đi vào thiết bị đầu cuối để chạy Python tương tác và thử nghiệm ra trường hợp của riêng tôi. Tôi đã sử dụng map cho cả hai trường hợp đầu tiên và thứ hai ở trên và đối với trường hợp đầu tiên (return x % 2 != 0 and x % 3 != 0), nó trả về danh sách các boolean thay vì số.

Tại sao map đôi khi trả về giá trị trả lại thực tế và boolean lần khác?

Ai đó có thể giải thích cho tôi chính xác sự khác biệt giữa mapfilter?

Trả lời

24
map(cube, range(1, 11)) 

tương đương với

[cube(1), cube(2), ..., cube(10)] 

Trong khi danh sách được trả về bởi

filter(f, range(2, 25)) 

tương đương với result sau khi chạy

result = [] 
for i in range(2, 25): 
    if f(i): 
     result.append(i) 

Chú ý rằng khi sử dụng map, các mục trong kết quả là các giá trị được trả về bởi hàm cube.

Ngược lại, các giá trị được trả lại bởi f trong filter(f, ...) không phải là các mục trong result. f(i) chỉ được sử dụng để xác định nếu giá trị i phải được giữ trong result.

12

filter(), như tên gọi của nó, lọc bộ lọc gốc lặp lại và trả lại các mục trả về True cho chức năng được cung cấp cho filter(). Mặt khác,

map(), áp dụng chức năng được cung cấp cho từng phần tử có thể lặp lại và trả về danh sách kết quả cho từng phần tử.

theo ví dụ mà bạn đưa ra, chúng ta hãy so sánh chúng:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
>>> range(11) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> map(f, range(11)) #the ones that returns TRUE are 1, 5 and 7 
[False, True, False, False, False, True, False, True, False, False, False] 
>>> filter(f, range(11)) #So, filter returns 1, 5 and 7 
[1, 5, 7] 
+0

có ý nghĩa bây giờ, tôi thấy như thế nào hạn bộ lọc cho thấy những gì các chức năng thực hiện so với bản đồ. – samrap

+1

Trên thực tế, tên 'map()' cũng có ý nghĩa, trong một số trường khi bản đồ được sử dụng như một động từ, nó có nghĩa là tìm mối quan hệ tương ứng 1 đến 1. Chẳng hạn như trong toán học: 'bản đồ x để y' hoặc trong di truyền học: 'bệnh tiểu đường bản đồ để một gen'. Một điều tốt đẹp về 'Python' là như thế này: các tên thường có ý nghĩa. –

+0

đó là một điểm tốt. Thật buồn cười như thế nào tương tự như các khía cạnh nhất định của lập trình là các ví dụ hàng ngày.Giống như tôi đang ở đại số 2 và chúng tôi đang học về các hàm f (x) và một nửa lớp được stumped nhưng ý tưởng là 100% tương tự như các hàm trong lập trình. – samrap

Các vấn đề liên quan