2013-05-25 34 views
6

kết quả là danh sách lồng nhau, và trông như thế này:python bản đồ chức năng lặp

>>> results 
[[1, 2, 3, 'a', 'b'], [1, 2, 3, 'c', 'd'], [4, 5, 6, 'a', 'b'], [4, 5, 6, 'c', 'd']] 

pr là một chức năng, với định nghĩa như thế này:

>>> def pr(line): 
...  print line 

lặp Bình thường về kết quả thực hiện cư xử như thế này :

>>> for result in results: 
...  pr(result) 
... 
[1, 2, 3, 'a', 'b'] 
[1, 2, 3, 'c', 'd'] 
[4, 5, 6, 'a', 'b'] 
[4, 5, 6, 'c', 'd'] 

Nhưng lặp lại ngầm định với bản đồ, dẫn đến hành vi này:

>>> map(pr, results) 
[1, 2, 3, 'a', 'b'] 
[1, 2, 3, 'c', 'd'] 
[4, 5, 6, 'a', 'b'] 
[4, 5, 6, 'c', 'd'] 
[None, None, None, None] 

Câu hỏi của tôi: Tại sao chức năng bản đồ lại tạo thêm lần lặp?

+0

'bản đồ' đến từ các ngôn ngữ lập trình chức năng http://en.wikipedia.org/wiki/Map_%28higher-order_function%29 Nó không phải là nghĩa vụ phải được sử dụng như thế này – jamylak

+2

@jamylak: pr là một chức năng demo cho điều này câu hỏi, tôi đã áp dụng một số chuyển đổi khác trong mã của tôi. –

Trả lời

6

map áp dụng một chức năng cho từng phần tử có thể lặp lại và kết quả được lưu trữ trong danh sách (hoặc đối tượng bản đồ trong Python 3). Vì vậy, phần [None, None, None, None] là giá trị trả về của hàm bản đồ. Bạn sẽ không thấy điều này khi bạn thực hiện một kịch bản, nhưng bạn cũng có thể thoát khỏi nó trong IDLE bằng cách chỉ cần gán cho nó một giá trị:

>>> _ = map(pr, results) 

Lưu ý mặc dù, rằng việc xây dựng danh sách kết quả (ít nhất trong Python 2) có một số tác động, vì vậy nếu bạn không cần kết quả, tốt hơn hết bạn không sử dụng map trong trường hợp này.

3

[None, None, None, None] là kết quả của cuộc gọi đến map, được in tự động trong bảng điều khiển thông dịch Python.

6

map trong Python 2 trả về danh sách, được tạo thành từ tất cả các giá trị trả về của hàm bạn vượt qua. Hàm pr của bạn trả về None (ngầm định, bằng cách rơi xuống cuối). Vì vậy, kết quả của map sẽ là một danh sách đầy với None s, một cho mỗi đối tượng trong iterable bạn vượt qua in Điều này được in tự động bởi các thông dịch viên tương tác, vì bạn đã không gán nó cho một biến - đó là cuối cùng dòng bạn đang thấy.

Bạn có thể thấy điều này rõ ràng hơn khi bạn gán nó vào một biến:

>>> a = map(pr, results) 
[1, 2, 3, 'a', 'b'] 
[1, 2, 3, 'c', 'd'] 
[4, 5, 6, 'a', 'b'] 
[4, 5, 6, 'c', 'd'] 
>>> a 
[None, None, None, None] 

Do lưu ý rằng việc sử dụng map khi bạn không quan tâm đến kết quả này thường wlil làm cho mã của bạn khó khăn hơn để đọc; và sử dụng nó cho các tác dụng phụ thậm chí còn nhiều hơn thế. Trong cả hai trường hợp này, bạn nên viết vòng lặp rõ ràng hơn.

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