Trong Python, một đối tượng có thể lặp lại là bất kỳ đối tượng nào có khả năng trả về từng thành viên của nó, cho phép nó được lặp lại trong một vòng lặp. Ví dụ: chuỗi và danh sách có thể lặp lại
Bài đăng ngắn này chỉ cho bạn hai cách khác nhau để kiểm tra xem một đối tượng đã cho có thể lặp lại được trong Python 3 hay không. quảng cáo
Sử dụng Duck Test (xem Duck Typing – Wikipedia)
Thí dụ
# Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))đầu ra
True False TrueSử dụng chức năng thể hiện (không được khuyến nghị)
Thí dụ
from collections.abc import Iterable a = 'KindaCode.com' print(isinstance(a, Iterable)) b = [1, 2, 3] print(isinstance(b, Iterable))đầu ra. quảng cáo
True Trueđọc thêm
Bạn cũng có thể xem trang danh mục Máy học hoặc trang danh mục Python của chúng tôi để biết thêm hướng dẫn và ví dụ
Trình vòng lặp ở khắp mọi nơi trong Python. Chúng được triển khai một cách tao nhã trong các vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1, khả năng hiểu, trình tạo, v.v. nhưng được ẩn trong tầm nhìn rõ ràng
Iterator trong Python đơn giản là một đối tượng có thể được lặp đi lặp lại. Một đối tượng sẽ trả về dữ liệu, mỗi lần một phần tử
Về mặt kỹ thuật, một đối tượng trình lặp Python phải triển khai hai phương thức đặc biệt, 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration2 và 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration3, được gọi chung là giao thức trình lặp
Một đối tượng được gọi là iterable nếu chúng ta có thể lấy một iterator từ nó. Hầu hết các vùng chứa tích hợp sẵn trong Python như. danh sách, bộ dữ liệu, chuỗi, v.v. là iterables
Hàm 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration4 (lần lượt gọi phương thức 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration2) trả về một trình vòng lặp từ chúng
Lặp lại thông qua một Iterator
Chúng tôi sử dụng hàm 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration6 để lặp lại thủ công qua tất cả các mục của trình vòng lặp. Khi chúng tôi kết thúc và không còn dữ liệu nào được trả về, nó sẽ tăng Ngoại lệ 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration7. Sau đây là một ví dụ
# Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))2đầu ra
4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIterationMột cách tao nhã hơn để tự động lặp lại là sử dụng vòng lặp for. Sử dụng điều này, chúng ta có thể lặp qua bất kỳ đối tượng nào có thể trả về một trình vòng lặp, ví dụ: danh sách, chuỗi, tệp, v.v.
# Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))4Hoạt động của vòng lặp for cho Iterators
Như chúng ta thấy trong ví dụ trên, vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1 có thể lặp tự động qua danh sách
Trên thực tế, vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1 có thể lặp qua bất kỳ lần lặp nào. Chúng ta hãy xem xét kỹ hơn cách vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1 thực sự được triển khai trong Python
# Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))8thực sự được thực hiện như
# Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))9Vì vậy, bên trong, vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1 tạo một đối tượng iterator, # Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))42 bằng cách gọi 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration4 trên iterable
Trớ trêu thay, vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1 này thực sự là một vòng lặp while vô hạn
Bên trong vòng lặp, nó gọi 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration6 để lấy phần tử tiếp theo và thực thi phần thân của vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1 với giá trị này. Sau khi tất cả các vật phẩm cạn kiệt, 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration7 được nâng lên được bắt bên trong và vòng lặp kết thúc. Lưu ý rằng bất kỳ loại ngoại lệ nào khác sẽ đi qua
Xây dựng trình vòng lặp tùy chỉnh
Dễ dàng xây dựng một trình vòng lặp từ đầu bằng Python. Chúng ta chỉ cần triển khai các phương thức 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration2 và 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration3
Phương thức 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration2 trả về chính đối tượng iterator. Nếu được yêu cầu, một số khởi tạo có thể được thực hiện
Phương thức 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration3 phải trả về mục tiếp theo trong chuỗi. Khi kết thúc và trong các cuộc gọi tiếp theo, nó phải tăng 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration7
Ở đây, chúng tôi hiển thị một ví dụ sẽ cung cấp cho chúng tôi sức mạnh tiếp theo của 2 trong mỗi lần lặp lại. Số mũ lũy thừa bắt đầu từ 0 đến số do người dùng đặt
Nếu bạn không biết gì về lập trình hướng đối tượng, hãy truy cập Lập trình hướng đối tượng Python
from collections.abc import Iterable a = 'KindaCode.com' print(isinstance(a, Iterable)) b = [1, 2, 3] print(isinstance(b, Iterable))2đầu ra
from collections.abc import Iterable a = 'KindaCode.com' print(isinstance(a, Iterable)) b = [1, 2, 3] print(isinstance(b, Iterable))3Chúng ta cũng có thể sử dụng vòng lặp 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration1 để lặp qua lớp iterator của mình
from collections.abc import Iterable a = 'KindaCode.com' print(isinstance(a, Iterable)) b = [1, 2, 3] print(isinstance(b, Iterable))5Python Infinite Iterators
Không nhất thiết phải sử dụng hết mục trong đối tượng lặp. Có thể có các trình vòng lặp vô hạn (không bao giờ kết thúc). Chúng ta phải cẩn thận khi xử lý các vòng lặp như vậy
Đây là một ví dụ đơn giản để chứng minh các trình vòng lặp vô hạn
Có thể gọi hàm dựng sẵn 4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration4 bằng hai đối số trong đó đối số đầu tiên phải là đối tượng (hàm) có thể gọi được và đối số thứ hai là trọng điểm. Trình vòng lặp gọi hàm này cho đến khi giá trị trả về bằng với trọng điểm
from collections.abc import Iterable a = 'KindaCode.com' print(isinstance(a, Iterable)) b = [1, 2, 3] print(isinstance(b, Iterable))7Chúng ta có thể thấy rằng hàm # Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))85 luôn trả về 0. Vì vậy, chuyển nó dưới dạng # Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))86 sẽ trả về một trình vòng lặp gọi # Create a function for reusable purpose def is_iterable(object): try: iter(object) return True except TypeError: return False # Use the function a = 'KindaCode.com' print(is_iterable(a)) b = 1234 print(is_iterable(b)) c = { "k1": 10, "k2": 3, "k3": 9 } print(is_iterable(c))85 cho đến khi giá trị trả về bằng 1. Điều này không bao giờ xảy ra và chúng ta có một trình vòng lặp vô hạn
Chúng ta cũng có thể xây dựng các trình vòng lặp vô hạn của riêng mình. Về mặt lý thuyết, iterator sau đây sẽ trả về tất cả các số lẻ
True True1Một lần chạy mẫu sẽ như sau
4 7 0 3 Traceback (most recent call last): File "", line 24, in next(my_iter) StopIteration0Và như thế
Hãy cẩn thận bao gồm một điều kiện kết thúc, khi lặp qua các loại trình vòng lặp vô hạn này
Ưu điểm của việc sử dụng iterators là chúng tiết kiệm tài nguyên. Như đã trình bày ở trên, chúng ta có thể nhận được tất cả các số lẻ mà không cần lưu trữ toàn bộ hệ thống số trong bộ nhớ. Chúng ta có thể có các mục vô hạn (về mặt lý thuyết) trong bộ nhớ hữu hạn
Có một cách dễ dàng hơn để tạo các trình vòng lặp trong Python. Để tìm hiểu thêm, hãy truy cập. Trình tạo Python sử dụng năng suất