Generator là một loại iterable trong Python, cho phép bạn tạo ra các giá trị theo yêu cầu thay vì lưu trữ tất cả các giá trị trong bộ nhớ. Điều này giúp tiết kiệm bộ nhớ và xử lý các tập dữ liệu lớn hoặc vô hạn một cách hiệu quả.
yield
Generators sử dụng từ khóa yield
để trả về giá trị. Khi hàm chứa yield
được gọi, nó không thực thi ngay mà trả về một generator object. Mỗi lần generator được gọi, nó sẽ tiếp tục từ nơi mà nó đã dừng lại, cho phép nó “nhớ” trạng thái giữa các lần gọi.
Ví dụ:
def countdown(n): while n > 0: yield n n -= 1
Generators chỉ tạo ra giá trị khi cần thiết, do đó chúng tiêu tốn ít bộ nhớ hơn so với danh sách chứa tất cả các giá trị cùng một lúc. Điều này rất hữu ích khi làm việc với tập dữ liệu lớn.
Bạn có thể lặp qua các giá trị do generator tạo ra bằng cách sử dụng vòng lặp for
, hoặc gọi hàm next()
để nhận giá trị tiếp theo.
Ví dụ sử dụng generator:
for number in countdown(5): print(number)
Kết quả:
5 4 3 2 1
Bạn có thể tạo generator bằng hai cách:
yield
Đây là cách phổ biến nhất để tạo generator. Bạn định nghĩa một hàm và sử dụng yield
để trả về các giá trị.
def countdown(n): while n > 0: yield n n -= 1
Khi bạn gọi hàm countdown(5)
, nó sẽ trả về một generator object.
Bạn có thể tạo generator bằng cách sử dụng biểu thức generator, một cách ngắn gọn hơn so với việc sử dụng hàm.
squares = (x * x for x in range(5))
Bạn có thể sử dụng vòng lặp for
để lặp qua các giá trị được tạo ra bởi generator:
for square in squares: print(square)
Kết quả:
0 1 4 9 16
def infinite_numbers(): n = 0 while True: yield n n += 1 # Sử dụng generator gen = infinite_numbers() for i in gen: if i > 10: break print(i)
Kết quả:
0 1 2 3 4 5 6 7 8 9 10
Generators là một công cụ mạnh mẽ trong Python, giúp tiết kiệm bộ nhớ và cải thiện hiệu suất trong nhiều tình huống. Việc sử dụng generators cho phép bạn làm việc với các tập dữ liệu lớn mà không gặp phải vấn đề về hiệu suất. Bạn có thể sử dụng generators để xử lý chuỗi dữ liệu, tạo ra dữ liệu vô hạn, hoặc khi cần giảm thiểu sử dụng bộ nhớ. Generators không chỉ giúp tiết kiệm tài nguyên mà còn mang lại sự linh hoạt trong cách bạn xử lý và tạo ra dữ liệu trong ứng dụng của mình.