Tin tức và phân tích của tất cả các thiết bị di động

Hàm map() của Python, được giải thích bằng các ví dụ

Trong hướng dẫn này, bạn sẽ học cách sử dụng hàm map() của Python để áp dụng một hàm cho tất cả các phần tử của một phần tử lặp.

Python hỗ trợ một mô hình lập trình hàm cho phép bạn xác định các tác vụ theo chương trình dưới dạng các hàm đánh giá. Bạn có thể coi các hàm python như các đối tượng: một hàm có thể lấy một hàm khác làm tham số và trả về một hàm khác.

Hàm map() lấy một hàm làm đối số và áp dụng nó cho tất cả các phần tử trong chuỗi.

Đến cuối hướng dẫn này, bạn sẽ có thể sử dụng hàm map() của Python để viết lại các vòng lặp và danh sách kết hợp đầy đủ. Bạn sẽ viết mã một số ví dụ để hiểu các cách khác nhau để sử dụng hàm map().

Làm cách nào để áp dụng một chức năng cho các mục danh sách python?

Hãy bắt đầu cuộc thảo luận của chúng ta bằng một ví dụ.👩‍🏫

Ở đây nums là một danh sách các số.

nums = [2,4,3,7]

Sau đó, hãy xem xét hàm self_pow(). Hàm self_pow() lấy một số làm đối số và trả về một số được nâng lên lũy thừa của chính nó: n**n.

Trong Python, toán tử lũy thừa là **. a**b trả về a nâng lên lũy thừa b, ab.

def self_pow(n):
  return n**n

VIỆC CẦN LÀM: Để tạo danh sách nums_pow mới bằng cách áp dụng hàm self_pow() cho từng thành phần của danh sách nums.

Sử dụng vòng lặp

Để làm điều này, bạn có thể sử dụng vòng lặp for trong Python:

  • Đối với mỗi số trong danh sách nums, hãy gọi self_pow() với num làm đối số.
  • Nối kết quả của lệnh gọi hàm vào danh sách mới nums_pow.
nums_pow = []

for num in nums:
  nums_pow.append(self_pow(num))

print(nums_pow)

Trong đầu ra, mỗi số được nâng lên thành chính nó. Các phần tử trong danh sách nums_pow là: 22, 44, 33,77.

Output
[4, 256, 27, 823543]

Sử dụng hiểu danh sách

Bạn có thể thực hiện việc này một cách ngắn gọn bằng cách sử dụng tính năng hiểu danh sách. Từ vòng lặp for rõ ràng ở trên, chúng ta có thể xác định biểu thức đầu ra và danh sách sẽ đi qua.

Sau đó, chúng ta có thể sửa đổi biểu thức danh sách chung:

new_list = [<output expression> for item in iterable]

Biểu thức danh sách để tạo danh sách nums_pow giống như sau:

nums_pow = [self_pow(num) for num in nums]
print(nums_pow)

Như mong đợi, đầu ra giống như khi sử dụng vòng lặp for.

Output
[4, 256, 27, 823543]

Thay vì hiểu các vòng lặp và danh sách, bạn có thể sử dụng hàm map() của python với cú pháp ngắn gọn và nó giúp áp dụng hàm này cho tất cả các phần tử trong một lần lặp. Hãy bắt đầu bằng cách tìm hiểu cú pháp hàm bản đồ.

Cú pháp hàm map() trong Python

Cú pháp chung cho hàm map() của Python như sau:

map(function, iterable_1,[iterable_2,...,iterable_n])

Hàm map() nhận ít nhất hai đối số, một hàm và một lần lặp.

Trong cú pháp trên:

  • hàm là viết tắt của hàm python hoặc bất kỳ hàm python có thể gọi nào nói chung. Điều này bao gồm các hàm, lớp, thể hiện và phương thức lớp do người dùng định nghĩa và tích hợp sẵn, v.v.
  • iterable là bất kỳ khả năng lặp lại Python hợp lệ nào, chẳng hạn như danh sách, bộ dữ liệu và chuỗi.
  • Hàm map() được áp dụng và hàm này được sử dụng cho từng phần tử trong iterable.

map() trả về cái gì?

Trả về một đối tượng bản đồ. Sau đó, bạn có thể truyền đối tượng bản đồ vào danh sách bằng cú pháp: list(map(function, iterable)).

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể chuyển nó thành một bộ Python.

Bây giờ bạn đã biết cú pháp của hàm map() trong Python, hãy bắt đầu mã hóa các ví dụ.

Bạn nên có con trăn 3.x để làm theo hướng dẫn này. Nếu không, bạn có thể chạy các đoạn mã trong trình soạn thảo python trực tuyến newsblog.pl.

Làm cách nào để sử dụng map() với các chức năng do người dùng xác định?

#1. Trước đây, chúng tôi đã áp dụng hàm self_pow() cho từng số trong danh sách số. Trong cú pháp hàm map(), chúng ta có thể truyền hàm self_pow và các số từ danh sách làm đối số.

Lưu ý: Chỉ nên chỉ định tên hàm, không phải lệnh gọi hàm. Sử dụng self_pow, không phải self_pow().

Hàm map() trả về một đối tượng bản đồ.

print(map(self_pow,nums))

<map object at 0x7f7d315c14d0>

Sau đó, chúng ta có thể chuyển đối tượng bản đồ thành một danh sách bằng cách sử dụng hàm list() như bên dưới.

nums_pow = list(map(self_pow,nums))
print(nums_pow)

Đây là kết quả trong đó mỗi num trong nums được ánh xạ tới một numnum từ danh sách nums_pow.

Output
[4, 256, 27, 823543]

#2. Hãy xem xét hàm inch_to_cm() sau để chuyển đổi inch thành centimet. 1 inch = 2.54 cm.

def inch_to_cm(inch):
  return inch*2.54

Để chuyển đổi các giá trị inches trong danh sách inches sang centimet, bạn có thể sử dụng hàm map() như trong ô mã bên dưới.

inches = [5.54,3.4,1,25,8.2]
cms = list(map(inch_to_cm,inches))
print(cms)

Danh sách cms chứa các giá trị tính bằng inch được biểu thị bằng centimet.

Output
[14.0716, 8.636, 2.54, 63.5, 20.828]

Làm cách nào để sử dụng map() với các chức năng tích hợp?

Trong phần này, chúng ta sẽ học cách sử dụng map() với các hàm dựng sẵn trong Python.

#1. Danh sách chuỗi là một danh sách các ngôn ngữ lập trình. Bạn muốn tạo một danh sách mới strings_upper chứa các chuỗi ngôn ngữ lập trình viết hoa.

strings = ['JavaScript','Rust','Python','Go']

Phương thức chuỗi tích hợp .upper() hoạt động trên một chuỗi và trả về một bản sao viết hoa.

strings_upper = list(map(str.upper,strings)) 
print(strings_upper)

Danh sách strings_upper chứa các chuỗi trong chuỗi danh sách chữ hoa.

Output
['JAVASCRIPT', 'RUST', 'PYTHON', 'GO']

#2. Hàm len() tích hợp sẵn của Python lấy một chuỗi làm đối số và trả về độ dài của nó. Để tìm độ dài của mỗi chuỗi trong danh sách các chuỗi, chúng ta có thể sử dụng hàm map() và áp dụng hàm độ dài cho mỗi chuỗi như hình bên dưới.

strings_len = list(map(len,strings))
print(strings_len)
Output
[10, 4, 6, 2]

#3. Bạn có thể sử dụng map() với các bộ sưu tập khác như bộ dữ liệu.

Ví dụ sau chứa một bộ dữ liệu chứa thông tin về số phòng ngủ, diện tích vuông và thành phố nơi ngôi nhà tọa lạc.

Trong Python, hàm type() trả về kiểu dữ liệu của bất kỳ đối tượng Python nào. Để lấy kiểu dữ liệu của tất cả các phần tử trong bộ này, bạn có thể sử dụng hàm map() để gọi hàm kiểu trên từng phần tử của bộ.

house = (2,758.5,'Bangalore')
house_elt_type = tuple(map(type,house))
print(house_elt_type)

Chúng tôi đã đặt một đối tượng bản đồ vào một bộ dữ liệu. Bạn cũng có thể tải lên danh sách hoặc bất kỳ bộ sưu tập nào khác.

Trong kết quả bên dưới, chúng ta có thể thấy rằng các kiểu dữ liệu 2758,5 và Bangalore lần lượt được suy ra là ‘int’, ‘float’ và ‘str’.

Output
(<class 'int'>, <class 'float'>, <class 'str'>)

#4. Trong Python, bạn có thể nhập các mô-đun tích hợp sẵn và sử dụng các hàm được xác định trong các mô-đun.

Để tính căn bậc hai của mỗi số trong danh sách nums, bạn có thể sử dụng hàm căn bậc hai sqrt từ mô-đun toán học.

import math
nums = [30,90,34,45,97]
nums_sqrt = list(map(math.sqrt,nums))
print(nums_sqrt)
Output
[5.477225575051661, 9.486832980505138, 5.830951894845301, 6.708203932499369, 9.848857801796104]

Đầu ra ở trên khó phân tích và theo dõi. Bạn có thể muốn làm tròn mỗi giá trị căn bậc hai để nói hai chữ số thập phân.

Làm cách nào để làm tròn số dấu phẩy động trong Python?

Hãy định nghĩa một hàm round_2() nhận một giá trị dấu chấm động và làm tròn nó đến hai chữ số thập phân.

def round_2(num):
  return round(num,2)

Bây giờ bạn có thể sử dụng hàm map() với danh sách round_2 và nums_sqrt.

nums_sqrt_round = list(map(round_2,nums_sqrt))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Bạn cũng có thể sử dụng các hàm map() lồng nhau trong đó hàm map bên trong được sử dụng để tính danh sách các căn bậc hai của nums_sqrt và hàm map bên ngoài thực hiện thao tác làm tròn.

nums_sqrt_round = list(map(round_2,list(map(math.sqrt,nums))))
print(nums_sqrt_round)
Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Các kết quả là giống hệt nhau trong cả hai cách tiếp cận trên. Tuy nhiên, bạn phải đảm bảo rằng mã của bạn có thể đọc được và có thể bảo trì khi lồng các chức năng như hình trên.

Cách sử dụng map() với hàm lambda

Trong các chương trước, bạn đã học cách sử dụng hàm map() của Python với các hàm có sẵn và do người dùng định nghĩa. Bây giờ bạn sẽ học cách sử dụng map() với các hàm lambda ẩn danh trong Python.

Đôi khi, bạn sẽ có một hàm mà phần nội dung của nó chỉ chứa một dòng mã và bạn có thể chỉ cần sử dụng hàm đó một lần và không cần tham chiếu hàm đó ở nơi khác trong chương trình. Bạn có thể định nghĩa các hàm như vậy dưới dạng hàm lambda trong Python.

Lưu ý: đối số lambda: biểu thức là cú pháp chung để sử dụng các hàm lambda của Python.

#1. Hãy xem xét các chuỗi danh sách sau đây. Giả sử bạn muốn lấy danh sách strings_rev – chứa bản sao đảo ngược của mỗi chuỗi.

strings = ['JavaScript','Rust','Python','Go']

Chúng ta có thể đảo ngược một chuỗi trong Python bằng cách cắt chuỗi.

Lưu ý: đây là tổng quát của biểu thức tước chuỗi str[start:stop:step].

– Không có giá trị bắt đầu và kết thúc, lát bắt đầu ở đầu chuỗi và kéo dài đến cuối chuỗi.
– Giá trị bước âm tạo ra các lát cắt bắt đầu từ cuối chuỗi.
– Chính vì thế p[::-1] trả về một bản sao đảo ngược của str.

Bạn có thể sử dụng hàm lambda này: lambda x:x[::-1]Bên trong chức năng bản đồ như hình bên dưới.

strings_rev = list(map(lambda x:x[::-1],strings))
print(strings_rev)

Như trong các ví dụ khác, chúng tôi truyền đối tượng bản đồ vào một danh sách. Ở đầu ra, chúng ta thấy rằng mỗi chuỗi trong chuỗi của danh sách đã bị đảo ngược.

Output
['tpircSavaJ', 'tsuR', 'nohtyP', 'oG']

#2. Trong phần trước, chúng ta đã tính căn bậc hai của mỗi số trong danh sách các số, sau đó làm tròn mỗi giá trị căn bậc hai đến hai chữ số thập phân.

Chúng tôi đã sử dụng hàm round_2() cho mục đích này. Hãy viết lại hàm round_2() dưới dạng hàm lambda và sử dụng nó với hàm map() được mô tả bên dưới.

nums_sqrt_round_l =list(map(lambda num:round(num,2),nums_sqrt))
print(nums_sqrt_round_l)

Như bạn có thể thấy bên dưới, kết quả đầu ra giống với kết quả chúng ta có với hàm round_2().

Output
[5.48, 9.49, 5.83, 6.71, 9.85]

Làm cách nào để sử dụng map() với nhiều trình vòng lặp?

Trong các ví dụ chúng ta đã xem, chúng ta đã áp dụng hàm này cho tất cả các phần tử của chính xác một lần lặp.

Đôi khi chúng ta có thể có các hàm nhận hai hoặc nhiều đối số. Trong trường hợp này, mỗi đối số được lưu trữ trong một danh sách hoặc bất kỳ bộ sưu tập tương tự nào.

Chúng ta cũng có thể sử dụng hàm map() của Python với nhiều danh sách.

#1. Hãy xem xét hàm area() sau đây, hàm này lấy chiều dài và chiều rộng làm đầu vào và trả về một diện tích, chiều dài*chiều rộng.

def area(length,breadth):
  return length*breadth

Chiều dài và chiều rộng của các hình chữ nhật khác nhau được lưu trữ trong hai danh sách riêng biệt, chiều dài và chiều rộng tương ứng.

lengths = [4,8,10,18]
breadths = [9,4,6,11]

Chúng ta có thể sử dụng hàm map() để áp dụng hàm diện tích cho các danh sách ở trên, chuyển cả danh sách dài và rộng.

areas = list(map(area,lengths,breadths))
print(areas)

Do vùng chức năng nhận hai đối số nên các giá trị chiều dài và chiều rộng được sử dụng tương ứng từ danh sách chiều dài và chiều rộng.

Output
[36, 32, 60, 198]

#2. Mô-đun toán học của Python có hàm log giúp chúng ta tính logarit của một số với cơ số bất kỳ.

Lưu ý: log(x, cơ số) trả về log x cho cơ số được cho bởi cơ số của log cơ số x. Nếu cơ số không được chỉ định, cơ số sẽ mặc định là e (log tính logarit tự nhiên).

Trong ví dụ này:

  • Danh sách x tương ứng với các giá trị mà bạn muốn tính logarit.
  • Danh sách cơ số chứa tất cả các giá trị cơ số sẽ được sử dụng trong phép tính logarit.
x = [2,6,12,10]
base = [2,3,2,5]

Chúng ta có thể sử dụng hàm map() của python với math.log, list, x và base để lấy danh sách log_x mới như sau.

log_x = list(map(math.log,x,base))
print(log_x)

Đây là kết quả.

Output
[1.0, 1.6309297535714573, 3.5849625007211565, 1.4306765580733933]

Đăng kí

Dưới đây là tóm tắt những gì bạn đã học được trong hướng dẫn này:

  • Hàm map() của Python nhận ít nhất hai đối số: một hàm và một đối số có thể lặp lại, với cú pháp map(function, iterable(s)).
  • Hàm này có thể là bất kỳ hàm nào có thể gọi hợp lệ trong Python.
  • Khi hàm nhận k đối số, hãy sử dụng map() với hàm và mỗi k đối số trong lần lặp.

Sau đó học cách làm việc với các tập hợp trong Python.

Mục lục