* Giải thích iterator là gì? Iterator là một đối tượng cho phép lập trình viên lặp/duyệt qua tất cả các phần tử của một collection (một kiểu dữ liệu dạng danh sách), mà không quan trọng nó được cài đặt (implement) cụ thể như thế nào. Trong Python, iterator là bất cứ đối tượng nào mà tuân theo một protocol có tên là iterator. Cái protocol có tên là iterator này bao gồm hai phương thức. Phương thức __iter__() trả về đối tượng iterator, và phương thức next() trả về phần tử tiếp theo của một dãy/danh sách.

range(): Hàm range() trong Python tạo ra một danh sách các số, thường được sử dụng trong nhiều tình huống cần thực hiện lặp, ví dụ như trong vòng lặp for hoặc trong nhiều trường hợp khác. Trong Python, các đối tượng range không phải là các iterator. range là một class chứa một danh sách các immutable objects – các đối tượng không thể thay đổi được. Cái hành vi lặp của range thì tương tự với hành vi lặp của list, và khi làm việc với range, chúng ta không thể gọi trực tiếp tới hàm nexr(). Chúng ta chỉ có thể gọi được hàm next nếu chúng ta đã có được một iterator nhờ việc sử dụng hàm iter().

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#

# Python program to understand range 
# this creates a list of 0 to 5 
# integers 
  
demo = range(6) 
  
# print the demo 
print(demo) 
  
# it will generate error 
print(next(demo)) 

Kết quả in ra là:

range(0, 6)

Runtime Errors gặp phải khi cố tình gọi hàm next() mà không gọi hàm iter() trước đó:

Traceback (most recent call last):
  File "/home/6881218331a293819d2a4c16029084f9.py", line 13, in 
    print(next(demo))
TypeError: list object is not an iterator

Lưu ý: Lỗi Runtime Error ở trên đã cho chúng ta thấy được rõ ràng hàm range() trong Python không phải là một iterator.

Bởi vì range là một iterable nên ta có thể lấy được một iterator nhờ sự trợ giúp của chúng, nhưng chúng ta không thể gọi trực tiếp hàm next(). Ví dụ bên dưới đây sẽ giải thích rõ ràng điều này:


# Python program to understand range 
  
# creates an iterator 
demo = iter(range(6)) 
  
# print iterator 
print(demo) 
  
# use next 
print(next(demo)) 

Kết quả in ra là:

<listiterator object at 0x7f3f32a46450 >
0

Hàm range() không sinh ra tất cả các số mà nó chứa khi chúng ta tạo ra nó. Nó chỉ cung cấp các số mà chúng ta đã có được nhờ sử dụng vòng lặp, hàm range() có các thuộc tính sau:

– Các đối tượng range đều là immutable – không thể thay đổi được, điều này có nghĩa là chúng không thể được thay đổi hay sửa đổi lại, do đó chúng có thể được sử dụng làm index (chỉ số xác định vị trí của phần tử) cho kiểu dữ liệu dictionary.

– Chúng có các đối số start, stop và step.

– Cùng một hàm range có thể được truy cập tới nhiều lần.

Ví dụ:

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#

# Python program to understand range 
  
# creates a demo range 
demo = range(1, 31, 2) 
  
# print the range 
print(demo) 
  
# print the start of range 
print(demo.start) 
  
# print step of range 
print(demo.step) 
  
# print the index of element 23 
print(demo.index(23)) 
  
# since 30 is not present it will give error 
print(demo.index(30)) 

Kết quả in ra là:

range(1, 31, 2)
1
2
11

Lỗi Runtime Error: Bởi vì phần tử 30 không xuất hiện, nên nó sẽ gây ra lỗi.

Traceback (most recent call last):
  File "/home/cddaae6552d1d9288d7c5ab503c54642.py", line 19, in 
    print(demo.index(30))
ValueError: 30 is not in range

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!