Menu
CoddyTech

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.

quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

challenge icon

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: start và end (bao gồm cả hai giá trị)

Nhiệm vụ của bạn:

  1. Tạo một biểu thức trình sinh để:
    • Lặp qua phạm vi từ start đến end (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
  2. 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