Hướng dẫn python lambda multiple arguments - python lambda nhiều đối số

Tìm hiểu cách sử dụng Lambda Function trong Python

Lambda trong python là anonymous function, cú pháp chặt chẽ và ngắn gọn hơn so với hàm thông thường.

Nội dung chính ShowShow

  • Tìm hiểu cách sử dụng Lambda Function trong Python
  • Phép Tính Lambda (Lambda Calculus)
  • Lịch Sử
  • Ví dụ đầu tiên
  • Anonymous Function (hàm ẩn danh)
  • Python Lambda và Function Thuần
  • Đối số
  • Lạm Dụng Lambda
  • Raise exception
  • Cryptic Style
  • Khi nào nên dùng Lambda
  • Hàm khởi tạo class
  • Key Functions
  • Tổng hợp

Với bài viết này, chúng ta sẽ biết được:

  • Lambda là như thế nào
  • Lambda và function bình thường khác nhau như nào
  • Cách viết một lambda function
  • Các hàm trong thư viện sử dụng lambda
  • Khi nào sử dụng hoặc tránh lambda

Bài viết được dịch từ nguồn: https://realpython.com/python-lambda/#anonymous-functions Nội dung bài viết được test trên Python 3.6 nhé

Phép Tính Lambda (Lambda Calculus)

Lịch Sử

Lịch Sử

Ví dụ đầu tiên

Anonymous Function (hàm ẩn danh)

Python Lambda và Function Thuần

Đối số

Lạm Dụng Lambda

Raise exception

Ví dụ đầu tiên

Anonymous Function (hàm ẩn danh)

Python Lambda và Function Thuần

def indentity(x):
    return x

Đối số

Lạm Dụng Lambda

lambda x: x

Raise exception

  • Cryptic Style
  • Khi nào nên dùng Lambda
  • Hàm khởi tạo class

Key Functions

Tổng hợp

lambda x: x + 1

Với bài viết này, chúng ta sẽ biết được:

(lambda x: x + 1)(2)

Lambda là như thế nào

(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3

Lambda và function bình thường khác nhau như nào

>>> add_one = lambda x: x + 1
>>> add_one(2)
3

Cách viết một lambda function

def add_one(x):
    return x + 1

Các hàm trong thư viện sử dụng lambda

>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'

Khi nào sử dụng hoặc tránh lambda

Anonymous Function (hàm ẩn danh)

Python Lambda và Function Thuần

  • Đối số
  • Lạm Dụng Lambda
  • Raise exception
  • Cryptic Style
  • Khi nào nên dùng Lambda
  • Hàm khởi tạo class

Key Functions

>>> lambda x, y: x + y

Tổng hợp

>>> _(1, 2)
3

Ví dụ trên đang tận dụng tính năng chỉ dành cho trình thông dịch tương tác được cung cấp qua dấu gạch dưới (). Bạn có thể không code tương tự trong module.

Note: Trong trình biên dịch, dấu ngạch dưới được liên kết với biểu thức cuối cùng được thực hiện. Trong ví dụ trên,

(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
2 trỏ tới lambda function. Để hiểu chi tiết thêm thì có thể tham khảo link Trong trình biên dịch, dấu ngạch dưới được liên kết với biểu thức cuối cùng được thực hiện. Trong ví dụ trên,
(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
2 trỏ tới lambda function. Để hiểu chi tiết thêm thì có thể tham khảo link

Ngoài ra, một pattern được sự trong ngỗn ngữ khác như JS là thực thi hàm ngay lập tức cũng được áp dụng với Lambda. Đây được gọi là Immediately Invoked Function Expression (IIFE, phát âm là “iffy”). Đây là một ví dụ:

lambda x: x
0

Lambda function phái trên định nghĩa và thực khi với 2 đối số truyền vào. Nó trả lại tổng giá trị là 5. Python không khuyến khích sử dụng các biểu thức lambda dạng này. Nó chỉ đơn giản là kết quả của một biểu thức lambda có thể gọi được, không giống như phần thân của một hàm bình thường. Các lambda function thường được sử dụng với các hàm bậc cao hơn, các hàm này nhận một hoặc nhiều hàm làm đối số hoặc trả về một hoặc nhiều hàm. Một lambda function có thể là một hàm bậc cao hơn bằng cách lấy một hàm (bình thường hoặc lambda) làm đối số như trong ví dụ tiếp theo sau:

lambda x: x
1

Python có những HOF được dựng sẵn trong thư viện chuẩn như

(lambda x: x + 1)(2)
5,
(lambda x: x + 1)(2)
6 v.v... và bạn có thể sử dụng lambda function trong đó.

Python Lambda và Function Thuần

Từ trích dẫn này Python Design and History FAQ ta có thể thấy tổng thể liên quan đến việc sử dụng các hàm lambda trong Python:

Không giống như lambda from - nơi chúng ta thêm các function trong các ngôn ngữ khác, Python lambda chỉ là một dạng viết tắt nếu bạn quá lười để viết một function.

Tuy nhiên, đừng để câu nói này ngăn cản bản sử dụng lambda function. Các nội dung sau sẽ chỉ rõ những điểm chung và sự kahcs biết giưa lambda và hàm thông thường.

Function

Bạn có lẽ tự hỏi điều gì để phân biệt lambda function khi gán vào một biến và một hàm thông thường, về cảm quan thì không có gì. Hãy cùng xem các Python nhìn một function được build với một câu lệnh

(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
5 và một hàm được xây dựng dưới dạng lambda:

lambda x: x
2

(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
6 là module phân tích mã bytecode Python được tạo bởi trình biên dịch Python

Bạn có thể thấy ràng

(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
7 hiển thị ra dạng bytecode Python cho phép kiểm tra các hướng dẫn ở mức low-level mà trình thông dịch Python sẽ sử dụng trong khi thực thi chương trình.

Còn bây giờ hãy giá trị trả ra với một hàm thông thường:

lambda x: x
3

Nhìn hai kết quả, ta có thể nó giống nhau. Nhưng bạn chú ý rằng về cách đặt tên thì khác nhau: với hàm thông thường, tên hàm sẽ là

(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
8 còn với lambda function nó chỉ là
(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
9.

Traceback

Ở phần trước, trong bối cảnh của lambda function, Python không cung cấp tên cho hàm đó, mà chỉ hiển thị là

(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
9. Điều này có thể là một hạn chế mà ta cần xem xét khi một exception xảy ra và một traceback sẽ chỉ hiển thị
>>> add_one = lambda x: x + 1
>>> add_one(2)
3
1:

lambda x: x
4

Phía trên là traceback của exception được raise với lambda function. Và bên dươi là ví dụ với hàm thông thường

lambda x: x
5

Hàm bình thường bắn ra lỗi tương tự nhưng chỉ dẫn đến chính xác hơn vì nó cung cấp tên hàm, div_zero.

Syntax

No Statements

Một lambda function không thể chứa bất kỳ câu lệnh nào. Trong lambda function, câu lệnh như

>>> add_one = lambda x: x + 1
>>> add_one(2)
3
2,
>>> add_one = lambda x: x + 1
>>> add_one(2)
3
3,
>>> add_one = lambda x: x + 1
>>> add_one(2)
3
4 sẽ gây lên lỗi
>>> add_one = lambda x: x + 1
>>> add_one(2)
3
5. Đây là ví dụ khi ta thêm
>>> add_one = lambda x: x + 1
>>> add_one(2)
3
6 bên trong lambda:

lambda x: x
6

Ví dụ này kiểm tra x có giá trị là 2 hay không. Nhưng trình thông dịch xác định một Lỗi cú pháp trong khi phân tích cú pháp liên quan đến câu lệnh

>>> add_one = lambda x: x + 1
>>> add_one(2)
3
7 trong phần thân của lambda.

Single Expression

Đối lập với hàm thông thường, lambda function chỉ là một biểu thức. Mặc dù bên trong body của một lambda, bạn có thể mở rộng biểu thức trên nhiều dòng bằng cách sử dụng dấu ngoặc đơn hoặc một chuỗi nhiều dòng, những tóm lại nó vẫn chỉ có duy nhất một biểu thức:

lambda x: x
7

Ví dụ phái trên sẽ trả về

>>> add_one = lambda x: x + 1
>>> add_one(2)
3
8 nếu tham số là số chẵn và ngược lại. Nó được viết thành 2 dòng bởi vì ta đã đặt nó bên trong dấu ngoặc đơn, nhưng thật chất nó vẫn coi là một biểu thức duy nhất.

Type Annotations

Nếu bạn đã quen với việc sử dụng gợi ý kiểu đã có sẵn trong Python, thì bạn đã có thêm lý do để thích cá hàm thông thường hơn làm lambda function bởi lambda function không hỗ trợ điều này.

lambda x: x
8

Bất kỳ lỗi liên quan tới type của đối số với full_name () đều có thể bị bắt bởi các tool như

>>> add_one = lambda x: x + 1
>>> add_one(2)
3
9 hoặc
def add_one(x):
    return x + 1
0, trong khi với hàm lambda banj chir nhaanj được lỗi cú pháp:

lambda x: x
9

IIFE

Lambda function có IIFE trong khi hàm thông thường thì không. Tuy nhiên, tính năng này có thể không được sử dụng trong thực tế. Ví dụ về IIFE của lambda function.

lambda x: x + 1
0

Đối số

Giống như function bình thường, Lambda cũng cho phép truyền đối số. Ví dụ dưới đây sẽ cho ta thấy điều đó và 1 số cách truyền đối số.

lambda x: x + 1
1

Decorator

Trong Python, 1 decorator là một pattern cho phép thêm một hành vi tới một hàm hoặc class. Nó thường được biểu diễn với

def add_one(x):
    return x + 1
1 trước một function.

lambda x: x + 1
2

Trong ví dụ trên, hàm

def add_one(x):
    return x + 1
2 là một function thêm một hành vi tới hàm
def add_one(x):
    return x + 1
3, vì thế khi gọi
def add_one(x):
    return x + 1
4 kết quả sẽ là:

lambda x: x + 1
3

def add_one(x):
    return x + 1
5 chỉ in ra
def add_one(x):
    return x + 1
6, nhưng với decorator, nó được add thêm hành vi khác là in thêm đoạn
def add_one(x):
    return x + 1
7.

Một decorator có thể áp dụng vào một lambda như sau:

lambda x: x + 1
4

def add_one(x):
    return x + 1
8, đã được decorated với @trace. Và với lambda nó được gọi thông qua việc bọn như ví dụ bên trên. và kết quả sẽ là

lambda x: x + 1
5

Lạm Dụng Lambda

Với một vài ví dụ ở bài viết này, có thể được coi là đang lạm dung lambda. Nếu bạn thấy mình đang cố gắng khắc phục điều gì đó mà lambda không hỗ trợ, đây có thể là dấu hiệu cho thấy một hàm bình thường sẽ phù hợp hơn. Ở phần này chúng ta sẽ xem một vài ví dụ nên tránh không sử dụng lambda.

Raise exception

Raise một exception bằng lambda không phải phương án hay.

lambda x: x + 1
6

Nên tránh sử dụng kiểu này. Nếu bạn gặp đoạn code như này, hãy xem xét sửa lại nó.

Cryptic Style

Như bất kỳ ngôn ngữ nào, bạn có thể khó tìm code mà bạn muốn nếu như style được sử dụng gây khó khăn cho việc đọc. Và lambda là một loại như vậy.

lambda x: x + 1
7

def add_one(x):
    return x + 1
9 tham chieué tới một giá trị mà không cần dùng nó. Nhưng trong ví dụ này,
(lambda x: x + 1)(2) = lambda 2: 2 + 1
                     = 2 + 1
                     = 3
2 tham chiếu tới các biến khác nhau. Và chúng ta hãy đặt tên cho các biến cho dễ nhìn.

lambda x: x + 1
8

Phải thừa nhận rằng nó vẫn còn khó đọc. Vẫn tận dụng lambda, ta sẽ chuyển nó dưới dạng một hàm thông thường để dễ đọc hơn.

lambda x: x + 1
9

Class

Bạn có thể nhưng không nên viết các phương thức lớp dưới dạng các hàm lambda của Python. Ví dụ sau hoàn toàn hợp lệ. Ví dụ: thay vì triển khai str như một hàm thông thường, ta sử dụng lambda. Tương tự,

>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
1 và
>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
2 là các thuộc tính cũng được triển khai với các hàm lambda, thay vì các hàm hoặc decorators:str như một hàm thông thường, ta sử dụng lambda. Tương tự,
>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
1 và
>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
2 là các thuộc tính cũng được triển khai với các hàm lambda, thay vì các hàm hoặc decorators:

(lambda x: x + 1)(2)
0

Khi chạy tool như

>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
3, một tool check style, nó sẽ hiển thị

(lambda x: x + 1)(2)
1

Mặc dù

>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
3 không chỉ ra vấn đề đối với việc sử dụng các hàm lambda của Python trong các thuộc tính, nhưng chúng rất khó đọc và dễ bị lỗi do sử dụng nhiều chuỗi như
>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
5 và
>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
2. Và hãy luôn dùng kiểu này để triển khai

(lambda x: x + 1)(2)
2

Theo nguyên tắc chung, hãy ưu tiên sử dụng các hàm thông thường hơn các biểu thức lambda.

Khi nào nên dùng Lambda

Lambda luôn là chủ để để tranh cái với những vấn đề khó đọc, khó hiểu. Nhưng hãy bỏ qua nó và tìm hiểu khi nào nên dùng lambda

Hàm khởi tạo class

Lambda thường được sử dụng với

(lambda x: x + 1)(2)
5,
(lambda x: x + 1)(2)
6. Dưới đây là một vài ví dụ về dùng lambda cho các hàm đó.

(lambda x: x + 1)(2)
3

Bạn có thể đã đọc code tương tự như các ví dụ trên, và nó khá phổ biến khiến cho việc sử dụng nó hiệu quả hơn.

Key Functions

Các key function trong Python là các hàm bậc cao sử dụng một

>>> full_name = lambda first, last: f'Full name: {first.title()} {last.title()}'
>>> full_name('guido', 'van rossum')
'Full name: Guido Van Rossum'
9 tham số làm đối số được đặt tên.
>>> lambda x, y: x + y
0 nhận một hàm có thể là lambda. Hàm này ảnh hưởng trực tiếp đến thuật toán được điều khiển bởi chính hàm chính. Dưới đây là một số chức năng chính:

(lambda x: x + 1)(2)
4

Tổng hợp

Sau bài viết này bạn đã biết được:

  • Lambda là gì
  • Nguồn gốc, cách dùng
  • Nên sử dụng hay tránh sử dụng như nào

Hy vọng bài viết này giúp ích trong quá trình làm việc với python của mọi người.