Biểu thức generator
Bài học 9 trên 13 trong khóa học Trình lặp trong Python của Coddy.
Biểu thức sinh (generator expression) là cách ngắn gọn để tạo bộ lặp trong Python. Chúng là lựa chọn thay thế tiết kiệm bộ nhớ hơn so với phép hiểu danh sách (list comprehension), đặc biệt khi xử lý tập dữ liệu lớn hoặc chuỗi vô hạn.
Cú pháp của biểu thức sinh
Biểu thức sinh dùng cú pháp tương tự phép hiểu danh sách, nhưng dùng dấu ngoặc đơn thay vì dấu ngoặc vuông:
(expression for item in iterable if condition)Đặc điểm chính
- Đánh giá trì hoãn (lazy evaluation): Biểu thức sinh tạo từng phần tử một và chỉ tạo khi được yêu cầu, nhờ đó tiết kiệm bộ nhớ.
- Bộ lặp chỉ dùng một lần: Khi đã dùng hết, bạn không thể dùng lại chúng nếu không tạo lại bộ sinh.
- Cú pháp ngắn gọn: Chúng cung cấp cách viết súc tích để định nghĩa các hàm sinh đơn giản.
Ví dụ sử dụng
Đây là ví dụ đơn giản về biểu thức sinh tạo ra các số bình phương:
squares = (x**2 for x in range(5))
for square in squares:
print(square) # Đầu ra: 0, 1, 4, 9, 16
So sánh với phép hiểu danh sách
Dù có cú pháp tương tự, biểu thức sinh khác phép hiểu danh sách về mức sử dụng bộ nhớ:
# Biểu thức tạo danh sách (list comprehension) (tạo toàn bộ danh sách trong bộ nhớ)
squares_list = [x**2 for x in range(1000000)]
# Biểu thức generator (generator expression) (tạo một đối tượng generator)
squares_gen = (x**2 for x in range(1000000))
Biểu thức sinh tiết kiệm bộ nhớ hơn vì không tạo tất cả giá trị cùng một lúc.
Trường hợp sử dụng
Biểu thức sinh đặc biệt hữu ích khi:
- Làm việc với tập dữ liệu lớn
- Xử lý luồng dữ liệu
- Tạo quy trình xử lý dữ liệu
Bằng cách dùng biểu thức sinh, bạn có thể tạo các bộ lặp hiệu quả và tiết kiệm bộ nhớ cho nhiều tác vụ xử lý dữ liệu trong Python.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Thử thách
DễTạo một biểu thức trình sinh để lọc và biến đổi một dãy số. Trình sinh cần tạo ra bình phương của các số chẵn trong một phạm vi cho trước.
Bạn được cung cấp những dữ liệu sau:
- Hai số nguyên đầu vào:
startvàend(bao gồm cả hai giá trị)
Nhiệm vụ của bạn:
- Tạo một biểu thức trình sinh để:
- Lặp qua phạm vi từ
startđếnend(bao gồm cả hai giá trị) - Lọc bỏ các số lẻ
- Bình phương các số chẵn còn lại
- Lặp qua phạm vi từ
- Dùng biểu thức trình sinh trong một vòng lặp để in từng giá trị thu được trên một dòng mới
Đầu vào gồm hai số nguyên được phân tách bằng dấu cách, biểu thị start và end.
Tự làm thử
# Đọc đầu vào
start, end = map(int, input().split())
# TODO: Tạo biểu thức sinh (generator expression) tại đây
generator_exp = None # Thay None bằng biểu thức sinh của bạn
# In ra kết quả
for value in generator_exp:
print(value)Tất cả bài học trong Trình lặp trong Python
Tự luyện tập: Trình biên dịch Python online