Thứ hai, 03/08/2020 | 00:00 GMT+7

Cách sử dụng hàm bản đồ Python

Ta có thể sử dụng map() hàm tích hợp sẵn trong Python map() để áp dụng một hàm cho từng mục trong một file có thể lặp lại (như danh sách hoặc từ điển ) và trả về một trình lặp mới để truy xuất kết quả. map() trả về một đối tượng bản đồ (một trình lặp), đối tượng này ta có thể sử dụng trong các phần khác của chương trình. Ta cũng có thể chuyển đối tượng bản đồ vào hàm list() hoặc một kiểu chuỗi khác để tạo một file có thể lặp lại.

Cú pháp cho hàm map() như sau:

map(function, iterable, [iterable 2, iterable 3, ...]) 

Thay vì sử dụng vòng lặp for , hàm map() cung cấp một cách áp dụng một hàm cho mọi mục trong một file có thể lặp lại. Do đó, nó thường có thể hoạt động tốt hơn vì nó chỉ áp dụng chức năng một mục tại một thời điểm thay vì tạo bản sao của các mục thành một mục khác có thể lặp lại. Điều này đặc biệt hữu ích khi làm việc trên các chương trình xử lý các tập dữ liệu lớn. map() cũng có thể nhận nhiều đoạn lặp làm đối số cho hàm bằng cách gửi một mục từ mỗi đoạn có thể lặp đến hàm tại một thời điểm.

Trong hướng dẫn này, ta sẽ xem xét ba cách khác nhau để làm việc với map() : với hàm lambda , với một hàm do user xác định và cuối cùng là với một hàm tích hợp sử dụng nhiều đối số có thể lặp lại.

Sử dụng một hàm Lambda

Đối số đầu tiên của map() là một hàm mà ta sử dụng để áp dụng cho từng mục. Python gọi hàm một lần cho mọi mục trong file có thể lặp lại mà ta chuyển vào map() và nó trả về mục được thao tác trong một đối tượng bản đồ. Đối với đối số hàm đầu tiên, ta có thể chuyển một hàm do user định nghĩa hoặc ta có thể sử dụng các hàm lambda , đặc biệt khi biểu thức ít phức tạp hơn.

Cú pháp của map() với một hàm lambda như sau:

map(lambda item: item[] expression, iterable) 

Với một danh sách như sau, ta có thể triển khai một hàm lambda với một biểu thức mà ta muốn áp dụng cho từng mục trong danh sách của bạn :

numbers = [10, 15, 21, 33, 42, 55] 

Để áp dụng một biểu thức cho mỗi số của ta , ta có thể sử dụng map()lambda :

mapped_numbers = list(map(lambda x: x * 2 + 3, numbers)) 

Ở đây ta khai báo một mục trong danh sách của ta là x . Sau đó, ta thêm biểu thức của ta . Ta chuyển vào danh sách các số dưới dạng có thể lặp lại cho map() .

Để nhận được kết quả của việc này ngay lập tức, ta in danh sách các đối tượng map :

print(mapped_numbers) 
Output
[23, 33, 45, 69, 87, 113]

Ta đã sử dụng list() để đối tượng bản đồ được trả lại cho ta dưới dạng danh sách, thay vì một đối tượng ít con người có thể đọc được như: <map object at 0x7fc250003a58> . Đối tượng bản đồ là một trình lặp trên kết quả của ta , vì vậy ta có thể lặp lại nó với for hoặc ta có thể sử dụng list() để biến nó thành một danh sách. Ta đang làm điều này ở đây vì đó là một cách tốt để xem lại kết quả.

Cuối cùng thì map() hữu ích nhất khi làm việc với các tập dữ liệu lớn, vì vậy ta có thể sẽ làm việc với đối tượng bản đồ sâu hơn và nói chung sẽ không sử dụng một hàm tạo như list() trên chúng.

Đối với các tập dữ liệu nhỏ hơn, cách hiểu danh sách có thể phù hợp hơn, nhưng với mục đích của hướng dẫn này, ta đang sử dụng một tập dữ liệu nhỏ để minh họa map() .

Triển khai một chức năng do user xác định

Tương tự với lambda ta có thể sử dụng một hàm mà ta đã xác định để áp dụng cho một file có thể lặp lại. Trong khi lambda hàm lambda hữu ích hơn để triển khai khi bạn đang làm việc với biểu thức một dòng, các hàm do user xác định sẽ thích hợp hơn khi biểu thức ngày càng phức tạp. Hơn nữa, khi ta cần chuyển một phần dữ liệu khác đến hàm mà bạn đang áp dụng cho các hàm có thể lặp lại của bạn , thì các hàm do user xác định có thể là lựa chọn tốt hơn để dễ đọc.

Ví dụ: trong mục có thể lặp lại sau đây, mỗi mục là một từ điển chứa các thông tin chi tiết khác nhau về từng sinh vật thủy sinh của ta :

aquarium_creatures = [     {"name": "sammy", "species": "shark", "tank number": 11, "type": "fish"},     {"name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish"},     {"name": "jo", "species": "guppy", "tank number": 18, "type": "fish"},     {"name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish"},     {"name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish"},     {"name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"} ] 

Ta đã quyết định rằng tất cả các sinh vật thủy sinh trên thực tế sẽ chuyển vào cùng một bể. Ta cần cập nhật profile của bạn để phản ánh rằng tất cả các sinh vật của ta đang di chuyển vào bể 42 . Để có map() truy cập từng từ điển và từng cặp khóa: giá trị trong từ điển, ta tạo một hàm lồng nhau:

def assign_to_tank(aquarium_creatures, new_tank_number):     def apply(x):         x["tank number"] = new_tank_number         return x     return map(apply, aquarium_creatures) 

Ta xác định một assign_to_tank() chức năng mà mất aquarium_creaturesnew_tank_number như thông số. Trong assign_to_tank() ta chuyển apply() làm hàm để map() trên dòng cuối cùng. Hàm assign_to_tank sẽ trả về trình lặp kết quả từ map() .

apply() lấy x làm đối số, đại diện cho một mục trong danh sách của ta - một từ điển duy nhất.

Tiếp theo ta xác định rằng x"tank number" key từ aquarium_creatures và rằng nó nên lưu trữ các thông qua trong new_tank_number . Ta trả lại từng mặt hàng sau khi áp dụng số xe tăng mới.

Ta gọi assign_to_tank() với danh sách từ điển của ta và số xe tăng mới mà ta muốn thay thế cho từng sinh vật:

assigned_tanks = assign_to_tank(aquarium_creatures, 42) 

Một khi các chức năng hoàn thành ta có đối tượng bản đồ của ta được lưu trữ trong assigned_tanks biến, mà ta biến thành một danh sách và in:

print(list(assigned_tanks)) 

Ta sẽ nhận được kết quả sau từ chương trình này:

Output
[{'name': 'sammy', 'species': 'shark', 'tank number': 42, 'type': 'fish'}, {'name': 'ashley', 'species': 'crab', 'tank number': 42, 'type': 'shellfish'}, {'name': 'jo', 'species': 'guppy', 'tank number': 42, 'type': 'fish'}, {'name': 'jackie', 'species': 'lobster', 'tank number': 42, 'type': 'shellfish'}, {'name': 'charlie', 'species': 'clownfish', 'tank number': 42, 'type': 'fish'}, {'name': 'olly', 'species': 'green turtle', 'tank number': 42, 'type': 'turtle'}]

Ta đã ánh xạ số xe tăng mới vào danh sách từ điển của ta . Sử dụng một hàm mà ta xác định, ta có thể kết hợp map() để áp dụng hàm một cách hiệu quả trên từng mục của danh sách.

Sử dụng một chức năng tích hợp với nhiều lặp lại

Theo cách tương tự như lambda hàm lambda hoặc các hàm được xác định của riêng ta , ta có thể sử dụng các hàm tích hợp sẵn trong Python với map() . Để áp dụng một hàm có nhiều lần lặp, ta chuyển vào một tên có thể lặp khác sau tên đầu tiên. Ví dụ: sử dụng hàm pow() nhận hai số để tìm lũy thừa của số cơ sở với số mũ đã cho.

Ở đây ta có danh sách các số nguyên mà ta muốn sử dụng với pow() :

base_numbers = [2, 4, 6, 8, 10] powers = [1, 2, 3, 4, 5] 

Tiếp theo, ta chuyển pow() làm hàm của ta vào map() và cung cấp hai danh sách dưới dạng các file lặp của ta :

numbers_powers = list(map(pow, base_numbers, powers))  print(numbers_powers) 

map() sẽ áp dụng hàm pow() cho cùng một mục trong mỗi danh sách để cung cấp sức mạnh. Do đó, kết quả của ta sẽ hiển thị 2**1 , 4**2 , 6**3 , v.v.

Output
[2, 16, 216, 4096, 100000]

Nếu ta cung cấp map() với một file có thể lặp lại dài hơn cái kia, map() sẽ ngừng tính toán khi nó đến cuối file có thể lặp ngắn nhất. Trong chương trình sau, ta mở rộng base_numbers với ba số bổ sung:

base_numbers = [2, 4, 6, 8, 10, 12, 14, 16] powers = [1, 2, 3, 4, 5]  numbers_powers = list(map(pow, base_numbers, powers))  print(numbers_powers) 

Kết quả là, không có gì sẽ thay đổi trong tính toán của chương trình này và vì vậy nó sẽ vẫn mang lại kết quả tương tự:

Output
[2, 16, 216, 4096, 100000]

Ta đã sử dụng hàm map() với một hàm tích hợp sẵn trong Python và thấy rằng nó có thể xử lý nhiều file lặp. Ta cũng đã xem xét rằng map() sẽ tiếp tục xử lý nhiều mục lặp cho đến khi nó đạt đến cuối mục có thể lặp lại với ít mục nhất.

Kết luận

Trong hướng dẫn này, ta đã học các cách khác nhau để sử dụng hàm map() trong Python. Đến đây bạn có thể sử dụng map() với hàm của bạn , hàm lambda và với bất kỳ hàm tích hợp nào khác. Bạn cũng có thể triển khai map() với các hàm yêu cầu nhiều lần lặp.

Trong hướng dẫn này, ta in kết quả từ map() ngay lập tức sang định dạng danh sách cho mục đích demo . Trong các chương trình của ta , ta thường sử dụng đối tượng bản đồ trả về để thao tác thêm dữ liệu.

Nếu bạn muốn tìm hiểu thêm về Python, hãy xem loạt bài Cách viết mã trong Python 3trang chủ đề Python của ta . Để tìm hiểu thêm về cách làm việc với tập dữ liệu trong lập trình hàm, hãy xem bài viết của ta về hàm filter() .


Tags:

Các tin liên quan

Cách sử dụng quy trình con để chạy các chương trình bên ngoài trong Python 3
2020-07-30
Làm thế nào để đánh lừa một mạng neural trong Python 3
2020-07-30
Cách sử dụng hàm bộ lọc Python
2020-07-24
Cách sử dụng module pathlib để thao tác đường dẫn hệ thống tệp trong Python 3
2020-07-15
Cách tạo Slackbot bằng Python trên Ubuntu 20.04
2020-06-30
Cách sử dụng ThreadPoolExecutor trong Python 3
2020-06-23
Cách sử dụng module sqlite3 trong Python 3
2020-06-02
Cách thiết lập notebook Jupyter với Python 3 trên Ubuntu 20.04 và Kết nối qua Đường hầm SSH
2020-05-19
Cách cài đặt Phân phối Python Anaconda trên Ubuntu 20.04 [Khởi động nhanh]
2020-05-19
Cách cài đặt Phân phối Python Anaconda trên Ubuntu 20.04
2020-05-06