Cách tạo Trình lặp lại Python:Hướng dẫn
Các trình lặp hoàn toàn có ở khắp mọi nơi trong Python; thật khó để học ngay cả những điều cơ bản mà không nghe thấy từ “trình lặp” hoặc “có thể lặp lại”.
Trình lặp là một đối tượng có thể được lặp lại. Mặc dù có một số đối tượng tích hợp sẵn mà bạn có thể lặp lại, bạn cũng có thể xác định đối tượng của riêng mình.
Trong hướng dẫn này, chúng ta sẽ nói về các trình vòng lặp Python, cách chúng hoạt động và cách bạn có thể sử dụng chúng trong mã của mình. Chúng tôi sẽ xây dựng trình lặp của riêng mình để bạn có thể tìm hiểu về các tính năng cốt lõi của chúng trong thực tế. Mã trong hướng dẫn này tương thích với các cài đặt Python 3.x.
Hãy bắt đầu!
Iterator là gì?
Trình lặp là các đối tượng mà bạn có thể lặp lại. Một trình lặp sẽ trả về dữ liệu từ đối tượng đó, từng mục một.
Bạn có thể kiểm tra xem một đối tượng có thể lặp lại được hay không bằng cách thử chạy đối tượng đó thông qua vòng lặp for; nếu bạn có thể lặp qua đối tượng, điều đó có nghĩa là nó có thể lặp lại. Chuỗi, danh sách, bộ giá trị và từ điển là những ví dụ về kiểu dữ liệu tích hợp là các đối tượng có thể lặp lại.
Một đối tượng trình vòng lặp trong Python phải có hai phương thức:
-
__iter__()
:Điều này cho phép bạn truy xuất một trình lặp. -
__next__()
:Điều này cho phép bạn nhận giá trị tiếp theo trong trình vòng lặp.
__
dấu gạch dưới được sử dụng trong trình vòng lặp vì chúng biểu thị các chức năng đặc biệt. Để xác định một trình lặp, bạn phải sử dụng hai hàm đặc biệt này. Cùng với nhau, chúng được gọi là giao thức trình lặp. Những phương pháp này thường được phát âm là “phương pháp iter và tiếp theo”.
81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia chương trình đào tạo. Kết hợp với bootcamp ngay hôm nay.
Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.
Cách tạo trình lặp vô hạn
Chúng ta sẽ bắt đầu với những điều cơ bản:xây dựng một trình lặp vô hạn. Đây là loại trình lặp đơn giản nhất. Nó đơn giản đến mức nó sẽ tiếp tục kéo dài mãi mãi. Chúng tôi sẽ sửa lỗi này sau trong hướng dẫn.
Hãy bắt đầu bằng cách xác định một lớp có tên là Cakes, lớp này sẽ là lớp trình lặp của chúng ta:
class Cakes: def __init__(self, value): self.value = value
Chúng tôi đã khai báo một __init__
phương thức này sẽ được thực thi ngay sau khi một đối tượng của lớp chúng ta được khởi tạo. __init__
phương thức được gọi là một phương thức khởi tạo. Trong ví dụ này, __init__
của chúng tôi phương thức có thể nhận một giá trị:giá trị.
Tiếp theo, chúng tôi sẽ tạo giao thức trình lặp của chúng tôi:
def __iter__(self): return self def __next__(self): return self.value
__iter__
phương thức được sử dụng để truy xuất đối tượng trình vòng lặp của chúng tôi. __next__
phương thức cho phép chúng tôi truy xuất giá trị tiếp theo trong đối tượng có thể lặp lại mà chúng tôi chỉ định.
Hãy đảm bảo mã của chúng tôi hoạt động cho đến nay. Chúng tôi sẽ làm điều đó bằng cách xác định một đối tượng của lớp chúng tôi như sau:
cake = Cakes(["Vanilla Sponge"])
Càng xa càng tốt! Có thể bạn đang tự nghĩ:tại sao mã này không làm được gì? Đó là bởi vì lớp của chúng ta chỉ trả về một hàm trình lặp.
Chúng tôi phải lặp lại trình lặp của mình để kiểm tra xem nó có hoạt động hay không. Chúng tôi có thể làm như vậy bằng cách sử dụng vòng lặp for-in:
for c in cake: print(c)
Mã của chúng tôi trả về:
Vanilla Sponge Vanilla Sponge …
Lời nguyền của Vanilla Sponge! Nó tiếp tục được in ra bảng điều khiển. Chuyện gì đang xảy ra vậy? Chúng tôi vừa tạo trình lặp đầu tiên của mình. Nó rất đơn giản, nhưng nó hoạt động.
Kiểm tra trình lặp bằng cách sử dụng vòng lặp bổ sung trong Python
Trước khi chúng tôi làm cho trình lặp của mình trở nên hữu ích, hãy dành một chút thời gian để sửa đổi khái niệm về vòng lặp for-in. Trong ví dụ cuối cùng của chúng tôi, chúng tôi đã viết một vòng lặp for-in để kiểm tra mã của chúng tôi:
for c in cake: print(c)
Cách thức hoạt động của vòng lặp for-in là trước tiên nó tạo một trình vòng lặp của một đối tượng bằng cách sử dụng __iter__()
phương pháp. Một vòng lặp bổ sung sau đó gọi __next__()
cho đến khi không có giá trị nào được trả lại.
Bạn có thể nghĩ về một for-in
lặp như một while
đơn giản vòng. Mặc dù có những giá trị mà trình vòng lặp có thể trả về, vòng lặp for-in sẽ trả về những giá trị đó.
Tạo một Trình lặp hữu ích
Trình lặp cuối cùng của chúng tôi không hữu ích lắm. Nó chỉ in ra cùng một giá trị lặp đi lặp lại. Như đã nói, nó vẫn là một trình lặp:nó có khả năng đọc tất cả các đối tượng trong một trình lặp.
Chúng tôi sẽ tạo một trình lặp lặp lại trên một mảng Python. Mảng này chứa một danh sách các loại bánh.
Để ngăn trình lặp của chúng tôi lặp lại vô hạn, chúng tôi sẽ theo dõi có bao nhiêu giá trị bên trong có thể lặp lại của chúng tôi và số lần trình lặp của chúng tôi đã thực thi. Điều này sẽ cho phép chúng tôi ngăn trình lặp của chúng tôi thực thi sau khi nó được lặp qua tất cả các mục trong một trình có thể lặp lại.
Mở một tệp Python mới và dán vào mã sau:
class Cakes: def __init__(self, value): self.value = value self.max = len(value) self.count = 0 def __iter__(self): return self def __next__(self): if self.count < self.max: to_return = self.value[self.count] self.count += 1 return to_return else: raise StopIteration
Trình lặp này phức tạp hơn một chút so với trình lặp cuối cùng của chúng tôi. Đó là lý do tại sao chúng tôi đã xây dựng một trình lặp vô hạn trước. Trong trình lặp này, chúng tôi đã khởi tạo ba giá trị:
- giá trị:Mục mà chúng tôi muốn lặp lại.
- tối đa:Số lượng mục có thể lặp lại của chúng tôi.
- count:Số lần trình lặp của chúng tôi đã thực thi.
Trong __next__()
của chúng tôi , chúng tôi đã thêm câu lệnh "if". Câu lệnh này kiểm tra xem liệu số lần trình lặp của chúng tôi đã chạy (đếm) có nhỏ hơn số mục mà trình lặp của chúng tôi sẽ lặp lại hay không (tối đa).
Nếu “count” nhỏ hơn “max”, trình lặp của chúng tôi sẽ tìm giá trị tiếp theo trong đối tượng có thể lặp lại. Sau đó, nó sẽ thêm 1 vào biến “count” để chúng ta có thể theo dõi số lượng đối tượng còn lại để lặp lại. Sau đó, chúng tôi trả về giá trị mà chúng tôi đã tính toán.
Điều quan trọng cần lưu ý là chúng tôi chỉ định một giá trị cho biến “to_return” trước khi chúng tôi tăng biến “count”. Điều này đảm bảo rằng chúng tôi có thể truy cập giá trị trên lần lặp hiện tại của trình lặp của chúng tôi.
Nếu chúng tôi đã lặp lại mọi mục trong danh sách của mình, một ngoại lệ sẽ được nêu ra có tên là StopIteration. Điều này sẽ tạm dừng chương trình của chúng tôi sau khi chúng tôi đã lặp lại mọi mục trong danh sách.
Hãy xem liệu trình lặp của chúng tôi có hoạt động không. Thêm mã sau vào chương trình chính của bạn và thực thi nó:
cake = Cakes(["Vanilla Sponge"]) for c in cake: print(c)
Mã của chúng tôi trả về:
Vanilla Sponge
Hãy thêm một vài mục nữa vào danh sách của chúng tôi và xem điều gì sẽ xảy ra:
cake = Cakes(["Vanilla Sponge", "Carrot", "Coffee"]) for c in cake: print(c)
Mã của chúng tôi trả về:
Vanilla Sponge Carrot Coffee
Chúng tôi đã làm nó! Chúng tôi đã tạo thành công một trình lặp lặp qua danh sách các loại bánh của chúng tôi. Bạn xứng đáng được thưởng một chiếc bánh - hoặc thậm chí chỉ là một chiếc bánh cupcake - vì đã đạt được điều này.
Kết luận
Các trình lặp lại cho phép bạn tạo các đối tượng có thể được lặp lại. Một trình lặp có thể lặp qua một danh sách, một chuỗi hoặc một đối tượng có thể lặp khác và thực hiện một hành động cụ thể.
Bạn có sẵn sàng cho một thử thách? Tạo một trình lặp lặp qua danh sách các số và trả về từng số nhân với hai.
Mã cho trình lặp này sẽ tương tự như ví dụ trên của chúng tôi - nó sẽ vẫn sử dụng giao thức trình lặp - nhưng nó sẽ nhân mỗi số trong danh sách với hai trước khi nó được trả về chương trình chính.
Bây giờ, bạn đã sẵn sàng để bắt đầu viết các trình vòng lặp của riêng mình bằng Python như một chuyên gia!