Đánh giá chậm là khi biểu thức không được đánh giá cho đến khi cần. Trong hầu hết các ngôn ngữ, bạn sử dụng một cái gì đó như lambda
để thực hiện công việc này. Dưới đây là một ví dụ contrived cho thấy một phần của khái niệm:
def list_files():
for fn in os.listdir('.'):
yield fn, lambda: open(fn, 'r').read()
for fn, body in list_files():
if fn.endswith('.txt'):
print body()
đây, list_files
trả về một loạt các tên tập tin và một "thunk" (lambda không có đối số) trả về nội dung của tập tin. "Thunk" là một đánh giá hoãn lại. Sử dụng thunks cho phép bạn tách mối quan tâm của bạn:
- Vòng lặp for không cần phải biết làm thế nào để đọc file, vì vậy
list_files
có thể được thay thế bằng list_ftp_files
hoặc list_zip_archive
.
- Chức năng
list_files
không cần biết tệp nào sẽ được đọc. Với thunks, nó không phải đọc từng tập tin.
Trong đánh giá thích hợp, một khi bạn đánh giá "thunk", nó sẽ tự thay thế bằng bản sao được đánh giá, vì vậy việc đánh giá nó hai lần sẽ không hoạt động nhiều hơn việc đánh giá nó một lần. Có nhiều cách khác để thực hiện điều tương tự, chẳng hạn như với các lớp và đối tượng có giá trị bộ nhớ cache.
Đánh giá chậm là một thành ngữ (tương đối) phổ biến trong Đề án. Trong Haskell, các đánh giá được hoãn lại theo mặc định và bạn không cần bất kỳ cú pháp nào để thực hiện nó (có cú pháp đặc biệt để tắt nó).
Nguồn
2010-02-19 05:36:02
Tôi nghĩ rằng bạn đang bối rối hệ thống kiểu và đánh giá lười biếng trong ví dụ thứ 2 của bạn. Ngôn ngữ đánh máy "mạnh" có thể sử dụng đánh giá lười biếng để thực hiện các thủ thuật gọn gàng. Ví dụ. Haskell có một hệ thống kiểu tĩnh rất mạnh với rất nhiều đánh giá lười biếng! Không giống như Python, 'if-then-else' phải kiểm tra kiểu, nhưng khác với việc đánh giá được hoãn lại. Ví dụ, bạn có thể viết 'nếu True thì 5 else undefined', và điều này biên dịch và chạy tốt (và kết quả là 5, như mong đợi). Đó là 'if-else' của bạn hoạt động trong Python mặc dù nó không gõ-kiểm tra trong một ngôn ngữ tĩnh là không liên quan đến chiến lược đánh giá. –