Lặp lại trong Python là gì?

Trong Python, trình vòng lặp là một đối tượng có thể được lặp lại trên. Điều này có nghĩa là bạn có thể duyệt qua tất cả các giá trị trong đối tượng. Vòng lặp được sử dụng trong cả vòng lặp for và vòng lặp while. Tìm hiểu thêm với sự trợ giúp của bài đăng trên blog này

    1.  

Trình lặp trong Python là gì?

Trình lặp trong Python là một đối tượng chứa một số lượng phần tử có thể đếm được có thể được lặp lại khi. Nói một cách đơn giản hơn, chúng ta có thể nói rằng Iterators là các đối tượng cho phép bạn duyệt qua tất cả các phần tử của một bộ sưu tập và trả về một phần tử tại một thời điểm. Cụ thể hơn, chúng ta nói rằng iterator là một đối tượng cài đặt giao thức iterator. Chúng ta sẽ thảo luận về giao thức này trong phần sau

Iterator và Iterable

Iterable là một đối tượng, mà một đối tượng có thể lặp lại. Nó tạo ra một Iterator khi được chuyển đến phương thức iter[]. Danh sách, bộ dữ liệu, từ điển, chuỗi và bộ đều là các đối tượng có thể lặp lại. Chúng là các vùng chứa có thể lặp lại mà bạn có thể chuyển đổi thành một trình vòng lặp

Lưu ý rằng mọi iterator cũng là iterable, nhưng không phải iterable nào cũng là iterator. Ví dụ, một tuple có thể lặp lại, nhưng nó không phải là một iterator. Một iterator có thể được tạo từ một iterable bằng cách sử dụng hàm iter[]. Vì vậy, khi chúng ta chuyển bộ dữ liệu này cho hàm iter[], chúng ta sẽ nhận được một trình vòng lặp. Trên thực tế, điều này có thể xảy ra vì lớp của một đối tượng có một phương thức __iter__, phương thức này trả về một trình vòng lặp.  

Những phương thức nào được định nghĩa trong một lớp iterator trong python?

Như đã đề cập ở trên, một đối tượng thực hiện giao thức iterator là một iterator. Nhưng giao thức iterator này là gì?

__iter__[]

Phương thức này trả về chính đối tượng iterator như đã đề cập ở trên. Điều này là bắt buộc để cho phép sử dụng cả bộ chứa và bộ lặp với câu lệnh for và in. Phương thức này tương ứng với vị trí tp_iter của cấu trúc kiểu cho các đối tượng Python trong API Python/C

__tiếp theo__[]

Phương thức này trả về mục tiếp theo từ vùng chứa. Nếu 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 API Python/C

Dưới đây là một ví dụ đơn giản, mô tả các phương pháp này

# define a iterable such as a list
>>> list1 = [0, 1, 2]
# get an iterator using iter[]
>>> iter1 = list1.__iter__[]
#iertae the item using __next__method
>>> print[iter1.__next__[]]
0

Chúng ta có thể sử dụng lại phương thức __next__ để lấy item tiếp theo, trên thực tế, chúng ta có thể sử dụng nó bao nhiêu lần tùy ý và mỗi lần nó sẽ trả về item tiếp theo của iterator. Nhưng khi không có phần tử nào trong trình lặp để trả về, nó sẽ báo lỗi

Lặp lại thông qua một Iterator

Bây giờ chúng ta có một đối tượng iterator, các cách khác nhau để chúng ta có thể duyệt qua các phần tử của nó sao cho chúng ta chỉ nhận được một mục tại một thời điểm?

Sử dụng hàm next[]

Chúng ta có thể trực tiếp sử dụng hàm next[] hoặc phương thức __next__[] để duyệt qua các phần tử như trong ví dụ bên dưới

# define a iterable such as a list
>>> list1 = [1, 2, 0]
# get an iterator using iter[]
>>> iter1 = iter[list1]
# iterate through it using next[]
>>> print[next[iter1]]
1
# next[obj] is same as obj.__next__[]
>>> print[iter1.__next__[]]
2
>>> print[next[iter1]]
0
# This will raise error, no items left
>>> next[my_iter]
Traceback [most recent call last]:
  File "", line 1, in 
    next[my_iter]

Bây giờ chúng ta hãy xem làm thế nào chúng ta có thể duyệt qua một chuỗi lặp

# define a iterable such as a string
>>> string = "hi"
# get an iterator using iter[]
>>> iter1 = iter[string]
# iterate through it using next[]
>>> print[next[iter1]]
h
>>> print[next[iter1]]
i
# This will raise error, no items left
>>> next[my_iter]
Traceback [most recent call last]:
  File "", line 1, in 
    next[my_iter]

Lặp lại một iterator sử dụng vòng lặp while và vòng lặp for

Vì chúng ta đang sử dụng hàm next[] nhiều lần, tại sao không sử dụng vòng lặp while và làm cho công việc của chúng ta dễ dàng hơn một chút. Ngoài ra, chúng tôi sẽ sử dụng xử lý ngoại lệ để xử lý lỗi mà chúng tôi gặp phải khi trình vòng lặp không còn phần tử nào. Vì vậy, bất cứ khi nào lỗi “StopIteration” xảy ra, điều khiển sẽ chuyển đến khối except và câu lệnh break được thực thi. Đây là một ví dụ

# define an iterable such as a list
list1=[1,2,3,4,5,6,7,8,9,0]

# get an iterator using iter[]
iter1=iter[list1]
# infinite loop
while True:
    try:
        # get the next item
        print[next[iter1]]
        # do something with element
    except StopIteration:
        # if StopIteration is raised, break from loop
        break

đầu ra

1
2
3
4
5
6
7
8
9
0

Có một cách dễ dàng hơn nhiều để làm điều này bằng cách sử dụng vòng lặp For. Vòng lặp for thực hiện tất cả những điều này bên trong, do đó, bạn không cần gọi rõ ràng các hàm iter[] và next[]. Đây là vài ví dụ

list1=[1,2,3,4,5,6,7,8,9,0]
for i in list1:
    print[i]

đầu ra

1
2
3
4
5
6
7
8
9
0

Bây giờ chúng ta hãy lấy thêm một số ví dụ

list2=[1,2,"hello",[9,8,7],[11,12],{'one': 'husaain'}]
for i in list2:
    print[i]

đầu ra

1
2
xin chào
[9, 8, 7]
[11, 12]
{'một'. 'hussain'}

string="Hello World "
for i in string:
    print[i]

đầu ra

H
e
l
l
o

W
o
r
l
d

Tạo một Iterator

Cho đến bây giờ chúng ta mới chỉ sử dụng các iterables sẵn có như danh sách hoặc chuỗi, nhưng chúng ta cũng có thể dễ dàng xây dựng một iterator từ đầu trong Python. Chúng ta chỉ cần triển khai các phương thức __iter__[] và __next__[]

Đây là Iterator tùy chỉnh của riêng chúng tôi trả về một số chẵn hoặc 1 mỗi khi chúng tôi lặp lại nó

class Evenit:
 
    def __init__[self, max=0]:
        self.max = max

    def __iter__[self]:
        self.n = 0
        return self

    def __next__[self]:
        if self.n 

Chủ Đề