Cách sử dụng Trình tạo trong Python (câu lệnh lợi nhuận)

Tìm hiểu cách viết trình tạo bằng Python. Hiểu từ khóa lợi nhuận, đánh giá lười biếng, tối ưu hóa bộ nhớ và so sánh các trình tạo với cấu trúc danh sách.

Hãy thử Giải pháp này trong Trình chỉnh sửa

Tổng quan

Khi làm việc với các tập dữ liệu lớn, tệp nhật ký hoặc luồng dữ liệu vô hạn, việc tải đồng thời tất cả các phần tử vào bộ nhớ (như trả về một danh sách lớn) có thể dễ dàng làm cạn kiệt RAM hệ thống và làm hỏng ứng dụng của bạn. Python cung cấp một giải pháp tuyệt vời và tiết kiệm bộ nhớ: Generators.

Trình tạo là một loại hàm đặc biệt trả về một trình vòng lặp lười biếng. Thay vì tính toán tất cả các giá trị cùng một lúc và trả về chúng, trình tạo sẽ tạo ra từng giá trị một theo yêu cầu. Sự khác biệt chính là câu lệnh `yield`. Khi một hàm tạo gọi `yield`, nó sẽ tạm dừng trạng thái thực thi của nó (các biến, con trỏ lệnh) và trả về giá trị mang lại. Khi giá trị tiếp theo được yêu cầu, hàm sẽ tiếp tục chính xác tại nơi nó tạm dừng.

Bởi vì các phép tính của trình tạo được thực thi một cách lười biếng nên chúng sử dụng bộ nhớ gần như bằng 0 bất kể kích thước tập dữ liệu. Python cũng hỗ trợ các biểu thức trình tạo, sử dụng cú pháp ngoặc đơn `(x for x in data)` để tạo các trình tạo nội tuyến nhẹ mà không cần khai báo các hàm đầy đủ.

Đầu ra mã & thực thi

Tập lệnh này minh họa việc tạo chuỗi bằng cách sử dụng các hàm tạo với câu lệnh lợi nhuận và biểu thức trình tạo.

# 1. Generator function using yield
def count_up_to(limit):
    count = 1
    while count <= limit:
        yield count
        count += 1

# Instantiating the generator
counter = count_up_to(3)
print("Memory safe generator instantiated.")

# Fetching values manually
print("Next 1:", next(counter))
print("Next 2:", next(counter))
print("Next 3:", next(counter))

# 2. Iterating with a for loop (automatically handles StopIteration)
print("\n--- Looping over generator ---")
for num in count_up_to(4):
    print("Num:", num)

# 3. Generator expression (Shorthand syntax)
squares_gen = (x**2 for x in range(1, 4))
print("\nGenerator expression elements:")
print(list(squares_gen)) # Cast to list to print all elements
Đầu ra thiết bị đầu cuối
Memory safe generator instantiated.
Next 1: 1
Next 2: 2
Next 3: 3

--- Looping over generator ---
Num: 1
Num: 2
Num: 3
Num: 4

Generator expression elements:
[1, 4, 9]

Triển khai từng bước

  • Xác định hàm bằng từ khóa def tiêu chuẩn.
  • Sử dụng từ khóa lợi nhuận thay vì trả về các giá trị mang lại cho luồng lặp.
  • Lặp lại trình tạo bằng vòng lặp for hoặc gọi hàm next(gen) tích hợp để trích xuất các giá trị.
  • Sử dụng biểu thức trình tạo (sử dụng dấu ngoặc đơn) để chuyển đổi từng phần đơn giản, nội tuyến.

Câu hỏi thường gặp

Ưu điểm chính của máy phát điện so với danh sách là gì?

Hiệu quả bộ nhớ. Danh sách lưu trữ đồng thời tất cả các thành phần trong RAM, trong khi trình tạo cung cấp từng mục một theo yêu cầu, cho phép bạn xử lý các tập dữ liệu lớn hơn tổng bộ nhớ của hệ thống.

Điều gì xảy ra khi máy phát điện hết vật phẩm?

Python đưa ra một ngoại lệ StopIteration. Vòng lặp for tự động bắt ngoại lệ này để thoát khỏi vòng lặp một cách duyên dáng, nhưng việc gọi next() trên một trình tạo đã cạn kiệt theo cách thủ công sẽ loại bỏ ngoại lệ.

Chủ đề liên quan

Tài nguyên Python được đề xuất

Mở rộng kiến thức của bạn với các hướng dẫn tương tác, bảng ghi chú và so sánh mã có liên quan.