2012-03-10 36 views
14

Tôi đang cố gắng hiểu tại sao tôi có thể lặp lại theo chuỗi. Những gì tôi nhìn thấy trong tài liệu hướng dẫn là:Tại sao có thể lặp lại một chuỗi?

Một phương pháp cần phải được xác định cho các đối tượng container để cung cấp lặp hỗ trợ:

container. __ iter __()

Trả về đối tượng trình lặp. Đối tượng được yêu cầu để hỗ trợ giao thức trình lặp được mô tả bên dưới. Nếu vùng chứa hỗ trợ các loại lặp lại khác nhau, các phương thức bổ sung có thể là được cung cấp để yêu cầu cụ thể trình vòng lặp cho các loại lặp lại đó. (Ví dụ về đối tượng hỗ trợ nhiều dạng lặp lại sẽ là là cấu trúc cây hỗ trợ cả hai chiều ngang đầu tiên và chiều sâu đầu tiên.) Phương pháp này tương ứng với khe tp_iter thuộc loại cấu trúc cho đối tượng Python trong Python/C API.

Các iterator đối tượng mình được yêu cầu để hỗ trợ sau hai phương pháp, mà cùng nhau tạo thành giao thức iterator:

iterator. __ iter __()

Trả lại chính đối tượng trình lặp. Đây là yêu cầu để cho phép sử dụng cả vùng chứa và vòng lặp với số cho và trong báo cáo. Phương thức này tương ứng với khe tp_iter của cấu trúc kiểu cho các đối tượng Python trong API Python/C.

trình lặp. next()

Trả lại mục tiếp theo từ vùng chứa. Nếu có không có mục nào khác, hãy tăng ngoại lệ StopIteration. Phương thức này tương ứng với vị trí tp_iternext của cấu trúc kiểu cho các đối tượng Python trong Python/C API.

Nhưng ...

>>> dir('aa') 
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', 
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', 
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', 
'__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
'_formatter_field_name_split', '_formatter_parser', 'capitalize', 
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 
'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 
'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 
'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 
'swapcase', 'title', 'translate', 'upper', 'zfill'] 

Tôi không thấy ở đây bất kỳ __ iter __() hoặc tiếp theo(). Vậy tại sao nó hoạt động?

+4

Mặc dù tôi nghi ngờ nó có liên quan ở đây, không đặt quá nhiều niềm tin vào 'dir' trong những trường hợp như vậy. Như các tài liệu nói: "Bởi vì dir() được cung cấp chủ yếu như một sự thuận tiện để sử dụng tại dấu nhắc tương tác, nó cố gắng cung cấp một bộ tên thú vị hơn là cố gắng cung cấp một bộ tên được xác định chặt chẽ hoặc nhất quán và chi tiết Ví dụ, các thuộc tính metaclass không có trong danh sách kết quả khi đối số là một lớp. " – delnan

+6

chỉ để làm rõ mọi thứ. 'trường hợp' str' thực hiện '__iter__' như của python 3.2 – soulcheck

+0

Mã của tôi đã được thử nghiệm trên 2.7.2. – Adam

Trả lời

9

Bộ lặp mới trong Python 2.2. Phương pháp cũ là giao thức chuỗi (thực hiện __getitem__ với chỉ số dựa trên 0) và vẫn hoạt động.

Các vấn đề liên quan