Trong Python, một trình lặp là bất kỳ đối tượng nào hỗ trợ giao thức trình lặp. Một phần của giao thức đó là đối tượng phải có phương thức __iter__()
trả về đối tượng trình lặp. Tôi cho rằng điều này mang lại cho bạn một số tính linh hoạt để một đối tượng có thể chuyển giao trách nhiệm của vòng lặp cho một lớp bên trong hoặc tạo một số đối tượng đặc biệt. Trong mọi trường hợp, phương pháp __iter__()
thường chỉ có một dòng và đường đó thường chỉ đơn giản là return self
Phần khác của giao thức là phương pháp next()
và đây là nơi thực hiện công việc thực. Phương pháp này phải tìm ra hoặc tạo ra hoặc nhận được điều tiếp theo, và trả lại nó. Nó có thể cần phải theo dõi nó ở đâu để lần sau nó được gọi, nó thực sự trả lại điều tiếp theo.
Một khi bạn có một đối tượng trả về điều tiếp theo trong một chuỗi, bạn có thể thu gọn vòng lặp for trông như thế này:
myname = "Fredericus"
x = []
for i in [1,2,3,4,5,6,7,8,9,10]:
x.append(myname[i-1])
i = i + 1 # get the next i
print x
vào đây:
myname = "Fredericus"
x = [myname[i] for i in range(10)]
print x
Chú ý rằng có không có nơi nào chúng ta có mã nhận giá trị tiếp theo của i vì phạm vi (10) là một đối tượng theo sau giao thức vòng lặp, và việc hiểu danh sách là một cấu trúc sử dụng giao thức vòng lặp.
Bạn cũng có thể sử dụng giao thức trình lặp trực tiếp. Ví dụ, khi viết kịch bản để xử lý các file CSV, tôi thường viết này:
mydata = csv.reader(open('stuff.csv')
mydata.next()
for row in mydata:
# do something with the row.
Tôi đang sử dụng iterator trực tiếp bằng cách gọi next()
bỏ qua dòng tiêu đề, sau đó sử dụng nó một cách gián tiếp thông qua in
nhà điều hành được xây dựng trong trong for
tuyên bố.
Những chương trong đó cuốn sách? Điều đó sẽ giúp chúng tôi thu hẹp nguồn gốc của sự nhầm lẫn của bạn. –
học python chương 24 trang 493 - 495 – sss
Nếu bạn nhìn vào mô-đun itertools tài liệu thư viện chuẩn, bạn sẽ tìm thấy một số hàm yêu cầu phương thức __iter __() để hoạt động. –