× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Closure là gì? Cách sử dụng closure trong Python

30/05/2022 12:04

Nếu bạn đã học lập trình và làm quen với các ngôn ngữ lập trình, rất có thể bạn đã nghe thấy từ Closure trong JavaScript. Tương tự như JavaScript, trong lập trình với Python, bạn cũng có thể sử dụng Closure. Nếu bạn vẫn còn lạ lẫm với khái niệm Closure là gì, định nghĩa và cách sử dụng của nó. Bài viết này sẽ bật mí các điều trên

Nếu bạn đã học lập trình và làm quen với các ngôn ngữ lập trình, rất có thể bạn đã nghe thấy từ Closure trong JavaScript. Tương tự như JavaScript, trong lập trình với Python, bạn cũng có thể sử dụng Closure. Nếu bạn vẫn còn lạ lẫm với khái niệm Closure là gì, định nghĩa và cách sử dụng của nó. Bài viết này sẽ bật mí các điều trên.

Closure trong Python là gì?

Giống như các vòng lặp lồng nhau, các hàm cũng có thể được lồng vào nhau. Về cơ bản, phương pháp ràng buộc dữ liệu với một hàm mà không cần phải thực sự truyền chúng làm tham số cho hàm thì được gọi là Closure. Nói một cách khác, closure là hàm được tạo, hay lồng vào bên trong một hàm khác. 

 

Closures có thể truy cập các biến có trong phạm vi chức năng bên ngoài và truy cập các biến này ngay cả sau khi hàm bên ngoài đã hoàn thành việc thực thi. Để hiểu rõ hơn về hàm closure, trước tiên chúng ta hãy xem phạm vi hoạt động của chúng như thế nào trong các hàm lồng nhau.

Phạm vi các biến trong hàm lồng nhau

Trong hàm lồng nhau của Python, các hàm đi kèm có thể truy cập các biến trong phạm vi bao quanh nó. Ví dụ như sau:

def outer(name):

  # this is the enclosing function

   def inner():

      # this is the enclosed function

      # the inner function accessing the outer function's variable 'name'

       print(name)

   inner()

# call the enclosing function

outer('Information')

Kết quả nhận được 

Information

Trong ví dụ trên, bạn sẽ thấy khi hàm bên ngoài được gọi, biến name nhận giá trị Information. Hàm bên trong có thể truy cập giá trị của biến này, khi hàm bên trong được gọi, ‘Information’ sẽ được in ra. Đây chính là phạm vi hoạt động của các hàm lồng nhau. Điểm chính mà bạn cần ghi nhớ là các hàm được bao quanh có thể truy cập được các biến của các hàm bao quanh. 

Python Closure

Trong ví dụ trên, chúng ta đã gọi hàm inner bên trong hàm outer. Hàm inner sẽ trở thành một closure khi chúng ta trả lại hàm inner thay vì gọi chúng. Vì vậy, ta có thể có một closure nếu:

  • Bạn có một hàm lồng nhau, tức là một hàm nằm trong một hàm khác.

  • Hàm lồng nhau tham chiếu đến một biến của hàm bên ngoài

  • Hàm bao quanh trả về hàm enclosed 

Ví dụ:

def outer(name):

    # this is the enclosing function

    def inner():

        # this is the enclosed function

        # the inner function accessing the outer function's variable 'name'

        print(name)

    return inner

# call the enclosing function

myFunction = outer('Information')

myFunction()

Kết quả nhận được sẽ là

Information

Ở đây, khi gọi hàm outer, giá trị trả về là hàm inner. Giá trị này sau này sẽ được gán cho ‘myFunction’. Do đó, khi bạn gọi hàm myFunction, kết quả trả về sẽ là ‘Information’ ( giá trị trước đó đã được đưa ra làm đối số cho bên ngoài). Qua đó có thể thấy, ngay cả khi “outer” kết thúc việc thực thi và toàn bộ biến của nó ra khỏi phạm vi thì giá trị được truyền cho đối số của nó vẫn được ghi nhớ. Đây là điểm mạnh của hàm Closure khi bạn có thể truy cập giá trị của một hàm không tồn tại.

Khi nào và tại sao lại cần sử dụng Closure trong Python 

Bạn có thể sử dụng closure trong Python khi:

  • Thay thế việc sử dụng lớp không cần thiết: giả sử bạn có một lớp chỉ chứa một phương thức bên cạnh phương thức __init__. Trong những trường hợp như vậy, việc sử dụng closure thay vì một lớp sẽ dễ nhìn hơn.

  • Tránh sử dụng phạm vi toàn cục: Nếu bạn có các biến toàn cục mà chỉ cần sử dụng một hàm trong chương trình, sử dụng closure sẽ là lựa chọn phù hợp. Xác định các biến bên trong hàm outer và sử dụng chúng trong hàm inner.

  • Nhớ môi trường của hàm ngay cả sau khi nó đã được thực thi: Sau đó bạn có thể truy cập các biến của môi trường này sau khi chương trình kết thúc.

Kết luận: Bài viết trên đã phân tích khái niệm về closure và cách sử dụng closure trong Python. Đây là một hàm hữu ích giúp lập trình viên thao tác nhanh và hữu ích hơn trong quá trình làm việc. Bạn có thể tận dụng hàm này trong những trường hợp cụ thể để tăng tốc trong việc lập trình 

Nguồn tham khảo: Techvidvan