Kỹ thuật Python mà bạn nên biết: Currying

Trong bài viết này tôi muốn giải thích một kỹ thuật rất thú vị cho phép code của bạn clean và hiệu quả hơn trong Python. Kỹ thuật này được gọi là cà ri, ý lộn Currying.

Tôi sẽ chỉ cho bạn cách giải quyết một vấn đề đơn giản bằng kỹ thuật này để bạn có thể hiểu rõ hơn về công dụng của nó. Tôi tin rằng nếu bạn thành thạo kỹ thuật này thì code của bạn sẽ gọn gàng hơn rất nhiều.

Currying là một kỹ thuật trong lập trình hàm, cho phép biến một hàm nhận nhiều đối số thành một chuỗi các hàm mỗi hàm nhận một đối số. Điều này không chỉ làm cho code rõ ràng hơn mà còn giúp dễ dàng tạo ra các hàm chuyên biệt từ các hàm tổng quát.

Nghe có vẻ rắc rối vậy ta, ồ không khó lắm đâu, cùng đi vào các ví dụ cụ thể nhé!

Vấn đề cần giải quyết

Hãy tưởng tượng bạn có một hàm mà bạn phải sử dụng nhiều lần với một số tham số. Và trong số các thông số này, có một số tham số là cố định, nhưng một số khác lại có thể thay đổi.

Để minh họa điều này, chúng ta sẽ sử dụng hàm tổng có hai tham số làm ví dụ.

def add(x,y):
    return x+y

add(5,4)
add(5,3)
add(5,2)

Nếu bạn để ý, khi hàm được gọi, chúng ta có một tham số cố định là 5 và một tham số khác đang thay đổi. Sau này muốn thay đổi tham số cố định này chúng ta sẽ phải thay đổi trong mỗi lần gọi, việc này khá tẻ nhạt.

Sử dụng currying

Vậy nếu tôi sử dụng currying thì kết quả của hàm này sẽ thay đổi thế nào?

Thay vì đưa ra định nghĩa, chắc chỉ cần nhìn code là bạn sẽ hiểu ngay vì nó clean cực kì :))

# Currying
def add_number(x):
    def add_y(y):
        return x+y
    return add_y


add_5=add_number(5) #Nhớ phải gán dòng này nhé

# Giờ chỉ cần truyền y vào là xong
add_5(4)
add_5(3)
add_5(2)

Như bạn có thể thấy, những gì chúng ta làm là tạo một hàm với các tham số cố định và bên trong chúng ta tạo một hàm khác với tham số biến.

Điều này cho phép chúng ta chỉ thực hiện một lệnh gọi với các tham số cố định và sau đó chúng ta gọi các hàm chỉ truyền các tham số biến.

Việc sửa đổi chức năng này trong tương lai sẽ dễ dàng hơn nhiều so với chức năng chúng tôi đã có trước đây và những người khác khi cần đọc lại code cũng nhanh gọn hơn nhiều.

Nghe có vẻ easy và học thuật quá nhỉ, thế có ví dụ nào khác không?

Có chứ, ví dụ

def calculate_tax(tax_rate):
    def apply_tax(price):
        return price + (price * tax_rate)
    return apply_tax

# Định nghĩa các mức thuế suất khác nhau
food_tax = calculate_tax(0.05)  # 5% thuế cho thực phẩm
electronics_tax = calculate_tax(0.18)  # 18% thuế cho hàng điện tử
clothing_tax = calculate_tax(0.12)  # 12% thuế cho quần áo

# Áp dụng thuế suất cho các sản phẩm cụ thể
food_price_with_tax = food_tax(100)  # Giá sản phẩm thực phẩm là $100
electronics_price_with_tax = electronics_tax(250)  # Giá sản phẩm điện tử là $250
clothing_price_with_tax = clothing_tax(80)  # Giá sản phẩm quần áo là $80

print(f"Giá thực phẩm sau thuế: ${food_price_with_tax}")
print(f"Giá hàng điện tử sau thuế: ${electronics_price_with_tax}")
print(f"Giá quần áo sau thuế: ${clothing_price_with_tax}")

Trong ví dụ này, hàm calculate_tax nhận một tham số là tax_rate và trả về một hàm khác apply_tax, hàm này sẽ áp dụng thuế suất vào giá sản phẩm. Bằng cách này, bạn có thể dễ dàng định nghĩa các mức thuế khác nhau và áp dụng chúng một cách linh hoạt mà không cần phải lặp lại code.

Việc sử dụng currying ở đây giúp bạn tạo ra các hàm chuyên biệt cho từng loại thuế suất, giúp code của bạn dễ bảo trì và mở rộng khi có thêm các loại thuế suất khác.

Lợi Ích Của Currying

Currying có rất nhiều lợi ích, và đây là 3 lợi ích chính.

  • Tái Sử Dụng: Currying cho phép tạo ra các hàm chuyên biệt từ các hàm tổng quát, giúp tái sử dụng code một cách hiệu quả.
  • Đơn Giản Hóa: Việc chia nhỏ các hàm phức tạp thành các hàm nhỏ hơn, mỗi hàm chỉ thực hiện một nhiệm vụ cụ thể, giúp code trở nên rõ ràng và dễ hiểu hơn.
  • Tăng Tính Linh Hoạt: Currying giúp việc áp dụng một số đối số cố định cho một hàm dễ dàng hơn, tăng tính linh hoạt khi lập trình.

Tóm lại

Kỹ thuật lập trình hàm này cho phép chúng ta module hóa code của mình hơn, bằng cách phân tách các hàm thành các hàm đơn giản hơn, nó code của chúng ta có thể tái sử dụng nhiều hơn và cũng dễ đọc hơn.

Và các ứng dụng của nó rất đa dạng, chẳng hạn như làm việc với ngày cố định, áp dụng bộ lọc, chia tỷ lệ, v.v.

Hi vọng bài viết này sẽ giúp các bạn viết code gọn gàng hơn.

Hẹn gặp lại ở những lần tới nhé!

Add a Comment

Scroll Up