Làm thế nào để bạn sử dụng chức năng ẩn danh trong python?

Hàm Lambda trong lập trình Python là hàm ẩn danh hoặc hàm không có tên. Đây là một chức năng nhỏ và hạn chế không có nhiều hơn một dòng. Giống như hàm thông thường, hàm Lambda có thể có nhiều đối số với một biểu thức

Trong Python, biểu thức lambda (hoặc biểu mẫu lambda) được sử dụng để xây dựng hàm ẩn danh. Để làm như vậy, bạn sẽ sử dụng từ khóa lambda (giống như bạn sử dụng def để xác định các hàm thông thường). Mọi chức năng ẩn danh bạn xác định trong Python sẽ có 3 phần thiết yếu

  • từ khóa lambda
  • Các tham số (hoặc biến ràng buộc) và
  • cơ thể chức năng

Một hàm lambda có thể có bất kỳ số lượng tham số nào, nhưng thân hàm chỉ có thể chứa một biểu thức. Hơn nữa, lambda được viết trong một dòng mã và cũng có thể được gọi ngay lập tức. Bạn sẽ thấy tất cả điều này hoạt động trong các ví dụ sắp tới

Trong hướng dẫn Lambda trong Python này, bạn sẽ học

Cú pháp và ví dụ

Cú pháp chính thức để viết hàm lambda như dưới đây

lambda p1, p2: expression

Ở đây, p1 và p2 là các tham số được truyền cho hàm lambda. Bạn có thể thêm nhiều hay ít tham số tùy ý

Tuy nhiên, lưu ý rằng chúng tôi không sử dụng dấu ngoặc xung quanh các tham số như chúng tôi làm với các chức năng thông thường. Phần cuối cùng (biểu thức) là bất kỳ biểu thức python hợp lệ nào hoạt động trên các tham số bạn cung cấp cho hàm

ví dụ 1

Bây giờ bạn đã biết về lambdas, hãy thử với một ví dụ. Vì vậy, hãy mở IDLE của bạn và nhập thông tin sau

adder = lambda x, y: x + y
print (adder (1, 2))

Đây là đầu ra

3

Giải thích mã

Ở đây, chúng tôi xác định một biến sẽ giữ kết quả được trả về bởi hàm lambda

1. Từ khóa lambda được sử dụng để xác định hàm ẩn danh

2. x và y là các tham số mà chúng ta truyền cho hàm lambda

3. Đây là phần thân của hàm, hàm này sẽ thêm 2 tham số mà chúng ta đã truyền vào. Lưu ý rằng nó là một biểu thức duy nhất. Bạn không thể viết nhiều câu lệnh trong phần thân của hàm lambda

4. Chúng tôi gọi hàm và in giá trị trả về

ví dụ 2

Đó là một ví dụ cơ bản để hiểu các nguyên tắc cơ bản và cú pháp của lambda. Bây giờ, hãy thử in ra một lambda và xem kết quả. Một lần nữa, hãy mở IDLE của bạn và nhập thông tin sau

#What a lambda returns
string='some kind of a useless lambda'
print(lambda string : print(string))


Bây giờ hãy lưu tệp của bạn và nhấn F5 để chạy chương trình. Đây là đầu ra bạn sẽ nhận được

đầu ra

 at 0x00000185C3BF81E0>

Điều gì đang xảy ra ở đây?

Giải thích mã

  1. Ở đây, chúng tôi xác định một chuỗi mà bạn sẽ chuyển làm tham số cho lambda
  2. Chúng tôi khai báo một lambda gọi câu lệnh in và in kết quả

Nhưng tại sao chương trình không in chuỗi mà chúng ta truyền vào? . Trong ví dụ này, lambda không được gọi bởi hàm in mà chỉ trả về đối tượng hàm và vị trí bộ nhớ nơi nó được lưu trữ. Đó là những gì được in tại bàn điều khiển

ví dụ 3

Tuy nhiên, nếu bạn viết một chương trình như thế này

#What a lambda returns #2
x="some kind of a useless lambda"
(lambda x : print(x))(x)

Và chạy nó bằng cách nhấn F5, bạn sẽ thấy kết quả như thế này

đầu ra

some kind of a useless lambda

Bây giờ, lambda đang được gọi và chuỗi chúng tôi truyền vào sẽ được in tại bàn điều khiển. Nhưng cú pháp kỳ lạ đó là gì và tại sao định nghĩa lambda lại nằm trong ngoặc đơn?

Giải thích mã

  1. Đây là cùng một chuỗi mà chúng tôi đã xác định trong ví dụ trước
  2. Trong phần này, chúng tôi đang xác định một lambda và gọi nó ngay lập tức bằng cách chuyển chuỗi làm đối số. Đây là thứ được gọi là IIFE và bạn sẽ tìm hiểu thêm về nó trong các phần sắp tới của hướng dẫn này

Ví dụ 4

Hãy xem một ví dụ cuối cùng để hiểu cách lambdas và các hàm thông thường được thực thi. Vì vậy, hãy mở IDLE của bạn và trong một tệp mới, hãy nhập thông tin sau

#A REGULAR FUNCTION
def guru( funct, *args ):
funct( *args )
def printer_one( arg ):
return print (arg)
def printer_two( arg ):
print(arg)
#CALL A REGULAR FUNCTION 
guru( printer_one, 'printer 1 REGULAR CALL' )
guru( printer_two, 'printer 2 REGULAR CALL \n' )
#CALL A REGULAR FUNCTION THRU A LAMBDA
guru(lambda: printer_one('printer 1 LAMBDA CALL'))
guru(lambda: printer_two('printer 2 LAMBDA CALL'))

Bây giờ, lưu tệp và nhấn F5 để chạy chương trình. Nếu bạn không mắc lỗi nào, đầu ra sẽ giống như thế này

đầu ra

máy in 1 CUỘC GỌI THƯỜNG XUYÊN

máy in 2 CUỘC GỌI THƯỜNG XUYÊN

máy in 1 CUỘC GỌI LAMBDA

máy in 2 GỌI LAMBDA

Giải thích mã

  1. Một hàm gọi là guru nhận một hàm khác làm tham số đầu tiên và bất kỳ đối số nào khác theo sau nó
  2. printer_one là một hàm đơn giản in tham số được truyền cho nó và trả về nó
  3. printer_two tương tự như printer_one nhưng không có câu lệnh return
  4. Trong phần này, chúng tôi đang gọi hàm guru và chuyển các hàm máy in và một chuỗi làm tham số
  5. Đây là cú pháp để đạt được bước thứ tư (i. e. , gọi hàm guru) nhưng sử dụng lambdas

Trong phần tiếp theo, bạn sẽ tìm hiểu cách sử dụng các hàm lambda với map(), reduce() và filter() trong Python

Sử dụng lambdas với Python tích hợp sẵn

Các hàm lambda cung cấp một cách đơn giản và mạnh mẽ để thực hiện các thao tác bằng cách sử dụng các phương thức tích hợp sẵn trong Python. Có thể bởi vì lambdas có thể được gọi ngay lập tức và được chuyển thành đối số cho các hàm này

IIFE bằng Python Lambda

IIFE là viết tắt của thực thi chức năng được gọi ngay lập tức. Điều đó có nghĩa là một hàm lambda có thể gọi được ngay khi nó được xác định. Hãy hiểu điều này với một ví dụ;

________số 8_______

Đây là đầu ra và giải thích mã

Khả năng gọi lambdas này ngay lập tức cho phép bạn sử dụng chúng bên trong các hàm như map() và reduce(). Nó hữu ích vì bạn có thể không muốn sử dụng lại các chức năng này

lambdas trong bộ lọc()

Chức năng bộ lọc được sử dụng để chọn một số phần tử cụ thể từ một chuỗi các phần tử. Trình tự có thể là bất kỳ trình vòng lặp nào như danh sách, bộ, bộ, v.v.

Các phần tử sẽ được chọn dựa trên một số ràng buộc được xác định trước. Cần 2 tham số

  • Hàm xác định ràng buộc lọc
  • Một chuỗi (bất kỳ trình vòng lặp nào như danh sách, bộ dữ liệu, v.v. )

Ví dụ,

sequences = [10,2,8,7,5,4,3,11,0, 1]
filtered_result = filter (lambda x: x > 4, sequences) 
print(list(filtered_result))

Đây là đầu ra

adder = lambda x, y: x + y
print (adder (1, 2))
0

Giải thích mã

1. Trong câu lệnh đầu tiên, chúng tôi xác định một danh sách có tên là dãy có chứa một số số

2. Ở đây, chúng ta khai báo một biến có tên làfilter_result, biến này sẽ lưu trữ các giá trị được lọc trả về bởi hàm filter()

3. Hàm lambda chạy trên từng phần tử của danh sách và trả về true nếu nó lớn hơn 4

4. In kết quả trả về của hàm lọc

lambdas trong bản đồ()

chức năng bản đồ được sử dụng để áp dụng một thao tác cụ thể cho mọi phần tử trong chuỗi. Giống như filter(), nó cũng nhận 2 tham số

  1. Một chức năng xác định op để thực hiện trên các phần tử
  2. Một hoặc nhiều trình tự

Ví dụ, đây là một chương trình in các ô vuông của các số trong một danh sách đã cho

adder = lambda x, y: x + y
print (adder (1, 2))
1

đầu ra

adder = lambda x, y: x + y
print (adder (1, 2))
2

[KR1]

Giải thích mã

  1. Ở đây, chúng tôi xác định một danh sách được gọi là dãy có chứa một số số
  2. Chúng tôi khai báo một biến có tên làfilter_result sẽ lưu trữ các giá trị được ánh xạ
  3. Hàm lambda chạy trên từng phần tử của danh sách và trả về bình phương của số đó
  4. In kết quả trả về của hàm map

lambdas trong giảm()

Hàm rút gọn, như map(), được sử dụng để áp dụng một thao tác cho mọi phần tử trong chuỗi. Tuy nhiên, nó khác với bản đồ trong hoạt động của nó. Đây là các bước tiếp theo của hàm reduce() để tính toán đầu ra

Bước 1) Thực hiện phép toán đã xác định trên 2 phần tử đầu tiên của dãy

Bước 2) Lưu kết quả này

Bước 3) Thực hiện thao tác với kết quả đã lưu và phần tử tiếp theo trong dãy

Bước 4) Lặp lại cho đến khi không còn phần tử nào nữa

Nó cũng nhận hai tham số

  1. Một chức năng xác định hoạt động được thực hiện
  2. Một chuỗi (bất kỳ trình vòng lặp nào như danh sách, bộ dữ liệu, v.v. )

Ví dụ: đây là chương trình trả về tích của tất cả các phần tử trong danh sách

adder = lambda x, y: x + y
print (adder (1, 2))
3

Đây là đầu ra

adder = lambda x, y: x + y
print (adder (1, 2))
4

Giải thích mã

  1. Nhập giảm từ mô-đun funcools
  2. Ở đây, chúng tôi xác định một danh sách được gọi là dãy có chứa một số số
  3. Chúng tôi khai báo một biến được gọi là sản phẩm sẽ lưu trữ giá trị giảm
  4. Hàm lambda chạy trên từng phần tử của danh sách. Nó sẽ trả về sản phẩm của số đó theo kết quả trước đó
  5. In kết quả trả về của hàm rút gọn

Tại sao (và tại sao không) sử dụng hàm lambda?

Như bạn sẽ thấy trong phần tiếp theo, lambda được xử lý giống như các hàm thông thường ở cấp độ trình thông dịch. Theo một cách nào đó, bạn có thể nói rằng lambdas cung cấp cú pháp nhỏ gọn để viết các hàm trả về một biểu thức duy nhất

Tuy nhiên, bạn nên biết khi nào nên sử dụng lambdas và khi nào nên tránh chúng. Trong phần này, bạn sẽ tìm hiểu một số nguyên tắc thiết kế được các nhà phát triển python sử dụng khi viết lambdas

Một trong những trường hợp sử dụng lambdas phổ biến nhất là trong lập trình hàm vì Python hỗ trợ một mô hình (hoặc phong cách) lập trình được gọi là lập trình hàm

Nó cho phép bạn cung cấp một hàm dưới dạng tham số cho một hàm khác (ví dụ: trong bản đồ, bộ lọc, v.v. ). Trong những trường hợp như vậy, sử dụng lambdas cung cấp một cách hay để tạo hàm một lần và chuyển nó làm tham số

Khi nào thì không nên sử dụng Lambda?

Bạn không bao giờ nên viết các hàm lambda phức tạp trong môi trường sản xuất. Sẽ rất khó để các lập trình viên duy trì mã của bạn giải mã nó. Nếu bạn thấy mình đang tạo các biểu thức một dòng phức tạp, thì việc xác định một hàm phù hợp sẽ là một cách tốt hơn nhiều. Tốt nhất, bạn cần nhớ rằng mã đơn giản luôn tốt hơn mã phức tạp

Lambda vs. chức năng thông thường

Như đã nêu trước đây, lambdas là [vV4][J5] chỉ là các hàm không có mã định danh được liên kết với chúng. Nói một cách đơn giản hơn, chúng là các hàm không có tên (do đó, ẩn danh). Dưới đây là bảng minh họa sự khác biệt giữa lambdas và các hàm thông thường trong python

thịt cừu

Chức năng thông thường

cú pháp

adder = lambda x, y: x + y
print (adder (1, 2))
5

cú pháp

adder = lambda x, y: x + y
print (adder (1, 2))
6

Các hàm lambda chỉ có thể có một biểu thức trong phần thân của chúng

Các hàm thông thường có thể có nhiều biểu thức và câu lệnh trong phần thân của chúng

Lambdas không có tên liên quan đến chúng. Đó là lý do tại sao chúng còn được gọi là hàm ẩn danh

Các hàm thông thường phải có tên và chữ ký

Lambdas không chứa câu lệnh trả về vì phần thân được trả về tự động

Các chức năng cần trả về giá trị nên bao gồm một câu lệnh trả về

Giải thích về sự khác biệt?

Sự khác biệt chính giữa hàm lambda và hàm thông thường là hàm lambda chỉ đánh giá một biểu thức duy nhất và tạo ra một đối tượng hàm. Do đó, chúng ta có thể đặt tên cho kết quả của hàm lambda và sử dụng nó trong chương trình của mình như chúng ta đã làm trong ví dụ trước

Một chức năng thông thường cho ví dụ trên sẽ trông như thế này

adder = lambda x, y: x + y
print (adder (1, 2))
7

Ở đây, chúng ta phải xác định tên cho hàm trả về kết quả khi chúng ta gọi nó. Hàm lambda không chứa câu lệnh trả về vì nó sẽ chỉ có một biểu thức luôn được trả về theo mặc định. Bạn thậm chí không phải chỉ định lambda vì nó có thể được gọi ngay lập tức (xem phần tiếp theo). Như bạn sẽ thấy trong ví dụ sau, lambdas trở nên đặc biệt mạnh mẽ khi chúng ta sử dụng chúng với các hàm dựng sẵn của Python

Tuy nhiên, bạn vẫn có thể thắc mắc lambda khác với hàm trả về một biểu thức duy nhất như thế nào (như ở trên). Ở cấp độ thông dịch viên, không có nhiều khác biệt. Nghe có vẻ ngạc nhiên, nhưng bất kỳ hàm lambda nào bạn định nghĩa trong Python đều được trình thông dịch coi là hàm bình thường

Như bạn có thể thấy trong sơ đồ, hai định nghĩa được trình thông dịch python xử lý theo cùng một cách khi được chuyển đổi thành mã byte. Bây giờ, bạn không thể đặt tên hàm lambda vì nó đã được đặt trước bởi Python, nhưng bất kỳ tên hàm nào khác sẽ mang lại cùng mã byte[KR6]

Hàm ẩn danh trong Python có nghĩa là gì?

Hàm ẩn danh trong Python là hàm không có tên khi được định nghĩa . Trong Python, từ khóa lambda được sử dụng để định nghĩa các hàm ẩn danh thay vì từ khóa def được sử dụng cho các hàm thông thường. Do đó, hàm lambda là tên gọi khác của hàm ẩn danh.

Khi nào bạn nên sử dụng hàm ẩn danh?

Ưu điểm của hàm ẩn danh là không cần phải lưu trữ trong một tệp riêng. Điều này có thể đơn giản hóa rất nhiều chương trình, vì các phép tính thường rất đơn giản và việc sử dụng các hàm ẩn danh giảm số lượng tệp mã cần thiết cho một chương trình .

chức năng ẩn danh với ví dụ là gì?

Hàm ẩn danh, còn được gọi là bao đóng, cho phép tạo các hàm không có tên cụ thể . Chúng hữu ích nhất với vai trò là giá trị của các tham số có thể gọi được, nhưng chúng cũng có nhiều cách sử dụng khác. Các hàm ẩn danh được triển khai bằng lớp Đóng. printf("Xin chao %s\r\n", $name);

Từ khóa nào được sử dụng cho các chức năng ẩn danh?

Python và các ngôn ngữ lập trình khác như Java, C++ và C# có các hàm ẩn danh nhỏ gọi là lambda dùng một lần. Trong khi chúng tôi sử dụng từ khóa def để xác định hàm trong Python, chúng tôi sử dụng từ khóa lambda để xác định hàm ẩn danh