Bộ thu thập Python

Bộ thu thập Python

Bộ thu thập là đối tượng chứa số lượng tính toán của giá trị.

Bộ thu thập là đối tượng có thể duyệt qua, điều này có nghĩa là bạn có thể duyệt qua tất cả các giá trị.

Trên thực tế, trong Python, bộ thu thập là đối tượng thực hiện giao thức bộ thu thập, nó chứa phương thức __iter__()__next__().

Bộ thu thập VS Đối tượng có thể duyệt qua (Iterable)

danh sách, ma trận, từ điển và bộ thu thập đều là đối tượng có thể duyệt qua. Chúng là bộ chứa có thể duyệt qua, từ đó bạn có thể lấy bộ thu thập (Iterator).

Tất cả các đối tượng này đều có phương thức để lấy bộ thu thập iter() Phương thức:

Ví dụ

Trả về bộ thu thập từ ma trận và in từng giá trị:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))

Chạy Ví Dụ

Dù chuỗi cũng là đối tượng có thể duyệt qua và có thể trả về bộ thu thập:

Ví dụ

Chuỗi cũng là đối tượng có thể duyệt qua, bao gồm một loạt ký tự:

mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

Chạy Ví Dụ

Duyệt bộ thu thập

Chúng ta cũng có thể sử dụng vòng lặp for để duyệt các đối tượng có thể duyệt qua:

Ví dụ

Duyệt các giá trị của ma trận:

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

Chạy Ví Dụ

Ví dụ

Duyệt các ký tự trong chuỗi:

mystr = "banana"
for x in mystr:
  print(x)

Chạy Ví Dụ

Lưu ý:Vòng lặp for thực tế tạo ra một đối tượng bộ thu thập và thực hiện next() phương thức.

tạo bộ thu thập.

Để tạo đối tượng/klasse là bộ thu thập, bạn phải thực hiện __iter__()__next__() phương thức.

Như bạn đã học trong chương Python lớp/đối tượng, tất cả các lớp đều có tên __init__() Hàm, cho phép bạn thực hiện một số khởi tạo khi tạo đối tượng.

__iter__() Phương pháp có tác dụng tương tự, bạn có thể thực hiện các thao tác (khởi tạo v.v.), nhưng phải luôn luôn trả về đối tượng bộ điều khiển truy vấn.

__next__() Phương pháp cũng cho phép bạn thực hiện các thao tác và phải trả về mục tiếp theo trong chuỗi.

Ví dụ

Tạo một bộ điều khiển truy vấn trả về số, bắt đầu từ 1, mỗi chuỗi sẽ tăng lên 1 (trả về 1, 2, 3, 4, 5 v.v.):

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
  def __next__(self):
    x = self.a
    self.a += 1
    return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Chạy Ví Dụ

StopIteration

Nếu bạn có đủ next() câu lệnh, hoặc trong vòng lặp for, ví dụ trên sẽ tiếp tục vô hạn.

Để tránh việc lặp vô hạn, chúng ta có thể sử dụng StopIteration câu lệnh.

trong __next__() Trong phương pháp, nếu quá trình lặp hoàn thành số lần đã chỉ định, chúng ta có thể thêm một điều kiện dừng để gây ra lỗi:

Ví dụ

Dừng sau 20 lần lặp:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
  print(x)

Chạy Ví Dụ