Map và filter là hai tính năng được dùng nhiều trong các ngôn ngữ khác, Python cũng có hai tính năng này. Mình xin giới thiệu map và filter trong Python đến với các bạn trong bài viết dưới đây.
Table of Contents
Map
Hàm map có tác dụng thực thi một hàm lên một chuỗi giá trị (có thể là list, tuple, hay một iterable nào đó) bằng cách trả về một map object (object này tương tự generator, mình sẽ giải thích ở một post khác).
Các bạn có thể convert map object này ngược lại thành list nhưng với giá trị đã được xử lí. Hàm map sẽ nhận và trả các giá trị như bên dưới.
map(function, iterable1, iterable2 ,...) -> map object
- map: chính là map
- function: là hàm bạn muốn apply vào dữ liệu ở các iterables….
- iterable1,2….: là một chuỗi giá trị có thể được chứa trong list, tuple,… miễn là có thể iterable.
Ví dụ:
def double(x):
return x + x
result = map(double, [1, 2, 3, 4])
print(list(result)) # [1, 4, 6, 8] để ý rằng chúng ta cần list(result) để biến map trở lại thành một list
Chú ý dòng cuối cùng, map function sẽ không trực tiếp trả về một list mà trả về một generator. Các bạn có thể convert generator này ngược lại thành một list, hoặc một tuple hay bất cứ iterable nào bạn muốn dùng.
Filter
Hàm này cũng áp dụng một function lên một chuỗi dữ liệu như map, tuy nhiên điều khác biệt ở đây là hàm này kiểm tra giá trị đầu vào và chỉ trả về các giá trị đạt được điều kiện và trả về giá trị True, các giá trị tạo ra False sẽ bị bỏ lại.
Hàm này cũng trả về một filter object tương tự generator.
filter(function, iterable) -> filter object
- filter: chính là filter
- function: là hàm bạn muốn apply vào dữ liệu ở các iterables….
- iterable: là một chuỗi giá trị có thể được chứa trong list, tuple,… miễn là có thể iterable.
def more_than_zero(x):
if x > 0:
return True
else:
return False
result = filter(more_than_zero, [1, -2, 3, 4])
print(list(result)) # [1, 3, 4]
Như các bạn có thể thấy giá trị -2 đã bị bỏ ra và chỉ còn 1,3,4 do chúng ta sử dụng hàm more_than_zero chỉ trả về giá trị True khi x > 0.
Tại sao dùng map và filter?
Có một số lý do như sau
- Khi sử dụng code, chúng ta sẽ không sử dụng một for loop thủ công, việc áp dụng một hàm lên một chuỗi sẽ tường minh hơn (giả sử bạn có một function dài hoặc nest nhiều function khác thì việc bỏ nó trực tiếp vào for loop sẽ rất khó đọc).
- Ứng dụng functional programming
- Dùng với lambda function (sẽ đề cập trong một post khác)
- …
Nếu bạn có thể thấy một số lí do khác nên dùng map và filter hãy comment bên dưới nhé. Cảm ơn các bạn đã đón đọc.