(+84) 236.3827111 ex. 402

KIỂU DỮ LIỆU FUNCTION TRONG PYTHON – LAMBDA


Giới thiệu lambda

Ta có cú pháp sau:

lambda argument_1, argument_2, …, argument_n : expression

Như đã nói ở trên, lambda hoạt động như khi bạn dùng từ khóa “def” khai báo hàm. Tuy nhiên, vẫn có một vài ưu điểm nổi trội của lambda so với cách bình thường:

  • lambda là một expression, không phải là một câu lệnh. (Khái niệm expression đã được Kteam giới thiệu). Do đó lambda có thể có ở một vài chỗ mà “def” không thể có (bạn đọc sẽ biết ở phần sau)
  • lambda là một dòng expression duy nhất, không phải là một khối lệnh. Phần expression của lambda giống với phần khối lệnh của hàm với một lệnh return ở cuối hàm nhưng với lambda bạn chỉ cần ghi giá trị mà không cần ghi return. Bạn đọc sẽ hiểu rõ hơn ở phần sau khi biết lambda có thể sử dụng các câu lệnh điều kiện mà không cần phải sử dụng tới lệnh “if”. Nhờ được thiết kế như vậy, lambda được ưu tiên dùng cho việc tạo ra những hàm đơn giản, còn nếu phức tạp thì ta sẽ sử dụng đến từ khóa “def”.

Để có thể hiểu hơn, mời bạn đọc xem qua các ví dụ sau đây

Đây là khi bạn sử dụng từ khóa “def”

print('Sử dụng return')
def ave(a, b, c):
return(a*b*c)
print(ave(2,4,6))
print('Sử dụng Lambda - Ví dụ 1')
ave = lambda a, b, c: a*b*c
print(ave(2,4,6))
Bạn còn nhớ default argument chứ?

Điều đó cũng có thể làm được với lambda

print('Sử dụng Lambda - Ví dụ 2')
x_power_a = lambda x,a=2:x**a
print(x_power_a(2,5))

Bạn cũng lưu ý thêm là lambda cũng phân biệt global local nhé.

Trong hàm ta có thể sử dụng đối số là một lambda

print('Sử dụng Lambda - Ví dụ 3, Biến local, global')
def kteam():
mem = lambda x: x + ' is a member of Kteam' # Hàm kteam sử dụng mem là một lambda
return mem # trả về một hàm nặc danh
call_mem = kteam() # lấy biến call_mem giữ hàm nặc danh
print(call_mem('Long')) # giá trị chuỗi được đưa vào cho biến x
print(call_mem('Dũng'))
print(call_mem)

Vì sao dùng lambda?

Chung quy thì lambda là một công cụ nhanh gọn để bạn có thể tạo ra một hàm và sử dụng nó. Việc sử dụng nó thay cho “def” hay không là tùy ở bạn. Đương nhiên là bạn có thể chỉ sử dụng “def” thôi cũng được, hoàn toàn được, đặc biệt là những lúc mà hàm của bạn phức tạp, cần nhiều câu lệnh thì bạn không cần phải suy nghĩ nhiều nữa mà nên dùng “def” luôn. Nhưng giả sử bạn chỉ cần khởi tạo một hàm cấu trúc đơn giản và tái sử dụng nhiều lần thì sao? Lúc đó hãy nghĩ tới lambda nhé!

Chúng ta đến với một số ví dụ mà lambda hoàn toàn chiếm ưu thế so với “def”.

print('Sử dụng Lambda - Ví dụ 4, List')
# Khởi tạo List với 3 phần tử là lambda
kteam_lst = [lambda x: x**2, lambda x: x**3, lambda x: x**4] # một list với các phần tử là các hàm nặc danh
print(kteam_lst)
print(kteam_lst[0])
print(kteam_lst[0](3))
print(kteam_lst[-1](4))
for func in kteam_lst:# Có thể sử dụng cùng 1 lúc 3 hàm
print(func(3))

Không chỉ mình list, bạn có thể sử dụng lambda với dictionary. Mời bạn đọc xem ví dụ sau đây:

print('Sử dụng Lambda - Ví dụ 5, Dict')
key = 'Kteam'
print({'Google': lambda: 'Goooooooog', # lambda có thể không có argument nhưng expression bắt buộc phải có
'Youtube':lambda: 'Youuuuuuuu',
'Kteam': lambda:'Free Education'}[key]())

Câu điều kiện cho lambda

Rõ ràng bạn đã thấy, lambda chỉ nhận một expression, do đó, bạn không thể chèn câu lệnh điều kiện như bình thường được mà phải theo một cách khác.

Giả sử với lệnh if như sau

if a:
    b
else:
    c

Thì có thể viết dưới dạng expression với 2 cách như sau

Cách 1:

b if a else c

Cách 2:

(a and b) or c

Bạn có cần nhớ cả 2 cái không? Không cần thiết đâu, Kteam khuyến khích bạn đọc ghi nhớ và dùng cách 1 vì sự rõ ràng và dĩ nhiên cũng không nên bối rối khi thấy cách 2.

Hãy đến với ví dụ để hiểu thêm

print('Sử dụng Lambda - Ví dụ 6,Câu lệnh if ')
find_greater = lambda x,y:x if x>y else y
print(find_greater(3,7))

Ví dụ sau đây là kiểm tra xem số đó cùng có hai ước 2 và 3 hay không? Nếu có thì trả về 1, không thì là 0. Ví dụ này hoàn toàn có thể sử dụng lambda bằng cách sử dụng “and” nhưng ở đây Kteam muốn bạn biết chúng ta có thể lồng các expression lên nhau.

print('Sử dụng Lambda - Ví dụ 7,Câu lệnh if lồng nhau')
cd_of_2_3 = lambda x: (1 if x % 3 == 0 else 0) if x % 2 == 0 else 0
print(cd_of_2_3(6))
# Rút gọn
print('Sử dụng Lambda - Ví dụ 7,Câu lệnh if lồng nhau')
cd_of_2_3 = lambda x: (1 if not (x % 3) else 0) if not (x % 2) else 0
print(cd_of_2_3(6))

Lambda chồng lambda

Phần này sẽ hơi rắc rối nếu như bạn chưa thực sự hiểu lambda. Bạn có thể chồng 2 hoặc 3 lambda lên nhau cùng một lúc. Nhưng phải chú ý để biết được mình đang làm gì nhé.

print('Sử dụng Lambda - Ví dụ 8, lambda chồng lambda')
def kteam(first_string):
return lambda second_string: first_string + second_string # trả về một hàm, và lưu biến first_string
slogan=kteam('How Kteam ')
print(slogan('Free Education'))
# Lambda chồng lambda không được khuyếch khích sử dụng vì khá rắc rối khi viết