- vừa được xem lúc

Hàm trong Python là first-class object

0 0 23

Người đăng: BeautyOnCode

Theo Viblo Asia

Vậy first-class object là gì?

first-class object là một thực thể (entity) được gán vào biến, lưu trữ trong các loại dữ liệu, hay sử dụng như một đối số truyền vào hàm khác, và thậm chí là trả về chúng từ hàm khác.

Việc hiểu hàm là một first-class object sẽ giúp bạn dễ tiếp thu hơn các khái niệm khác như lambda hay decorators.

Cùng xem các ví dụ về hàm là first-class object bên dưới nhé!

Ví dụ mình có hàm:

def say(text): return f"{text} !"

Hàm là đối tượng

Có thể gán biến greet với giá trị là hàm say

greet = say
greet("hello")

Hàm có thể sử dụng trong cấu trúc dữ liệu

Có thể lưu các hàm vào một mảng:

funcs = [say, greet]
for f in funcs: f("hello")

Hàm có thể được truyền vào hàm khác như tham số

Hay được gọi là high-order function

def call(say): call = say("are you there ?") print(call()) call(say) # are your there?

Hàm có thể lồng nhau

Cho phép định nghĩa hàm trong hàm, hay gọi là inner function hay nested function.

def greet(): def say_hi(): print("Hi") return say_hi() greet() # Hi

Hàm say_hi không thể được gọi từ bên ngoài.

Nếu muốn gọi từ bên ngoài thì có thể trả về hàm để gọi:

def greet(context, name): def say_hi(name): print(f"Hi, {name}") def say_morning(name): print(f"Good morning, {name}") if context == "hi": return say_hi if context == "morning": return say_morning say_hi = greet("hi", "BeautyOnCode")
say_hi() # Hi, BeautyOnCode
say_morning = greet("morning", "BeautyOnCode")
say_morning() # Good morning, BeautyOnCode

Hàm có thể truy cập các biến cục bộ

(hay gọi là lexical closures hoặc closures)

Tức biến name của say_hi , say_morning có thể sử dụng từ bên ngoài hàm greet .

Ví dụ trên có thể viết ngắn gọn lại như sau:

def greet(context, name): def say_hi(): print(f"Hi, {name}") def say_morning(): print(f"Good morning, {name}") if context == "hi": return say_hi if context == "morning": return say_morning say_hi = greet("hi", "BeautyOnCode")
say_hi() # Hi, BeautyOnCode
say_morning = greet("morning", "BeautyOnCode")
say_morning() # Good morning, BeautyOnCode

Đối tượng có thể có hành vi giống hàm

Object không phải là function trong Python, nhưng chúng vẫn có thể được gọi như function.

class SumWith: def __init__(self, a): self.a = a def __call__(self, b): return print(self.a + b) # Gọi tính tổng 3 và 4
sum_with_three = SumWith(3)
sum_with_three(4) # 7

Khi gọi SumWith(3), hàm __call__ sẽ được gọi.

Để kiểm tra một đối tượng có gọi được không, có thể sử dụng hàm built-in callable

callable(sum_with_three) # True
callable(True) # False

Trên đây là một số tóm tắt từ bài viết hữu ích từ Dan Bader. Bài viết gốc nằm ở blog cá nhân của mình, mời bạn ghé chơi.


If you think these contents are helpful, you could send me an encouraging by:

🤘 Chat with me 🤘

See you around, friends!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thao tác với File trong Python

Python cung cấp các chức năng cơ bản và phương thức cần thiết để thao tác các file. Bài viết này tôi xin giới thiệu những thao tác cơ bản nhất với file trong Python.

0 0 63

- vừa được xem lúc

Tập tành crawl dữ liệu với Scrapy Framework

Lời mở đầu. Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 demo nho nhỏ.

0 0 166

- vừa được xem lúc

Sử dụng Misoca API (oauth2) với Python

Với bài viết này giúp chúng ta có thể nắm được. ・Tìm hiểu cách xử lý API misoca bằng Python.

0 0 49

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 3)

Tiếp tục phần 2 của series Pandas DataFrame nào. Let's go!!. Ở phần trước, các bạn đã biết được cách lấy dữ liệu một row hoặc column trong Pandas DataFame rồi phải không nào. 6 Hoc.

0 0 63

- vừa được xem lúc

Lập trình socket bằng Python

Socket là gì. Một chức năng khác của socket là giúp các tầng TCP hoặc TCP Layer định danh ứng dụng mà dữ liệu sẽ được gửi tới thông qua sự ràng buộc với một cổng port (thể hiện là một con số cụ thể), từ đó tiến hành kết nối giữa client và server.

0 0 79

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 2)

Nào, chúng ta cùng đến với phần 2 của series Pandas DataFrame. Truy xuất Labels và Data. Bạn đã biết cách khởi tạo 1 DataFrame của mình, và giờ bạn có thể truy xuất thông tin từ đó. Với Pandas, bạn có thể thực hiện các thao tác sau:.

0 0 95