---
# System prepended metadata

title: 'Chap 5: First class function'

---

Chap 5: First class function
======
**"First class object"** là một thực thể lập trình gồm 3 tính chất:
* Khởi tạo lúc chạy(run time)
* Được gán cho một thành phần trong cấu trúc dữ liệu
* Có thể được truyền vào như 1 tham số của hàm
* Có thể coi như là kết quả tra ve của hàm

vd : Integer, string, dict, ...


Trong python, function la 1 first class object, có thể gán được cho 1 biến bất kì, truyền được vào hàm như 1 tham số, và có thê được trả về nhự ké7t quả của hàm. 1 hàm có tham số là hàm khác, hoặc kết quả trả về là 1 hàm thì đượ c  gọi là **high-order function**, vd: map, filter (đã trở nên ko cần thiết trong python3), reduce (đã không còn là built in function trong python3) ,all, any ... .

## Anonymus function
keyword lambda đuợc dùng để tạo ra anonymus function trong python, cú pháp hàm vô danh rất đơn giản nện nó bị giới hạn ko được có lệ gán hay các lệnh phức tạp như while, try, ...

## Callable object

function và anonymus function là 2 trong số 7 loại đối tưọng có thể gọi gốm:
* function do nguoi dung tao (def hoac lambda)
* built-in function (function implemented in C)
* built-in methods (method implemented in C, vd: dict.get)
* methods: ham duoc dinh nghia trong class
* classes: khi 1 class duoc goi voi cac them so truyen vao, no se chay lan luot __new__ va __init__ sau do tra ve object moi duoc khoi tai
* class instances: class duoc dinh nghia phuong thuc __call__
* generator functions: function gom keyword yeild

sử dụng hàm callable() để kiểm tra xem 1 object là gọi được hay ko

## Các thuộc tính đặc biệt của function:
* __annotations__: dict - cac tham so truyen vao/ tra ve va kieu cua chung
* __call__: method thuc hien khi goi ham
* __closure__: cac rang buoc cua cac bien (thuong la None)
* __code__: metadata va body cua ham da duoc dich sang bytecode
* __defaults__: cac gia tri mac dinh cua cac tham so
* __get__: noi ro hon o chap 20

## Keyword-Only Parameters
 python3 co them tinh nang tham so chi co the truyen vao boi keyword. VD: `def add(a, *, b)`, tham so b chi co the 
 
 ## Retrieving Information About Parameters
 
 python, cac ide, trinh sua loi co the dung 2 thuoc tinh func.__code__.co_varnames(ten cac bien la tham so va duoc khai bao trong ham) va func.__code__.co_argcount (so tham so truyen vao ham) de phat hien loi. Ngoai ra, con co the dung ham signature tu inspect
 
 ## Function Annotation
 VD: def clip(text: str, max_len:'int > 0'=80) -> str
 Ham nay co 3 annotation : {'text': <class 'str'>, 'max_len': 'int > 0', 'return': <class 'str'>}
 Python se luu cac annotation nay vao bien __annotations__ va chi nhu vay thoi, hoan toan ko co tac dung gi luc chay, ide hay trinh sua loi se dung cac metadata nay vao phat hien loi. Mot so framework nang cao thi ho tro viec tu dong format cac tham so dau vao va dau ra theo dung annotation.
 
 # Packages for Functional Programming