Python Iterator và Iterable

Iterable là gì?

Iterable là 1 đối tượng có thể lặp qua (bằng for). Iterable bao gồm List, Tuple, Set, Dictionary. Đây là những đối tượng iterable mà từ đó có thể tạo ra 1 iterator.

Tất cả những đối tượng này có method iter() để tạo ra 1 iterator.

String cũng là iterable object:

Python
str = "banana"
for x in str:
  print(x)
  
myIter = iter(str)

print(next(myIter))
print(next(myIter))

So sánh các kiểu dữ liệu iterable:

1. List:

Python
myList = ["apple", "banana", "cherry"]
myList = list(("apple", "banana", "cherry"))

List có thứ tự, có thể thay đổi, có thể trùng lặp.

List được index, bắt đầu từ 0.

Lấy item từ list: myList[1], myList[-2], myList[2:5], myList[2:]

Thay đổi item: myList[1] = "orange".

Loop bằng for x in myList hoặc dùng index.

List có thể sắp xếp bằng method sort(), đảo thứ tự bằng method reverse().

2. Tuple:

Python
myTuple = ("apple", "banana", "cherry")
myTuple = tuple(("a", "b", "c"))

Tuple có thứ tự và không thể thay đổi. Tuple là bất biến.

Cho phép trùng lặp, có index (đánh từ 0).

Không thể thay đổi giá trị, thêm, xóa (trừ khi convert sang List).

Loop được bằng for x in hoặc dùng index.

3. Set:

Python
mySet = {"apple", "banana", "cherry"}
mySet = set(("a", "b", "c"))

Set không có thứ tự, không thay đổi được, không index. Có thể thêm hoặc xóa item.

Set không trùng lặp.

Loop bằng for x in

4. Dictionary:

Python
myDict = {
  "brand": "Ford",
  "model": "Mustang",
  "year": 1964
}

myDict = dict(name = "John", age = 36)

Dictionary lưu trữ dưới dạng key:value.

Dictionary có thứ tự, có thể thay đổi và không cho phép trùng lặp.

Truy cập bằng key: myDict["brand"]. Hoặc dùng method get().

Loop bằng fox x in.

Iterator:

Iterator là một object chứa một số lượng giá trị đếm được.

Iterator là một đối tượng có thể lặp lại lên trên, nghĩa là bạn có thể đi qua tất cả các giá trị.

Iterator trong Python là một object implement giao thức iterator, bao gồm 2 method __iter__()__next()__.

Ví dụ: tạo 1 iterator từ tuple:

Python
myTuple = ("apple", "banana", "cherry")
myIter = iter(myTuple)

print(next(myIter))
print(next(myIter))
print(next(myIter))

Tạo 1 iterator:

Để tạo 1 đối tượng iterator, bạn cần implement method __iter__()__next__().

Method __iter__() trả về chính object đó. Method __iter__() hành động tương tự __init__(), nơi khởi tạo những thứ bạn cần, tuy nhiên method này luôn phải trả về chính nó.

Method __next__() trả về item tiếp theo trong thứ tự.

Ví dụ: tạo 1 iterator trả về các số, bắt đầu từ 1, mỗi sequence tăng lên 1 (1, 2, 3, 4 …):

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

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

StopIteration

Ví dụ trên sẽ chạy mãi nếu bạn gọi next() tiếp, hoặc nếu đặt trong vòng lặp for. Để ngăn chặn, ta dùng StopIteration. Trong method __next__(), thêm 1 điều kiện kết thúc để raise 1 error nếu iteration đạt đến 1 số lần nhất định:

Python
def __next__(self):
  if self.a <= 20:
    x = self.a
    self.a += 1
    return x
  else:
    raise StopIteration
    
# loop:
for x in myiter:
  print(x)

Trong khoa học máy tính, iterator là một đối tượng cho phép lập trình viên có thể duyệt qua 1 vùng chứa các dữ liệu, như 1 danh sách. Trong Python, iterator là đối tượng có phương thức __next__(), phương thức này trả về phần tử tiếp theo của đối tượng, nếu đối tượng không còn phần tử nào thì nó sẽ báo lỗi StopIteration.

Ví dụ:

Python
a = ["a", "b", "c"]
x = iter(a)
# list_iterator object
x.__next__()
# 'a'
x.__next__()
# 'b'
x.__next__()
# 'c'
x.__next__()
# StopIteration

Bản thân iterator cũng là iterable, có thể dùng vòng lặp for để duyệt qua.

Khi gọi iter() cho x thì nó trả về chính nó luôn.

Như vậy có thể dùng iterator để lặp qua 1 iterable vô hạn, ví dụ bội số của 3. Tất nhiên vòng lặp này vô hạn và không có ngoại lệ StopIteration.

Python
from itertools import count

def test_iterator(n):
    test_iter = count(step = 3)
    iterator = iter(test_iter)
    while True:
        try:
            number = next(iterator)
            # number = iterator.__next__()
            
            if number > n:
                break
        except StopIteration:
            break
        else:
            print(numer)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *