Khi sinh viên lần đầu tiên bắt đầu sử dụng vòng lặp for, đôi khi họ gặp khó khăn trong việc hiểu sự khác biệt giữa biến lặp (biến vòng lặp) và biến lặp
Iterable là đối tượng mà bạn sẽ phân tích cú pháp trong vòng lặp for. Nói chung, đối tượng này không thay đổi trong khi vòng lặp for đang được thực thi
Biến iterator (vòng lặp) là biến lưu trữ một phần của iterable khi vòng lặp for đang được thực thi. Mỗi lần vòng lặp lặp lại, giá trị của biến iterator sẽ thay đổi thành một phần khác của iterable
Danh sách tương đương với mảng trong các ngôn ngữ khác, với lợi ích bổ sung là có kích thước động. Trong Python, list là một loại thùng chứa trong Data Structures, được dùng để chứa nhiều dữ liệu cùng một lúc. Không giống như Bộ, danh sách trong Python được sắp xếp theo thứ tự và có số lượng xác định
Có nhiều cách để lặp qua một danh sách trong Python. Hãy xem tất cả các cách khác nhau để lặp qua một danh sách trong Python và so sánh hiệu suất giữa chúng
Phương pháp số 1. Sử dụng vòng lặp For
Python3
# Python3 code to iterate over a list
list = 1 3 5 7 90_______0_______11 3 5 7 921 3 5 7 931 3 5 7 921 3 5 7 951 3 5 7 921 3 5 7 971 3 5 7 921 3 5 7 991 3 5 7 90
1 3 5 7 91
1 3 5 7 92
1 3 5 7 93 1 3 5 7 941 3 5 7 95 list1 3 5 7 97
1 3 5 7 98_______0_______91 3 5 7 90
đầu ra.
1 3 5 7 9Phương pháp #2. Đối với vòng lặp và phạm vi()
Trong trường hợp chúng ta muốn sử dụng vòng lặp for truyền thống lặp từ số x đến số y.
Python3
# Python3 code to iterate over a list
list = 1 3 5 7 90_______0_______11 3 5 7 921 3 5 7 931 3 5 7 921 3 5 7 951 3 5 7 921 3 5 7 971 3 5 7 921 3 5 7 991 3 5 7 90
1 3 5 7 91
0 , 1 1 , 3 2 , 5 3 , 7 4 , 96
0 , 1 1 , 3 2 , 5 3 , 7 4 , 97_______191_______ 0 , 1 1 , 3 2 , 5 3 , 7 4 , 990 1 2 3 4 5 6 7 80_______190_______0 1 2 3 4 5 6 7 82
1 3 5 7 91
0 1 2 3 4 5 6 7 84
0 1 2 3 4 5 6 7 85
1 3 5 7 93 1 3 5 7 94_______0_______5 0 1 2 3 4 5 6 7 891 3 5 7 90
1 3 5 7 98_______0_______90 1 2 3 4 5 6 7 80list1 3 5 7 95
đầu ra.
1 3 5 7 9Việc lặp lại bằng cách sử dụng chỉ mục không được khuyến nghị nếu chúng ta có thể lặp lại các phần tử (như đã thực hiện trong Phương pháp #1).
Phương pháp #3. Sử dụng vòng lặp while
Python3
# Python3 code to iterate over a list
list = 1 3 5 7 90_______0_______11 3 5 7 921 3 5 7 931 3 5 7 921 3 5 7 951 3 5 7 921 3 5 7 971 3 5 7 921 3 5 7 991 3 5 7 90
1 3 5 7 91
list1
0 , 1 1 , 3 2 , 5 3 , 7 4 , 97_______191_______ 0 , 1 1 , 3 2 , 5 3 , 7 4 , 990 1 2 3 4 5 6 7 80_______190_______0 1 2 3 4 5 6 7 82
1 3 5 7 94_______191_______ =0
1 3 5 7 91
=2
=3 =4
1 3 5 7 98_______0_______90 1 2 3 4 5 6 7 80list1 3 5 7 95
1 3 5 7 98_______0_______41 3 5 7 902= 1 3 5 7 91
đầu ra.
1 3 5 7 9Phương pháp #4. Sử dụng hiểu danh sách (Có thể là cách cụ thể nhất).
Python3
# Python3 code to iterate over a list
list = 1 3 5 7 90_______0_______11 3 5 7 921 3 5 7 931 3 5 7 921 3 5 7 951 3 5 7 921 3 5 7 971 3 5 7 921 3 5 7 991 3 5 7 90
1 3 5 7 91
1 3 5 7 920
1 3 5 7 901 3 5 7 991 3 5 7 90_______0_______3 1 3 5 7 941 3 5 7 95 list1 3 5 7 90
đầu ra.
1 3 5 7 9Phương pháp #5. Sử dụng liệt kê()
Nếu chúng ta muốn chuyển đổi danh sách thành một danh sách các bộ dữ liệu có thể lặp lại (hoặc lấy chỉ mục dựa trên kiểm tra điều kiện, ví dụ: trong tìm kiếm tuyến tính, bạn có thể cần lưu chỉ mục của phần tử tối thiểu), bạn có thể sử dụng hàm enumerate().
Python3
# Python3 code to iterate over a list
list = 1 3 5 7 90_______0_______11 3 5 7 921 3 5 7 931 3 5 7 921 3 5 7 951 3 5 7 921 3 5 7 971 3 5 7 921 3 5 7 991 3 5 7 90
1 3 5 7 91
1 3 5 7 944
1 3 5 7 93 1 3 5 7 946_______0_______5 1 3 5 7 9480 1 2 3 4 5 6 7 80list1 3 5 7 951
1 3 5 7 98_______0_______9 1 3 5 7 954_______0_______551 3 5 7 956
đầu ra.
0 , 1 1 , 3 2 , 5 3 , 7 4 , 9Ghi chú. Ngay cả phương thức #2 cũng có thể được sử dụng để tìm chỉ mục, nhưng phương thức #1 thì không thể (Trừ khi một biến phụ được tăng lên sau mỗi lần lặp) và phương thức #5 đưa ra một biểu diễn ngắn gọn về việc lập chỉ mục này.
Phương pháp #6. sử dụng numpy
Đối với các danh sách n chiều rất lớn (ví dụ: mảng hình ảnh), đôi khi tốt hơn là sử dụng thư viện bên ngoài, chẳng hạn như numpy.
Python3
1 3 5 7 957
1 3 5 7 958
1 3 5 7 959 1 3 5 7 960
1 3 5 7 91
1 3 5 7 962
1 3 5 7 963
1 3 5 7 964= 1 3 5 7 9661 3 5 7 990 1 2 3 4 5 6 7 82
1 3 5 7 91
1 3 5 7 970
1 3 5 7 971
1 3 5 7 964= 1 3 5 7 9741 3 5 7 931 3 5 7 921 3 5 7 930 1 2 3 4 5 6 7 82
1 3 5 7 91
1 3 5 7 980
1 3 5 7 93 1 3 5 7 9821 3 5 7 95 1 3 5 7 984
1 3 5 7 98_______0_______91 3 5 7 987
đầu ra.
0 1 2 3 4 5 6 7 8Chúng ta có thể sử dụng np. ndenumerate() để bắt chước hành vi liệt kê. Sức mạnh bổ sung của NumPy đến từ thực tế là chúng ta thậm chí có thể kiểm soát cách truy cập các phần tử (thứ tự Fortran thay vì thứ tự C, giả sử. )) nhưng có một lưu ý là np. nditer coi mảng là chỉ đọc theo mặc định, vì vậy người ta phải chuyển các cờ phụ như op_flags=[‘readwrite’] để nó có thể sửa đổi các phần tử
Phương pháp số 7. Sử dụng hàm iter và hàm next
Đây là một cách tiếp cận bổ sung sử dụng hàm iter và hàm next
Python3
# Python3 code to iterate over a list
list = 1 3 5 7 90_______0_______11 3 5 7 921 3 5 7 931 3 5 7 921 3 5 7 951 3 5 7 921 3 5 7 971 3 5 7 921 3 5 7 991 3 5 7 90
1 3 5 7 902
1 3 5 7 903_______191_______ 1 3 5 7 9050 1 2 3 4 5 6 7 80_______190_______0 1 2 3 4 5 6 7 82
1 3 5 7 909
1 3 5 7 910_______0_______7
1 3 5 7 98_______191_______3 1 3 5 7 9141 3 5 7 97
1 3 5 7 916_______0_______17= 1 3 5 7 9191 3 5 7 920
1 3 5 7 916_______0_______91 3 5 7 923
1 3 5 7 924 1 3 5 7 925
1 3 5 7 98_______0_______27
1 3 5 7 928
Đầu ra1 3 5 7 9
Cách tiếp cận này tạo một đối tượng trình lặp bằng cách sử dụng hàm iter và sau đó sử dụng hàm tiếp theo để truy xuất từng phần tử của trình lặp. Khối try-ngoại trừ được sử dụng để bắt ngoại lệ StopIteration được đưa ra bởi hàm tiếp theo khi trình vòng lặp cạn kiệt
Cách tiếp cận này có độ phức tạp về thời gian là O(n), trong đó n là độ dài của danh sách, bởi vì nó lặp qua các phần tử của danh sách một lần và thực hiện một số thao tác không đổi trên mỗi phần tử. Độ phức tạp của không gian là O(1), vì nó không tạo thêm bất kỳ cấu trúc dữ liệu nào để lưu trữ kết quả trung gian hoặc kết quả cuối cùng