Chuyển đổi lambda thành python chức năng bình thường

Chúng tôi sử dụng từ khóa

lambda argument(s) : expression 
0 thay vì def để tạo hàm lambda. Đây là cú pháp để khai báo hàm lambda

lambda argument(s) : expression 

Nơi đây,

  • lambda argument(s) : expression 
    1 - bất kỳ giá trị nào được truyền cho hàm lambda
  • lambda argument(s) : expression 
    2 - biểu thức được thực thi và trả về

Hãy xem một ví dụ,

greet = lambda : print('Hello World')

Ở đây, chúng ta đã định nghĩa một hàm lambda và gán nó cho biến có tên là hello

Để thực thi hàm lambda này, chúng ta cần gọi nó. Đây là cách chúng ta có thể gọi hàm lambda

# call the lambda
greet()

Hàm lambda ở trên chỉ cần in văn bản

greet = lambda : print('Hello World')
4

Ghi chú. Hàm lambda này không có bất kỳ đối số nào


Thí dụ. Hàm lambda trong Python

# declare a lambda function
greet = lambda : print('Hello World')

# call lambda function
greet()

# Output: Hello World

Trong ví dụ trên, chúng ta đã định nghĩa một hàm lambda và gán nó cho biến hello

Khi chúng ta gọi hàm lambda, câu lệnh

lambda argument(s) : expression 
4 bên trong hàm lambda được thực thi


Hàm lambda Python với một đối số

Tương tự như các hàm bình thường, hàm

lambda argument(s) : expression 
0 cũng có thể chấp nhận các đối số. Ví dụ,

# lambda that accepts one argument
greet_user = lambda name : print('Hey there,', name)

# lambda call
greet_user('Delilah')

# Output: Hey there, Delilah

Trong ví dụ trên, chúng ta đã gán hàm lambda cho biến hello_user

Ở đây,

lambda argument(s) : expression 
6 sau từ khóa
lambda argument(s) : expression 
0 chỉ định rằng hàm lambda chấp nhận đối số có tên
lambda argument(s) : expression 
6

Lưu ý cuộc gọi của hàm lambda,

lambda argument(s) : expression 
3

Ở đây, chúng tôi đã chuyển một giá trị chuỗi

lambda argument(s) : expression 
9 cho hàm lambda của chúng tôi

Và cuối cùng, câu lệnh bên trong hàm lambda được thực thi


Các câu hỏi thường gặp

Hàm filter() trong Python nhận một hàm và một iterable (danh sách, bộ dữ liệu và chuỗi) làm đối số

Hàm được gọi với tất cả các mục trong danh sách và một danh sách mới được trả về chứa các mục được hàm đó trả về cho mỗi mục

Khi tôi lần đầu tiên bắt gặp các hàm lambda trong python, tôi đã rất lo lắng và nghĩ rằng chúng dành cho Pythonistas nâng cao. Hướng dẫn về python cho người mới bắt đầu hoan nghênh ngôn ngữ này vì cú pháp dễ đọc của nó, nhưng chắc chắn lambdas có vẻ không thân thiện với người dùng

Tuy nhiên, khi tôi đã hiểu cú pháp chung và kiểm tra một số trường hợp sử dụng đơn giản, việc sử dụng chúng sẽ bớt đáng sợ hơn

cú pháp

Nói một cách đơn giản, hàm lambda cũng giống như bất kỳ hàm python bình thường nào, ngoại trừ việc nó không có tên khi định nghĩa và nó được chứa trong một dòng mã

lambda argument(s) : expression 
5

Hàm lambda đánh giá một biểu thức cho một đối số đã cho. Bạn cung cấp cho hàm một giá trị (đối số) và sau đó cung cấp thao tác (biểu thức). Từ khóa

lambda argument(s) : expression 
65 phải đứng đầu. Dấu hai chấm đầy đủ (. ) ngăn cách đối số và biểu thức

Trong mã ví dụ bên dưới, x là đối số và x+x là biểu thức

lambda argument(s) : expression 
6

Trước khi chúng ta đi vào các ứng dụng thực tế, hãy đề cập đến một số kỹ thuật về những gì cộng đồng python nghĩ là tốt và xấu với các hàm lambda

ưu

  • Tốt cho các hoạt động logic đơn giản, dễ hiểu. Điều này cũng làm cho mã dễ đọc hơn
  • Tốt khi bạn muốn một chức năng mà bạn sẽ chỉ sử dụng một lần

Nhược điểm

  • Họ chỉ có thể thực hiện một biểu thức. Không thể có nhiều thao tác độc lập trong một hàm lambda
  • Không phù hợp với các hoạt động kéo dài nhiều dòng trong một hàm
    lambda argument(s) : expression 
    66 bình thường (Ví dụ: các hoạt động có điều kiện lồng nhau). Nếu bạn cần một hoặc hai phút để hiểu mã, thay vào đó hãy sử dụng hàm có tên
  • Không tốt vì bạn không thể viết một chuỗi tài liệu để giải thích tất cả các đầu vào, hoạt động và đầu ra như bạn làm trong một hàm
    lambda argument(s) : expression 
    66 bình thường

Ở cuối bài viết này, chúng ta sẽ xem xét các ví dụ về mã thường được sử dụng trong đó hàm Lambda không được khuyến khích mặc dù chúng có vẻ hợp pháp

Nhưng trước tiên, hãy xem xét các tình huống khi sử dụng hàm lambda. Lưu ý rằng chúng tôi sử dụng các hàm lambda rất nhiều với các lớp python nhận một hàm làm đối số, ví dụ: map() và filter(). Chúng còn được gọi là các hàm bậc cao hơn

1. giá trị vô hướng

Đây là khi bạn thực thi hàm lambda trên một giá trị

lambda argument(s) : expression 
0

Trong đoạn mã trên, hàm đã được tạo và sau đó được thực thi ngay lập tức. Đây là một ví dụ về biểu thức hàm được gọi ngay lập tức hoặc IIFE

2. danh sách

Lọc(). Đây là thư viện sẵn có của Python chỉ trả về những giá trị phù hợp với tiêu chí nhất định. Cú pháp là

lambda argument(s) : expression 
68. Iterable có thể là bất kỳ trình tự nào, chẳng hạn như đối tượng danh sách, tập hợp hoặc chuỗi (thêm bên dưới)

Ví dụ bên dưới lọc danh sách cho

lambda argument(s) : expression 
69 số. Lưu ý rằng hàm bộ lọc trả về một ‘Đối tượng bộ lọc’ và bạn cần đóng gói nó bằng một danh sách để trả về các giá trị

lambda argument(s) : expression 
3

Bản đồ(). Đây là một thư viện python có sẵn khác với cú pháp

lambda argument(s) : expression 
00

Điều này trả về một danh sách đã sửa đổi trong đó mọi giá trị trong danh sách ban đầu đã được thay đổi dựa trên một hàm. Ví dụ dưới đây chia khối mọi số trong danh sách

lambda argument(s) : expression 
5

3. đối tượng sê-ri

A là một cột trong khung dữ liệu, hay nói cách khác, một chuỗi các giá trị với các chỉ số tương ứng. Các hàm lambda có thể được sử dụng để thao tác các giá trị bên trong khung dữ liệu Pandas

Hãy tạo một khung dữ liệu giả về các thành viên trong một gia đình

lambda argument(s) : expression 
6

Lambda với hàm Apply() của Pandas. Hàm này áp dụng một thao tác cho mọi phần tử của cột

Để biết tuổi hiện tại của mỗi thành viên, chúng ta lấy năm hiện tại trừ đi năm sinh của họ. Trong hàm lambda bên dưới, x tham chiếu đến một giá trị trong cột năm sinh và biểu thức là

lambda argument(s) : expression 
01

lambda argument(s) : expression 
8

Lambda với hàm Filter() của Python. Điều này có 2 đối số; . Nó trả về một danh sách các giá trị thỏa mãn điều kiện

lambda argument(s) : expression 
9

Lambda với hàm Map() của Pandas. Map hoạt động rất giống với apply() ở chỗ nó sửa đổi các giá trị của một cột dựa trên biểu thức

lambda argument(s) : expression 
0

Chúng tôi cũng có thể thực hiện các hoạt động có điều kiện trả về các giá trị khác nhau dựa trên các tiêu chí nhất định

Mã bên dưới trả về 'Nam' nếu giá trị Trạng thái là cha hoặc con và trả về 'Nữ' nếu không. Lưu ý rằng

lambda argument(s) : expression 
02 và
lambda argument(s) : expression 
03 có thể hoán đổi cho nhau trong ngữ cảnh này

lambda argument(s) : expression 
3

4. Lambda trên đối tượng Dataframe

Tôi chủ yếu sử dụng các hàm Lambda trên các cột cụ thể (đối tượng chuỗi) thay vì toàn bộ khung dữ liệu, trừ khi tôi muốn sửa đổi toàn bộ khung dữ liệu bằng một biểu thức

Ví dụ: làm tròn tất cả các giá trị đến 1 chữ số thập phân, trong trường hợp đó, tất cả các cột phải là kiểu dữ liệu float hoặc int vì round() không thể hoạt động trên chuỗi

lambda argument(s) : expression 
60

Trong ví dụ dưới đây, chúng tôi sử dụng áp dụng trên khung dữ liệu và chọn các cột để sửa đổi trong hàm Lambda. Lưu ý rằng chúng ta phải sử dụng

lambda argument(s) : expression 
04 ở đây để biểu thức được áp dụng theo cột

lambda argument(s) : expression 
61

Trường hợp sử dụng không được khuyến khích

  1. Gán tên cho hàm Lambda. Điều này không được khuyến khích trong hướng dẫn kiểu python PEP8 vì Lambda tạo một chức năng ẩn danh không có nghĩa là được lưu trữ. Thay vào đó, hãy sử dụng hàm
    lambda argument(s) : expression 
    66 bình thường nếu bạn muốn lưu trữ hàm để sử dụng lại
lambda argument(s) : expression 
62

2. Truyền hàm bên trong hàm Lambda. Việc sử dụng các hàm như

lambda argument(s) : expression 
06 chỉ nhận một đối số số là không cần thiết với Lambda vì bạn có thể chuyển trực tiếp hàm vào map() hoặc apply()

lambda argument(s) : expression 
63

Lý tưởng nhất là các hàm bên trong các hàm lambda nên có hai đối số trở lên. Ví dụ là

lambda argument(s) : expression 
07 và
lambda argument(s) : expression 
08 Bạn có thể thử nghiệm với nhiều hàm python tích hợp khác nhau để xem hàm nào cần hàm Lambda trong ngữ cảnh này. Tôi đã làm như vậy trong sổ ghi chép này

3. Sử dụng các hàm Lambda khi nhiều dòng mã dễ đọc hơn. Một ví dụ là khi bạn đang sử dụng câu lệnh if-else bên trong hàm lambda. Tôi đã sử dụng ví dụ dưới đây trước đó trong bài viết này

lambda argument(s) : expression 
3

Kết quả tương tự có thể đạt được với mã dưới đây. Tôi thích cách này hơn vì bạn có thể có vô số điều kiện và mã đủ đơn giản để làm theo. Thông tin thêm về các điều kiện vector hóa tại đây

Phần kết luận

Nhiều lập trình viên không thích Lambdas thường lập luận rằng bạn có thể thay thế chúng bằng cách hiểu danh sách, hàm tích hợp và thư viện chuẩn dễ hiểu hơn. Các biểu thức trình tạo (tương tự như hiểu danh sách) cũng là các lựa chọn thay thế hữu ích cho các hàm map() và filter()

Cho dù bạn có quyết định sử dụng các hàm Lambda trong mã của mình hay không, bạn cần hiểu chúng là gì và chúng được sử dụng như thế nào vì chắc chắn bạn sẽ bắt gặp chúng trong mã của người khác

Tôi có thể sử dụng cái gì thay vì lambda?

Một trong những lựa chọn thay thế tốt cho hàm lambda là khả năng hiểu danh sách . Đối với map() , filter() và reduce() , tất cả chúng đều có thể được thực hiện bằng cách sử dụng khả năng hiểu danh sách. Khả năng hiểu danh sách là một giải pháp giữa hàm for-loop và hàm lambda thông thường.

Lambdas có thể trả về giá trị không?

Trả về giá trị từ biểu thức lambda . You can explicitly return a value from the lambda using the qualified return syntax.

Tại sao các hàm lambda không được ưu tiên hơn so với các hàm thông thường?

Hạn chế. các hàm lambda chỉ có thể được sử dụng một lần, trừ khi được gán cho một tên biến . Hàm lambda được gán cho tên biến không có lợi thế hơn hàm def. hàm lambda có thể khó hoặc không thể chọn.

Bạn có thể chọn chức năng lambda không?

Các hàm được chọn theo tên, không phải theo mã . Unpickling sẽ chỉ hoạt động nếu một hàm có cùng tên xuất hiện trong cùng một mô-đun (__main__ trong ví dụ của bạn) Đây là lý do tại sao việc pickling lambda sẽ không hoạt động. họ không có tên cá nhân.