14--Lập trình hướng quy trình, hàm ẩn danh và hàm dựng sẵn

I. Tư duy lập trình hướng quy trình và lập trình hàm


# Tư duy lập trình
# 1. Lập trình hướng quy trình:
    Trọng tâm là "quy trình", tức là chuỗi bước thực hiện: làm gì trước, gì sau
    Viết chương trình theo tư duy này giống như thiết kế dây chuyền sản xuất

    Ưu điểm: Biến bài toán phức tạp thành quy trình đơn giản
    Nhược điểm: Khó mở rộng khi yêu cầu thay đổi

# Ứng dụng tư duy hướng quy trình:
  1. Những phần mềm không cần cập nhật thường xuyên: ví dụ script hệ thống, kernel Linux, git, httpd
  2. Ngay cả phần mềm cần cập nhật, không phải tất cả thành phần đều cần thay đổi đồng thời:
    Ví dụ: chức năng đăng nhập (nhận đầu vào, kiểm tra hợp lệ, lưu trữ lâu dài)

# 2. Lập trình hàm không đơn giản là dùng hàm, mà xem phép tính máy tính như phép toán toán học
     Tập trung vào kết quả thay vì quy trình thực hiện
     Ngôn ngữ biểu tượng: Haskell, Erlang 
     Python không phải ngôn ngữ lập trình hàm
     Tuy nhiên vẫn hỗ trợ nhiều đặc tính lập trình hàm như lambda, map, reduce, filter

II. Hàm ẩn danh


# 1. def định nghĩa hàm có tên
# func lưu địa chỉ bộ nhớ của hàm
def tinh_tong(a, b):
    return a + b
print(tinh_tong)

# 2. lambda định nghĩa hàm ẩn danh
print(lambda x, y: x + y)

# 3. Gọi hàm ẩn danh
# Cách 1:
ket_qua = (lambda x, y: x + y)(5, 7)
print(ket_qua)

# Cách 2: Không khuyến khích vì tương đương hàm có tên
tinh_tong = lambda x, y: x + y
ket_qua = tinh_tong(5, 7)
print(ket_qua)

# 4. Ứng dụng hàm ẩn danh:
    Chủ yếu dùng cho các tác vụ tạm thời:
    Thường kết hợp với các hàm khác (dùng làm tham số, xử lý nội bộ)

III. Một số hàm dựng sẵn và kết hợp với hàm ẩn danh

1. Hàm max - Tìm giá trị lớn nhất


# max(đối tượng lặp, key=func)
salaries = {
    'siry': 3000,
    'tom': 7000,
    'lili': 10000,
    'jack': 2000
}

# Tìm nhân viên lương cao nhất
ket_qua = max(salaries, key=lambda k: salaries[k])
print(ket_qua)

2. Hàm min - Tìm giá trị nhỏ nhất


ket_qua = min(salaries, key=lambda k: salaries[k])
print(ket_qua)

3. Hàm sorted - Sắp xếp


ket_qua = sorted(salaries, key=lambda k: salaries[k], reverse=True)
print(ket_qua)

4. Hàm map - Ánh xạ


ten_nhan_vien = ['alex', 'lxx', 'wxx', 'Xuân']
ket_qua = map(lambda ten: ten + '_dsb', ten_nhan_vien)
print(list(ket_qua))

5. Hàm filter - Lọc


ten_nhan_vien = ['alex_sb', 'lxx_sb', 'wxx', 'Xuân']
ket_qua = filter(lambda ten: ten.endswith('_sb'), ten_nhan_vien)
print(list(ket_qua))

6. Hàm reduce - Kết hợp


from functools import reduce
ket_qua = reduce(lambda x, y: x + y, [1, 2, 3], 10)
print(ket_qua)

IV. Hàm dựng sẵn phổ biến


# 1. abs: Giá trị tuyệt đối
abs(-5)  # 5

# 2. all: Kiểm tra toàn bộ giá trị đúng
all([True, 1, 'a'])  # True

# 3. any: Kiểm tra tồn tại giá trị đúng
any([False, 0, ''])  # False

# 4. bin/oct/hex: Chuyển đổi cơ số
bin(10)  # '0b1010'

# 5. callable: Kiểm tra đối tượng có thể gọi
callable(len)  # True

# 6. chr/ord: Chuyển đổi ASCII
chr(97)  # 'a'
ord('a')  # 97

# 7. dir: Liệt kê thuộc tính đối tượng
dir([1, 2, 3])  # ['__add__', ...]

# 8. divmod: Trả về thương và dư
divmod(10, 3)  # (3, 1)

# 9. enumerate: Liệt kê chỉ số và giá trị
for i, ten in enumerate(['a', 'b', 'c'], 1):
    print(i, ten)

# 10. eval: Thực thi biểu thức từ chuỗi
eval('{"a": 1}')  # {'a': 1}

# 11. exec: Thực thi mã Python từ chuỗi
exec('print("Xin chào")')  # Xin chào

# 12. isinstance: Kiểm tra kiểu dữ liệu
isinstance([1, 2], list)  # True

# 13. __import__: Nhập module từ chuỗi
time = __import__('time')
time.sleep(1)

# 14. pow: Tính lũy thừa
pow(2, 3)  # 8

# 15. reversed: Đảo ngược chuỗi
list(reversed([1, 2, 3]))  # [3, 2, 1]

# 16. round: Làm tròn số
round(3.1415, 2)  # 3.14

# 17. zip: Kết hợp các đối tượng lặp
list(zip('abc', [1, 2, 3]))  # [('a', 1), ('b', 2), ('c', 3)]

Thẻ: lập-trình-hướng-quy-trình hàm-ẩn-danh hàm-dựng-sẵn python Lambda

Đăng vào ngày 14 tháng 8 lúc 09:30