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
   75   76   77   78   79   80   81   82   83   84   85