Python Lambda Function
Lambda function một trong những tính năng hữu dụng và quan trọng trong Python. Tuy nhiên lambda lại khó hiểu và thường mắc lỗi. Để tránh việc này chúng ta cùng nhau tìm hiểu kỹ về Lambda Function nhé.
Nội dung của bài
Lambda function là gì
Lambda function là cách đơn gian để khai báo một hàm. Đôi khi chúng ta còn nghe đến với từ kháo Lambda operators.
Ở bài hàm trong Python chúng ta đã tìm hiểu cách khai báo một hàm bằng từ khóa def, có lẽ đủ đơn giản để dùng. Vậy tại sao lại cần có 1 cách khác để khai báo hàm? Câu trả lời là: Lambda là hàm ẩn danh (anonymous) tức là function mà không cần khai báo tên.
Thường cúng ta sử dụng lambda function với các hàm chỉ cần một dòng lệnh.
Ví dụ:
def doubler(x):
return x*2
print(doubler(4))
# Prints 8
print(doubler(10))
# Prints 100
Ví dụ trên là cách khai báo hàm theo cách thường làm, hàm doubler sẽ trả về giá tị bằng 2 lần giá trị truyền vào.
Chúng ta thử dùng lambda function:
doubler = lambda x: x*2
print(doubler(5))
# Prints 10
print(doubler(15))
# Prints 30
Trong ví dụ trên chúng ta khai báo lambda function sử dụng cú pháp:
lambda parameters: expression
Hàm lambda không cần sử dụng từ khóa return, lambda tự động trả về giá trị của biểu thức.
Có thể có nhiều tham số
mul = lambda x, y: x*y
print(mul(5, 10))
# Prints 50
Trong ví dụ trên hàm lambda nhận 2 tham số x, y và trả về giá trị là tích của x và y.
Các cách truyền tham số
Như đã nói về các loại tham số của hàm hàm lambda cũng hỗ trợ các loại tham số:
- Positional Arguments
- Keyword Arguments
- Default Arguments
- Variable Length Positional Arguments (*args)
- Variable Length Keyword Arguments (**kwargs)
Hãy xem cách truyền các loại tham số trên trong ví dụ dưới đây:
# Positional arguments
add = lambda x, y, z: x+y+z
print(add(2, 3, 4))
# Prints 9
# Keyword arguments
add = lambda x, y, z: x+y+z
print(add(2, z=3, y=4))
# Prints 9
# Default arguments
add = lambda x, y=3, z=4: x+y+z
print(add(2))
# Prints 9
# *args
add = lambda *args: sum(args)
print(add(2, 3, 4))
# Prints 9
# **args
add = lambda **kwargs: sum(kwargs.values())
print(add(x=2, y=3, z=4))
# Prints 9
Sử dụng lambda với map(), filter(), reduce()
Có 3 hàm trong thư viện có sẵn của Python là map(), filter() và reduce(). Đây là 3 hàm thường hay sử dụng lambda và cho thấy tính hữu dụng của lambda function.
Sử dụng lambda với map()
# nhân đôi giá trị của từng phần tử
def doubler(x):
return x*2
nums = [1, 3, 5, 7, 9, 10]
mod_list = map(doubler, nums)
print(list(mod_list))
# Prints [2, 6, 10, 14, 18, 20]
Ví dụ trên là cách khai dùng hàm map() theo cách thông thường.
Hãy xem cách sử dụng với hàm lambda
# nhân đôi giá trị của từng phần tử
nums = [1, 3, 5, 7, 9, 10]
doubler = map(lambda x: x*2, nums)
print(list(doubler))
# Prints [2, 6, 10, 14, 18, 20]
Trong ví dụ này, hàm doubler không cần thiết, thay vào đó chúng ta sử dụng hàm lamba, source code nhìn ngắn gọn hơn.
Sử dụng lambda với filter()
Hàm filter() sử dụng một hàm là điều kiện để tạo ra một list mới từ một list có sẵn
# Lọc tuổi trên 18
def checkAge(age):
if age > 18:
return True
else:
return False
age = [5, 7, 18, 19, 25, 40]
adults = filter(checkAge, age)
print(list(adults))
# Prints [19, 25, 40]
Hãy thử sử dụng lambda:
# Lọc tuổi trên 18
age = [5, 7, 18, 19, 25, 40]
adults = filter(lambda x: x> 18, age)
print(list(adults))
# Prints [19, 25, 40]
Các bạn có thể thấy source code ngắn gon hơn.
Sử dụng lambda với reduce()
Hàm reduce() được viết trong thư viện functools, muốn sử dụng chúng ta phải import package này.
Xem ví dụ sử dụng reduce() theo cách thông thường
# tính tổng các phần tử trong danh sách
from functools import reduce
def summer(a, b):
return a + b
nums = [10, 20, 30, 40]
result = reduce(summer, nums)
print(result)
# Prints 100
Chúng ta sử dụng reduce() để cộng dồn giá trị của các phần tử trong danh sách.
Cú pháp của hàm reduce() là: reduce(<func>, <iterable>), kết quả trả về của func phải có kiểu giống với kiểu của các phần tử trong iterable. Tham số của func cũng cùng kiểu với kết quả trả về.
Thử dùng lambda với reduce() nhé:
from functools import reduce
nums = [10, 20, 30, 40]
result = reduce(lambda a, b: a + b, nums)
print(result)
# Prints 100
Trả về nhiều giá trị
# trả về nhiều giá trị dưới dạng tupe
findSquareCube = lambda num: (num**2, num**3)
sc1, sc2 = findSquareCube(3)
print(sc1)
# Prints 9
print(sc2)
# Prints 27
if else trong Lambda
Câu lệnh if else không sử dụng được trong Lambda, nhưng thay vào đó chúng ta có thể sử dùng if else expression như ví dụ dưới đây:
# hàm lambda trả về giá trị nhỏ nhấ
findMin = lambda x, y: x if x < y else y
print(findMin(2, 10))
# Prints 2
print(findMin('a', 'z'))
# Prints a
Lambda Key Functions
Trong Python key functions là higher-order function ( hàm có tham số là một hàm và trả về kết quả là một hàm).
Dưới đây là một số key functions:
- List method: sort()
- Built-in functions: sorted(), min(), max().
Chúng ta thử dùng lambda là key function:
# sắp xếp danh sách theo tuổi
players = [('CR7', 35),
('Kane', 28),
('Bob', 20)]
x = sorted(players, key=lambda player: player[1])
print(x)
# Prints [('Bob', 20), ('Kane', 28), ('CR7', 35)]
Kết luận
Lambda function là rất hữu dụng và quan trọng trong Python, chúng ta sử dụng để source code ngắn gọn hơn.