này with_default_value
chức năng là những gì thường được gọi (không chính xác) như "đóng cửa" (về mặt kỹ thuật, việc đóng cửa là đúng hơn là nội chức năng đó được trở lại, đây newfunc
- xem ví dụ here). Thông thường hơn, with_default_value
là hàm số thứ tự cao hơn ("HOF"): có chức năng (func
) làm đối số, nó cũng trả về hàm (newfunc
).
Tôi đã nhìn thấy câu trả lời khó hiểu này với trang trí khái niệm và xây dựng bằng Python, mà chắc chắn không là trường hợp - đặc biệt là kể từ khi bạn đề cập đến func
thường xuyên là một built-in như int
. Trang trí cũng là các chức năng bậc cao hơn, nhưng thay vào đó là các chức năng cụ thể: các chức năng trả về trang trí, tức là"được làm giàu", phiên bản của đối số chức năng của chúng (chỉ là đối số chỉ đối số - "trang trí với đối số" được lấy thông qua một cấp độ khác của hàm/đóng cửa lồng nhau, không bằng cách cho trang trí HOF nhiều hơn một đối số) , được gán lại chính xác cùng tên với đối số chức năng đó (và vì vậy thường có cùng chữ ký - bằng cách sử dụng một trình trang trí khác sẽ là cực kỳ riêng, không phải là thành ngữ, không đọc được, v.v ...).
Vì vậy, hãy quên trang trí, hoàn toàn không liên quan gì đến vụ án và tập trung vào việc đóng cửa newfunc
. Hàm song song có thể tham chiếu đến (mặc dù không rebind) tất cả các tên biến cục bộ (bao gồm tên đối số, vì đối số là biến cục bộ) của (các) hàm kèm theo - đó là lý do tại sao nó được gọi là đóng: "biến miễn phí". Tại đây, newfunc
có thể tham chiếu đến func
và default
- và thực hiện.
Hàm bậc cao là một điều rất tự nhiên trong Python, đặc biệt vì hàm là đối tượng hạng nhất (vì vậy không có gì đặc biệt bạn cần làm để chuyển chúng làm đối số, trả về dưới dạng giá trị hàm hoặc thậm chí lưu trữ chúng trong danh sách hoặc các vùng chứa khác, vv) và không có sự khác biệt về không gian tên giữa các hàm và các loại đối tượng khác, không có chức năng gọi tự động bởi vì chúng được đề cập, v.v. (Khó hơn - khó hơn một chút, hoặc khó khăn hơn, tùy theo - bằng các ngôn ngữ khác vẽ nhiều sự phân biệt của loại này). Trong Python, đề cập đến một hàm chỉ là - một đề cập; CALL chỉ xảy ra nếu và khi đối tượng hàm (được gọi theo tên, hoặc theo cách khác) được theo sau bởi dấu ngoặc đơn.
Đó là tất cả về ví dụ này - vui lòng chỉnh sửa câu hỏi của bạn, nhận xét tại đây, v.v. nếu có một số khía cạnh cụ thể khác mà bạn vẫn còn nghi ngờ!
Chỉnh sửa: vì vậy, OP nhận xét lịch sự yêu cầu thêm ví dụ về "nhà máy đóng cửa". Dưới đây là một - tưởng tượng một số loại trừu tượng của GUI toolkit, và bạn đang cố gắng để làm:
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
nhưng điều này không làm việc đúng - i
trong lambda
là muộn-ràng buộc, như vậy theo thời gian một nút được nhấp vào Giá trị i
luôn là chỉ số của nút cuối cùng, bất kể nút nào được nhấp vào. Có những giải pháp khả thi khác nhau, nhưng một nhà máy đóng cửa là một khả năng thanh lịch:
def makeOnclick(message):
return lambda: mainwin.settitle(message)
for i in range(len(buttons)):
buttons[i].onclick(makeOnClick("button %d click!" % i))
Ở đây, chúng ta đang sử dụng các nhà máy đóng cửa để tinh chỉnh thời gian ràng buộc của các biến -) Trong một hình thức cụ thể này hay cách khác, đây là một trường hợp sử dụng khá phổ biến cho các nhà máy đóng cửa.
không nên có một khoảng trống như "if ismissing"? – recursive