Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Lambda binding trong Python là gì?

Lambda binding (ràng buộc lambda) liên quan đến cách Python xử lý biến trong closure và tham số mặc định của lambda.

Cơ chế binding

Khi một hàm được gọi, giá trị hiện tại của tham số chính thức được lưu và gán cho đối số thực tế. Khi thoát khỏi phạm vi, giá trị gốc được khôi phục. Quy trình này là đệ quy.

Trong Python, chỉ có một binding cho mỗi biến: gán x = 5 chỉ thay đổi giá trị trong binding hiện có. Do đó, tham số mặc định thường được dùng để "bắt" giá trị tại thời điểm định nghĩa lambda.

Ví dụ minh họa

def function(x):
    a = lambda x=x: x  # bắt giá trị x hiện tại (2)
    x = 5
    b = lambda: x      # tham chiếu đến biến x bên ngoài (sau khi gán 5)
    return a, b

aa, bb = function(2)
print(aa())  # 2 - dùng default parameter binding
print(bb())  # 5 - dùng late binding (closure)
2
5

Giải thích

  • a = lambda x=x: x: Tham số mặc định x=x đánh giá ngay lúc định nghĩa (x=2). Lambda a "nhớ" giá trị 2.
  • b = lambda: x: Không có tham số mặc định -> late binding. Lambda b tra cứu biến x lúc gọi hàm (lúc này x=5).

Lambda function (hàm vô danh)

Python cho phép tạo hàm không tên qua lambda. Cú pháp: lambda tham_số: biểu_thức. Kết quả biểu thức là giá trị trả về.

square = lambda x: x * x
print(square(5))  # 25

Khi nào dùng default parameter trong lambda?

Khi tạo nhiều lambda trong vòng lặp và muốn mỗi lambda "nhớ" giá trị hiện tại của biến lặp:

# Sai: tất cả lambda dùng cùng biến i cuối cùng
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs])  # [2, 2, 2]

# Đúng: dùng default parameter để bắt giá trị
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs])  # [0, 1, 2]