Bỏ qua để đến nội dung

Generator exhaustion - Dùng 1 lần rồi... hết!

gen = (x for x in range(5))
# Lần 1
print(list(gen)) # [0, 1, 2, 3, 4] ✅
# Lần 2
print(list(gen)) # [] ❌ Rỗng?!

What the Python?! Generator dùng 1 lần rồi hết?! 😱

gen = (x for x in range(3))
# Iterate lần 1
for x in gen:
print(x) # 0, 1, 2
# Iterate lần 2
for x in gen:
print(x) # Không in gì! Generator đã exhausted
# List - Store values
lst = [x for x in range(1000000)] # Chiếm RAM!
# Generator - Generate on-the-fly
gen = (x for x in range(1000000)) # Không chiếm RAM
# Nếu cần dùng nhiều lần
gen = (x for x in range(5))
data = list(gen) # Convert 1 lần
print(data) # [0, 1, 2, 3, 4]
print(data) # [0, 1, 2, 3, 4] ✅
def create_gen():
return (x for x in range(5))
# Dùng lần 1
gen1 = create_gen()
print(list(gen1)) # [0, 1, 2, 3, 4]
# Dùng lần 2
gen2 = create_gen()
print(list(gen2)) # [0, 1, 2, 3, 4] ✅
import itertools
gen = (x for x in range(5))
gen1, gen2 = itertools.tee(gen, 2)
print(list(gen1)) # [0, 1, 2, 3, 4]
print(list(gen2)) # [0, 1, 2, 3, 4] ✅
# 1. Data lớn
def read_large_file(filename):
with open(filename) as f:
for line in f: # Generator
yield line.strip()
# 2. Infinite sequences
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# 3. Pipeline
squares = (x**2 for x in range(1000000))
evens = (x for x in squares if x % 2 == 0)

Generators:

  • ✅ Memory efficient
  • ⚠️ Chỉ iterate 1 lần
  • 🔧 Convert sang list nếu cần reuse
  • 🔄 Hoặc tạo lại generator

Pattern:

# Dùng 1 lần
gen = (x for x in data)
# Dùng nhiều lần
data_list = list(gen)