Bài 6. Vòng lặp
Tác giả: Đặng Quý Anh
Nội dung kiến thức
- Các loại vòng lặp trong Python
- Dữ liệu lồng nhau (
listcủa cáclist) và vòng lặp lồng nhau - Hàm
enumeratevàziptrong Python
1. Vòng lặp for
Vòng lặp for ở trong Python có tác dụng duyệt qua các biến dữ liệu có trong list, tuple, string, ... Sử dụng cú pháp như sau
for element in data:
# Your code
trong đó, element là các thành phần trong dữ liệu data.
Cụ thể, với kiểu dữ liệu list
gradeList = ['K63', 'K64', 'K65', 'K66']
for gradeName in gradeList:
print(gradeName)
# > Output:
# K63
# K64
# K65
# K66
Ngoài ra, ta cũng có thể truy vào các thành phần của dữ liệu cần lặp thông qua chỉ số của các thành phần đấy với hàm range
gradeList = ['K63', 'K64', 'K65', 'K66']
n = 4 # length of gradeList
for index in range(n):
print(gradeList[index])
# > Output:
# K63
# K64
# K65
# K66
Lưu ý:
range(start, end, step)là một hàm trongPython, đầu vào nhận các số nguyên và trả về một chuỗi các giá trị số nguyên từstarttớiend-1, và cách nhaustepđơn vị. Ở phần code trên, ta sử dụngrange(n)là đang mặc địnhstart=0, step=1.- Chỉ số
indextrongPythonbắt đầu từ0.
2. Vòng lặp while
Cấu trúc của vòng lặp while trong Python sẽ như sau
while condition:
# statement
Ví dụ
gradeList = ['K63', 'K64', 'K65', 'K66']
n = 4 # length of gradeList
index = 0 # started index
while index < n:
print(gradeList[index])
index = index + 1 # update index for stopped condition (or index += 1)
# > Output:
# K63
# K64
# K65
# K66
Một lưu ý khi dùng vòng while là ta cần kiểm soát được điều kiện dừng, để tránh hiện tượng rơi vào vòng lặp vô hạn.
3. Vòng lặp với break và continue
break và continue là hai câu lệnh hỗ trợ trong các vòng lặp để
break: nếu gặp câu lệnh này, quá trình lặp lập tức bị dừngcontinue: nếu gặp câu lệnh này, quá trình lặp sẽ bỏ qua vòng lặp hiện tại, và chuyển tới vòng lặp tiếp theo, để tiếp tục thực hiện lặp
Dưới đây là ví dụ minh họa
gradeList = ['K63', 'K64', 'K65', 'K66']
n = 4 # length of gradeList
for index in range(n):
if index == 1: # don't print K64, go to next loop
continue
if index == 3: # stop program if index is 3
break
print(gradeList[index])
# > Output:
# K63
# K65
Ở trên, khi gặp index == 1 (tức tại phần tử K64), ta dùng lệnh continue nên chương trình sẽ bỏ qua vòng lặp này, chuyển tới vòng lặp tiếp theo (nên không in ra phần tử K64).
Khi gặp index == 3, chương trình hiểu sẽ phải dừng ngay quá trình lặp, nên phần tử K66 cũng không được in ra.
4. Dữ liệu lồng nhau (list của các list)
Kiểu dữ liệu list trong Python ngoài chứa được các thành phần có kiểu dữ liệu nguyên thủy như string, int, float, boolean thì còn có thể chứa được chính các kiểu dữ liệu
nâng cao hơn như list, dict, tuple, ... Ví dụ
mixedList = [['K63', 'K64'], True, 2, (3, 3), ['MAT', 'PHY']]
Ở ví dụ trên, ta có một danh sách hỗn hợp mixedList chứa các thành phần có các kiểu dữ liệu bao gồm: list, boolean, int, tuple.
Chẳng hạn, ta muốn in ra các thành phần có kiểu dữ liệu list
for element in mixedList:
if type(element) is list:
print(element)
# > Output:
# ['K63', 'K64']
# ['MAT', 'PHY']
Lưu ý: type(variable) là một hàm trả về kiểu dữ liệu của biến variable.
5. Vòng lặp lồng nhau
Bên cạnh sử dụng các vòng lặp một cách đơn lẻ, ta có thể kết hợp sử dụng các vòng lặp lồng nhau. Chẳng hạn, ta có list sau
numberList = [1, 2, 3]
Để in ra các cặp chỉnh hợp gồm 2 phần tử của numberList, ta sẽ dùng các vòng lặp lồng nhau
for firstE in numberList:
for secondE in numberList:
if firstE != secondE:
print(firstE, secondE)
# > Output:
# 1 2
# 1 3
# 2 1
# 2 3
# 3 1
# 3 2
6. Thư viện itertools
Thư viện itertools là một công cụ cung cấp các chức năng khác nhau hoạt động trên các trình vòng lặp để tạo ra các trình vòng lặp phức tạp.
Vì thế, ta có thể sử dụng itertools để sinh ra các chỉnh hợp 2 phần tử như ở mục 5. bằng cách
import itertools
numberList = [1, 2, 3]
permutationList = itertools.permutations(numberList, 2)
for element in permutationList:
print(element)
# > Output:
# (1, 2)
# (1, 3)
# (2, 1)
# (2, 3)
# (3, 1)
# (3, 2)
Ngoài hàm tạo ra chỉnh hợp của một tập hơp, itertools còn cung cấp các hàm
combinations(iterable, r): tạo ra tất cả các tổ hợp gồmrphần tử từ đối tượngiterableproduct(iterable1, iterable2, ...): tạo ra tất cả các phần tử của tíchCartesiantừ các đối tượngiterable1, iterable2, ...- …
7. Hàm enumerate và zip trong Python
- Hàm
enumeratetrongPythonthêm vào một bộ đếm trước đối tượng lặp với cú phápenumerate(iterable, start)trong đó,
iterablelà một đối tượng có thể lặp nhưlist,startlà một số nguyên để bắt đầu bộ đếm, và mặc định làstart = 0. Ví dụ
for index, gradeName in enumerate(gradeList):
print(index, gradeName)
# > Output:
# 0 K63
# 1 K64
# 2 K65
# 3 K66
- Hàm
ziptrongPython, cung cấp một phương thức để nhóm các phần tử có cùng vị trí của các đối tượng lặp, và trả về là mộtiteratordạng danh sách, mỗi phần tử trong danh sách là mộttuple. Cú phápzip(iterable1, iterable2, ...)trong đó
iterableX (X=1, 2, ...)là các đối tượng có thể lặp nhưstring, list, tuple. Và- Nếu không có tham số nào được truyền,
zip()trả về một iterator rỗng. - Nếu tham số được truyền chỉ có duy nhất một iterable,
zip()trả về tuple có 1 phần tử. - Nếu tham số được truyền có nhiều iterable và độ dài của các iterable không bằng nhau, zip sẽ tạo các tuple có độ dài bằng với số iterable nhỏ nhất.
- Nếu không có tham số nào được truyền,
Ví dụ về hàm zip:
indexList = [0, 1, 2, 3]
gradeList = ['K63', 'K64', 'K65', 'K66']
for index, gradeName in zip(indexList, gradeList):
print(index, gradeName)
# > Output:
# 0 K63
# 1 K64
# 2 K65
# 3 K66
Nội dung trên chỉ là tóm tắt, học viên cần đọc các tài liệu liệt kê trong phần tài liệu tham khảo dưới đây.
Tài liệu tham khảo
Tài liệu chính
- PythonCrashCourse (trang 49-51, 53-56)
- SeriousPython (trang 162-163)
- ThinkPython (trang 75-85)
- Bài viết về
enumeratevàziptrên trang web Real Python
Tài liệu bổ sung
- Thư viện itertools