Lập trình hàm ( functional programming ) trong Python – phần 2
Chúng ta tiếp tục tìm hiểu về functional programming trong python.
ở phần 1 chúng ta đã tìm hiểu về Higher Order Functions qua 2 ví dụ cụ thể. Python cung cấp sẵn một số Higher Order Functions giúp thao tác với các chuỗi ( sequences ) dễ dàng hơn. Đầu tiên chúng ta hãy thử với lambda expressions.
Nội dung của bài
Lambda Expressions
Lambda expression là một hàm ẩn danh ( anonymous function). Trong Python, khi khai báo một hàm chúng ta dùng từ khóa def. Với lambda expression, chúng ta có thể định nghĩa một hàm nhanh hơn. Hãy cùng xem ví dụ dưới đây:
def multiply(multiplier):
return lambda x: x * multiplier
mult10 = multiply(10)
print(mult10(10)) # 100
Lambda expression bắt đầu bằng từ khóa lambda, tiếp theo là tham số đầu vào, sau dấu hai chấm là biểu thức trả về. Lambda expression được sử dụng khá nhiều khi làm việc với các Higher Order Functions.
Một số Higher Order Functions có sẵn trong Python
Map
Hàm map cho phép chúng ta áp dụng một hàm cho mọi phần tử trong iterable object( một đối tượng có thể lặp lại). Ví dụ, chúng ta có danh sách tên, chúng ta in ra màn hình các câu chào, chúng ta có thể triển khai như sau:
names = ["Uncle Bob", "David", "Michale"]
greetings = map(lambda x: "Hi " + x, names)
for greeting in greetings:
print(greeting)
# Hi Uncle Bob
# Hi David
# Hi Michale
Filter
Hàm filter sẽ lọc toàn bộ phần tử của một interable object bằng một hàm trả ra giá trị boolean và giữ lại phần tử có kết quả True.
numbers = [1, 2, 3, 6, 10]
even_numbers = filter(lambda num: num % 2 == 0, numbers)
print(list(even_numbers)) # [2, 6 ,10]
Ví dụ trên chúng ta lọc các phần tử chia hết cho 2. Kết quả của hàm filter là một iterator, chúng ta có chuyển sang kiểu list bằng cách sử dụng cậu lệnh list(even_numbers).
List Comprehensions
Một trong những tính năng nổi bật trong functional programming là List comprehensions. Giống như map và filter, list comprehensions cho phép chúng ta thao tác với dữ liệu một cách ngắn gọn, dễ hiểu.
Hãy viết lại ví dụ với map và filter:
names = ["Uncle Bob", "David", "Michale"]
greetings = ["Hi " + name for name in names]
print(greetings) # [Hi Uncle Bob, Hi David, Hi Michale]
Cách khai báo một list comprehensions như sau: [result for
singular-element in
list-name]. Chúng ta có thể sử dụng câu lệnh if trong list comprehensions để filter các phần tử theo một điều kiện nhất định:
numbers = [1, 2, 3, 6, 10]
even_numbers = [num for num in numbers if num % 2 == 0]
print(list(even_numbers)) # [2, 6 ,10]
Tất cả các map và filter đều có thể biểu diễn dưới dạng một list comprehensions.
Kết luận
Functional programming là một mô hình lập trình khá mới lạ với phần lớn lập trình viên Việt Nam. Thật khó để có thể sử dụng thuần thục, chúng ta hay cũng nhau tìm hiểu thêm trong những bài viết tiếp theo nhé.