Page 79 - Python Simple
P. 79
9. Lớp http://www.vithon.org/tutorial/2.5/node11.html
và hợp nhất Python. Đằng sau màn nhung, câu lệnh for gọi iter() trên đối tượng
chứa. Hàm này trả về một đối tượng bộ lặp có định nghĩa phương thức next() để truy
xuất và các phần tử trong bộ chứa (container). Khi không còn phần tử nào, next()
nâng biệt lệ StopIteration để yêu cầu vòng lặp for kết thúc. Ví dụ sau cho thấy cách
hoạt động:
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> it.next()
'a'
>>> it.next()
'b'
>>> it.next()
'c'
>>> it.next()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
it.next()
StopIteration
Chúng ta đã hiểu giao thức bộ lặp, nên chúng ta có thể thêm cách thức bộ lặp
(iterator behavior) vào lớp của chúng ta một cách dễ dàng. Định nghĩa một phương
thức __iter__() trả về một đối tượng với một phương thức next() . Nếu lớp có định
nghĩa next(), thì __iter__() chỉ cần trả về self:
class Reverse:
"Iterator for looping over a sequence backwards"
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def next(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
>>> for char in Reverse('spam'):
... print char
...
m
a
p
s
9.10 Bộ tạo
Bộ sinh (generator) là một công cụ đơn giản và mạnh mẽ để tạo các bộ lặp. Chúng
được viết như những hàm thông thường nhưng dùng câu lệnh yield khi nào chúng
muốn trả về dữ liệu. Mỗi lần next() được gọi, bộ sinh trở lại nơi nó đã thoát ra (nó nhớ
11 of 13 08/31/2011 10:27 AM