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ả.

Đặc Điểm Chính Của Generator

1. Sử Dụng Từ Khóa 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

2. Tiết Kiệm Bộ Nhớ

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.

3. Có Thể Lặp Lại

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

Cách Tạo Generator

Bạn có thể tạo generator bằng hai cách:

1. Sử Dụng Hàm Với Từ Khóa 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.

2. Sử Dụng Biểu Thức Generator

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

Khi Nào Nên Sử Dụng Generator

  • Khi Làm Việc Với Tập Dữ Liệu Lớn: Khi bạn cần xử lý tập dữ liệu lớn mà không muốn tải toàn bộ vào bộ nhớ.
  • Khi Bạn Muốn Tạo Dữ Liệu Vô Hạn: Generators cho phép bạn tạo ra một chuỗi giá trị vô hạn, như số nguyên liên tiếp.
  • Khi Cần Hiệu Năng Tốt Hơn: Sử dụng generators giúp cải thiện hiệu suất của ứng dụng bằng cách giảm lượng bộ nhớ sử dụng.

Ví Dụ Về Generator Vô Hạn

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

Kết Luận

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.