Sự khác biệt giữa bản đồ và bộ lọc trong Python là gì?

Các hàm

def add[x,y]:
	return x + y
8,
def add[x,y]:
	return x + y
9 và
lambda x, y: x + y
0 mang lại một chút lập trình hàm cho Python. Cả ba hàm này đều là các hàm tiện lợi có thể được thay thế bằng các vòng lặp hoặc Hiểu danh sách, nhưng cung cấp một cách tiếp cận ngắn gọn và thanh lịch hơn cho một số vấn đề

Trước khi tiếp tục, chúng ta sẽ điểm qua một số điều bạn nên làm quen trước khi đọc về các phương pháp nói trên

Hàm/phương thức ẩn danh hoặc lambda là gì?

Một phương thức ẩn danh là một phương thức không có tên, tôi. e. không bị ràng buộc với một mã định danh như khi chúng ta định nghĩa một phương thức bằng cách sử dụng

lambda x, y: x + y
1

Ghi chú. Mặc dù hầu hết mọi người sử dụng thuật ngữ "hàm ẩn danh" và "hàm lambda" thay thế cho nhau - chúng không giống nhau. Lỗi này xảy ra bởi vì trong hầu hết các ngôn ngữ lập trình, lambda đều ẩn danh và tất cả các hàm ẩn danh đều là lambda. Đây cũng là trường hợp trong Python. Vì vậy, chúng ta sẽ không đi sâu vào sự khác biệt này trong bài viết này.

Cú pháp của hàm lambda [hoặc toán tử lambda] là gì?

lambda arguments: expression

Hãy nghĩ về lambdas như các phương thức một dòng không có tên. Ví dụ, chúng hoạt động giống như bất kỳ phương thức nào khác trong Python

def add[x,y]:
	return x + y

Có thể được dịch sang

lambda x, y: x + y

Lambda khác với các phương thức Python thông thường vì chúng chỉ có thể có một biểu thức, không thể chứa bất kỳ câu lệnh nào và kiểu trả về của chúng là đối tượng

lambda x, y: x + y
2. Vì vậy, dòng mã trên không trả về chính xác giá trị
lambda x, y: x + y
3 mà là hàm tính toán
lambda x, y: x + y
3

Tại sao lambda lại liên quan đến

def add[x,y]:
	return x + y
8,
def add[x,y]:
	return x + y
9 và
lambda x, y: x + y
0?

Cả ba phương thức này đều mong đợi một đối tượng

lambda x, y: x + y
2 làm đối số đầu tiên. Đối tượng
lambda x, y: x + y
2 này có thể là một phương thức được xác định trước với một tên [như
def add[x,y]:
	return x + y
50]

Mặc dù, thường xuyên hơn không, các hàm được truyền cho

def add[x,y]:
	return x + y
8,
def add[x,y]:
	return x + y
9 và
lambda x, y: x + y
0 là những hàm bạn chỉ sử dụng một lần, do đó, thường không có ích gì khi xác định hàm có thể tham chiếu

Để tránh xác định một chức năng mới cho các nhu cầu khác nhau của bạn về

def add[x,y]:
	return x + y
8/
def add[x,y]:
	return x + y
9/
lambda x, y: x + y
0 - một giải pháp tinh tế hơn sẽ là sử dụng một chức năng ẩn danh, dùng một lần, ngắn mà bạn sẽ chỉ sử dụng một lần và không bao giờ sử dụng lại - lambda

Hàm map[]

Hàm

def add[x,y]:
	return x + y
8 lặp qua tất cả các mục trong iterable đã cho và thực thi
lambda x, y: x + y
2 mà chúng tôi đã chuyển làm đối số cho từng mục

Cú pháp là

def add[x,y]:
	return x + y
5

Chúng ta có thể truyền bao nhiêu đối tượng có thể lặp tùy ý sau khi truyền

lambda x, y: x + y
2 mà chúng ta muốn sử dụng

Mã này sẽ dẫn đến

lambda x, y: x + y
6

Như chúng ta có thể thấy, chúng ta đã kết thúc với một danh sách mới trong đó hàm

lambda x, y: x + y
60 được đánh giá cho từng phần tử trong danh sách
lambda x, y: x + y
61. Kết quả của chức năng này đã được thêm vào danh sách một cách tuần tự

Một cách hay hơn để làm điều tương tự chính xác này là sử dụng lambdas

lambda x, y: x + y
9

Chúng tôi nhận được cùng một đầu ra

lambda x, y: x + y
6

Ghi chú. Bạn có thể nhận thấy rằng chúng tôi đã truyền

lambda x, y: x + y
62 vào một danh sách để in giá trị của từng phần tử. Chúng tôi đã làm điều này bởi vì gọi
lambda x, y: x + y
63 trong danh sách sẽ in các giá trị thực của các phần tử. Thay vào đó, gọi
lambda x, y: x + y
63 trên
lambda x, y: x + y
62 sẽ in địa chỉ bộ nhớ của các giá trị

Hàm

def add[x,y]:
	return x + y
8 trả về loại
lambda x, y: x + y
62, có thể lặp lại và chúng tôi cũng có thể in kết quả như thế này

lambda x, y: x + y
7

Thay vào đó, nếu bạn muốn hàm

def add[x,y]:
	return x + y
8 trả về một danh sách, bạn có thể truyền nó khi gọi hàm

Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó

lambda x, y: x + y
9

Chức năng bộ lọc []

Tương tự như

def add[x,y]:
	return x + y
8,
def add[x,y]:
	return x + y
9 lấy một đối tượng
lambda x, y: x + y
2 và một iterable và tạo một danh sách mới

Như tên gợi ý,

def add[x,y]:
	return x + y
9 tạo thành một danh sách mới chỉ chứa các phần tử thỏa mãn một điều kiện nhất định, i. e. các
lambda x, y: x + y
2 chúng tôi đã thông qua trả về
lambda x, y: x + y
94

Cú pháp là

lambda arguments: expression
6

Sử dụng ví dụ trước, chúng ta có thể thấy rằng danh sách mới sẽ chỉ chứa các phần tử mà hàm

lambda x, y: x + y
60 trả về
lambda x, y: x + y
94

Chạy mã này sẽ dẫn đến một danh sách ngắn hơn

def add[x,y]:
	return x + y
0

Hoặc, viết lại bằng lambda

def add[x,y]:
	return x + y
1

In ấn cho chúng ta cùng một đầu ra

def add[x,y]:
	return x + y
0

Hàm giảm []

lambda x, y: x + y
0 hoạt động khác với
def add[x,y]:
	return x + y
8 và
def add[x,y]:
	return x + y
9. Nó không trả về một danh sách mới dựa trên
lambda x, y: x + y
2 và có thể lặp lại mà chúng tôi đã thông qua. Thay vào đó, nó trả về một giá trị duy nhất

Ngoài ra, trong Python 3,

lambda x, y: x + y
0 không còn là hàm tích hợp nữa và có thể tìm thấy hàm này trong mô-đun
lambda x, y: x + y
62

Cú pháp là

def add[x,y]:
	return x + y
3

lambda x, y: x + y
0 hoạt động bằng cách gọi
lambda x, y: x + y
2 mà chúng tôi đã chuyển cho hai mục đầu tiên trong chuỗi. Kết quả trả về bởi
lambda x, y: x + y
2 được sử dụng trong một lệnh gọi khác tới
lambda x, y: x + y
2 cùng với phần tử tiếp theo [thứ ba trong trường hợp này],

Quá trình này lặp lại cho đến khi chúng tôi đi qua tất cả các phần tử trong chuỗi

Đối số tùy chọn

lambda x, y: x + y
67 được sử dụng, khi có mặt, ở đầu "vòng lặp" này với phần tử đầu tiên trong lệnh gọi đầu tiên tới
lambda x, y: x + y
2. Theo một cách nào đó, phần tử
lambda x, y: x + y
67 là phần tử thứ 0, trước phần tử đầu tiên, khi được cung cấp

lambda x, y: x + y
0 khó hiểu hơn một chút so với
def add[x,y]:
	return x + y
8 và
def add[x,y]:
	return x + y
9, vì vậy hãy xem ví dụ từng bước

  1. Chúng tôi bắt đầu với một danh sách

    lambda x, y: x + y
    
    73 và chuyển hàm
    lambda x, y: x + y
    
    74 cho
    lambda x, y: x + y
    
    0 bên cạnh danh sách này, không có giá trị
    lambda x, y: x + y
    
    67

  2. lambda x, y: x + y
    
    0 cuộc gọi
    lambda x, y: x + y
    
    78 và
    lambda x, y: x + y
    
    79 trả về
    lambda x, y: x + y
    
    90

  3. lambda x, y: x + y
    
    0 cuộc gọi
    lambda x, y: x + y
    
    92 [kết quả của cuộc gọi trước tới
    lambda x, y: x + y
    
    79 và phần tử tiếp theo trong danh sách dưới dạng tham số] và
    lambda x, y: x + y
    
    79 trả về
    lambda x, y: x + y
    
    95

  4. lambda x, y: x + y
    
    0 cuộc gọi
    lambda x, y: x + y
    
    97 và
    lambda x, y: x + y
    
    79 trả về
    lambda x, y: x + y
    
    99

  5. Vì không còn phần tử nào trong chuỗi, nên

    lambda x, y: x + y
    
    0 trả về
    lambda x, y: x + y
    
    99

Sự khác biệt duy nhất, nếu chúng tôi đã đưa ra một giá trị

lambda x, y: x + y
67 sẽ là một bước bổ sung - 1. 5. trong đó
lambda x, y: x + y
0 sẽ gọi
lambda arguments: expression
64 và sử dụng giá trị trả về đó trong bước 2

Hãy tiếp tục và sử dụng hàm

lambda x, y: x + y
0

def add[x,y]:
	return x + y
4

Chạy mã này sẽ mang lại

def add[x,y]:
	return x + y
5

Một lần nữa, điều này có thể được viết bằng lambdas

def add[x,y]:
	return x + y
6

Và mã sẽ dẫn đến

def add[x,y]:
	return x + y
7

Phần kết luận

Như đã đề cập trước đây, các chức năng này là chức năng tiện lợi. Chúng ở đó để bạn có thể tránh viết mã rườm rà hơn, nhưng tránh sử dụng quá nhiều cả chúng và biểu thức lambda

Đừng ép buộc những công cụ này bởi vì "bạn có thể", vì nó thường có thể dẫn đến mã không đọc được và khó bảo trì. Chỉ sử dụng chúng khi hoàn toàn rõ ràng điều gì đang xảy ra ngay khi bạn nhìn vào hàm hoặc biểu thức lambda

Nếu bạn thấy mình đang vật lộn để khớp logic cần thiết vào một hàm

def add[x,y]:
	return x + y
8 hoặc một biểu thức lambda, thì tốt hơn hết là bạn chỉ nên viết một phương thức vòng lặp/xác định dài hơn một chút và tránh nhầm lẫn không cần thiết sau này

Sự khác biệt giữa bộ lọc và bản đồ là gì?

Bản đồ. trả về một mảng các mẩu thông tin từ mảng ban đầu. Trong hàm gọi lại, trả về dữ liệu bạn muốn là một phần của mảng mới. Lọc. trả về một tập hợp con của mảng ban đầu dựa trên tiêu chí tùy chỉnh

Sự khác biệt giữa bản đồ [] và bộ lọc [] trong Python là gì?

Bản đồ[]. Thực hiện thao tác tương tự trên tất cả các phần tử trong một lần lặp. Một ví dụ đang thực hiện chuyển đổi nhật ký trên từng phần tử. Lọc[]. Lọc một tập hợp con các phần tử đáp ứng [các] điều kiện nhất định. Một ví dụ là lọc ra các câu có chứa một chuỗi cụ thể

Sự khác biệt giữa bản đồ bộ lọc và giảm trong Python là gì?

reduce[] hoạt động khác với map[] và filter[]. Nó không trả về một danh sách mới dựa trên chức năng và khả năng lặp lại mà chúng tôi đã thông qua. Thay vào đó, nó trả về một giá trị duy nhất. Ngoài ra, trong Python 3, reduce[] không còn là hàm tích hợp nữa và có thể tìm thấy hàm này trong mô-đun funcools

Sự khác biệt giữa bộ lọc và giảm bản đồ là gì?

Hàm reduce[] của Python không trả về một chuỗi mới như map[] và filter[]. Thay vào đó, nó trả về một giá trị duy nhất . Cú pháp tương tự như hai hàm còn lại. reduce[] áp dụng hàm cho các phần tử của dãy, từ trái sang phải, bắt đầu với hai phần tử đầu tiên của dãy.

Chủ Đề