Sau đây là những cách khác nhau để sử dụng iterator.
Cách kiểu C: Cách này đòi hỏi kiến thức trước về tổng số lần lặp.
# A C-style way of accessing list elements
cars = ["Aston", "Audi", "McLaren"]
i = 0
while (i < len(cars)):
print cars[i]
i += 1
Kết quả:
Aston
Audi
McLaren
Điểm quan trọng:
- Kiểu lặp này hiếm khi được sử dụng bởi các lập trình viên python.
- Cách 4 bước này không tạo ra sự gọn nhẹ với cấu trúc vòng lặp.
- Cách này cũng dễ bị lỗi trong các chương trình hoặc thiết kế quy mô lớn.
- Không có vòng lặp for kiểu C trong Python, nghĩa là một vòng lặp như for (int i = 0; i <n; i ++)
Nội dung chính
1. Sử dụng kiểu for-in (hoặc for each):
Kiểu này được sử dụng trong python chứa iterator của list, từ điển, array n chiều, v.v … Trình lặp iterator sẽ nạp từng thành phần và in dữ liệu trong khi lặp. Trình lặp sẽ tự động căn chỉnh tăng/giảm trong cấu trúc này.
# Accessing items using for-in loop
cars = ["Aston", "Audi", "McLaren"]
for x in cars:
print x
Kết quả:
Aston
Audi
McLaren
Xem bài viết này để biết thêm ví dụ về các loại dữ liệu khác nhau.
2. Lập chỉ mục bằng hàm Range:
Chúng ta cũng có thể sử dụng lập chỉ mục bằng cách sử dụng hàm range() trong Python.
# -----------------------------------------------------------
#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
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------
# Accessing items using indexes and for-in
cars = ["Aston", "Audi", "McLaren"]
for i in range(len(cars)):
print cars[i]
Kết quả:
Aston
Audi
McLaren
3. Enumerate:
Enumerate là hàm tích hợp trong python lấy đầu vào là iterator, list, v.v và trả về một tuple chứa chỉ mục và dữ liệu tại chỉ mục đó trong chuỗi iterator. Ví dụ: enumerate(car) sẽ trả về một iterator và iterator đó sẽ trả về (0,car[0]), (1, car[1]), (2, car[2]), v.v.
# Accessing items using enumerate()
cars = ["Aston" , "Audi", "McLaren "]
for i, x in enumerate(cars):
print (x)
Kết quả:
Aston
Audi
McLaren
Giải pháp dưới đây cũng có thể hoạt động.
# Accessing items and indexes enumerate()
cars = ["Aston" , "Audi", "McLaren "]
for x in enumerate(cars):
print (x[0], x[1])
Kết quả:
(0, 'Aston')
(1, 'Audi')
(2, 'McLaren ')
Chúng ta cũng có thể in trực tiếp giá trị trả về của enumerate() để xem nó trả về cái gì.
# Printing return value of enumerate()
cars = ["Aston" , "Audi", "McLaren "]
print enumerate(cars)
Kết quả:
[(0, 'Aston'), (1, 'Audi'), (2, 'McLaren ')]
Enumerate nhận tham số khởi tạo được mặc định là 0. Chúng ta có thể thay đổi tham số này thành bất kỳ giá trị nào chúng ta muốn. Trong đoạn code dưới đây, chúng ta đã sử dụng tham số khởi tạo là 1.
# demonstrating the use of start in enumerate
cars = ["Aston" , "Audi", "McLaren "]
for x in enumerate(cars, start=1):
print (x[0], x[1])
Kết quả:
(1, 'Aston')
(2, 'Audi')
(3, 'McLaren ')
Enumerate() giúp nhúng các giải pháp nhằm truy cập từng mục dữ liệu trong iterator và tạo chỉ mục cho từng mục dữ liệu.
4. Các phần mở rộng của vòng lặp:
i) Hai iterator với một cấu trúc vòng lặp đơn: Trong trường hợp này, một list và một từ điển sẽ được sử dụng cho mỗi lần lặp trong một khối lặp đơn bằng cách sử dụng hàm enumerate. Hãy xem ví dụ sau:
# Two separate lists
cars = ["Aston", "Audi", "McLaren"]
accessories = ["GPS kit", "Car repair-tool kit"]
# Single dictionary holds prices of cars and
# its accessories.
# First three items store prices of cars and
# next two items store prices of accessories.
prices = {1:"570000$", 2:"68000$", 3:"450000$",
4:"8900$", 5:"4500$"}
# Printing prices of cars
for index, c in enumerate(cars, start=1):
print "Car: %s Price: %s"%(c, prices[index])
# Printing prices of accessories
for index, a in enumerate(accessories,start=1):
print ("Accessory: %s Price: %s"\
%(a,prices[index+len(cars)]))
Kết quả:
Car: Aston Price: 570000$
Car: Audi Price: 68000$
Car: McLaren Price: 450000$
Accessory: GPS kit Price: 8900$
Accessory: Car repair-tool kit Price: 4500$
ii) Hàm zip (Cả hai iterator được sử dụng trong cấu trúc vòng lặp đơn):
Hàm này rất hữu ích để kết hợp các trình lặp cùng kiểu( như list-list hoặc dict-dict, v.v.), các mục dữ liệu ở phần i. Nó sử dụng độ ngắn nhất của các iterator đầu vào này. Các mục khác của các iterator dài lớn hơn sẽ được bỏ qua. Trong trường hợp các iterator trống, nó trả về kết quả No output.
Ví dụ, việc sử dụng zip cho hai list (iterators) đã giúp kết hợp mỗi chiếc xe với phụ kiện cần thiết của nó.
# Python program to demonstrate the working of zip
# Two separate lists
cars = ["Aston", "Audi", "McLaren"]
accessories = ["GPS", "Car Repair Kit",
"Dolby sound kit"]
# Combining lists and printing
for c, a in zip(cars, accessories):
print "Car: %s, Accessory required: %s"\
%(c, a)
Kết quả:
Car: Aston, Accessory required: GPS
Car: Audi, Accessory required: Car Repair Kit
Car: McLaren, Accessory required: Dolby sound kit
Việc đảo ngược các các iterator này từ hàm zip được gọi là giải nén bằng cách sử dụng toán tử “*”.
Sử dụng hàm enumerate và hàm zip giúp đạt được sự mở rộng hiệu quả của logic lặp trong python và giải quyết nhiều vấn đề phụ khác của một tác vụ hoặc vấn đề lớn.
# -----------------------------------------------------------
#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
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------
# Python program to demonstrate unzip (reverse
# of zip)using * with zip function
# Unzip lists
l1,l2 = zip(*[('Aston', 'GPS'),
('Audi', 'Car Repair'),
('McLaren', 'Dolby sound kit')
])
# Printing unzipped lists
print(l1)
print(l2)
Kết quả:
('Aston', 'Audi', 'McLaren')
('GPS', 'Car Repair', 'Dolby sound kit')
Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
- Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
- Ebook về python tại đây.
- Các series tự học lập trình khác
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!