Page 80 - Python Simple
P. 80
9. Lớp http://www.vithon.org/tutorial/2.5/node11.html
mọi dữ liệu và câu lệnh đã được thực thi lần cuối). Một ví dụ cho thấy bộ sinh có thể
được tạo ra rất dễ dàng:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
>>> for char in reverse('golf'):
... print char
...
f
l
o
g
Bất kỳ việc gì có thể được thực hiện với bộ sinh cũng có thể được thực hiện với các bộ
lặp dựa trên lớp như đã bàn đến ở phần trước. Điều khiến bộ sinh nhỏ gọn là các
phương thức __iter__() và next() được tự động tạo ra.
Một tính năng chính khác là các biến nội bộ và trạng thái thực thi được tự động lưu
giữa các lần gọi. Điều này làm cho hàm dễ viết hơn và rõ ràng hơn là cách sử dụng
biến trường hợp như self.index và self.data.
Thêm vào việc tự động tạo và lưu trạng thái chương trình, khi các bộ tạo kết thúc,
chúng tự động nâng StopIteration. Cộng lại, các tính năng này làm cho việc tạo các
bộ lặp không có gì khó hơn là viết một hàm bình thường.
9.11 Biểu thức bộ tạo
Một vài bộ sinh đơn giản có thể được viết một cách xúc tích như các biểu thức bằng
cách dùng một cú pháp giống như gộp danh sách (list comprehension) nhưng với
ngoặc tròn thay vì ngoặc vuông. Các biểu thức này được thiết kế cho những khi bộ
sinh được sử dụng ngay lập tức bởi hàm chứa nó. Biểu thức bộ sinh gọn hơn nhưng ít
khả chuyển hơn là các định nghĩa bộ sinh đầy đủ và thường chiếm ít bộ nhớ hơn là gộp
danh sách tương đương.
Ví dụ:
>>> sum(i*i for i in range(10)) # sum of squares
285
>>> xvec = [10, 20, 30]
>>> yvec = [7, 5, 3]
>>> sum(x*y for x,y in zip(xvec, yvec)) # dot product
260
>>> from math import pi, sin
>>> sine_table = dict((x, sin(x*pi/180)) for x in range(0, 91))
>>> unique_words = set(word for line in page for word in line.split())
>>> valedictorian = max((student.gpa, student.name) for student in graduates)
>>> data = 'golf'
12 of 13 08/31/2011 10:27 AM