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 (
list
của cáclist
) và vòng lặp lồng nhau - Hàm
enumerate
vàzip
trong 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ừstart
tớ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ố
index
trongPython
bắ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ồmr
phần tử từ đối tượngiterable
product(iterable1, iterable2, ...)
: tạo ra tất cả các phần tử của tíchCartesian
từ các đối tượngiterable1, iterable2, ...
- …
7. Hàm enumerate
và zip
trong Python
- Hàm
enumerate
trongPython
thêm vào một bộ đếm trước đối tượng lặp với cú phápenumerate(iterable, start)
trong đó,
iterable
là một đối tượng có thể lặp nhưlist
,start
là 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
zip
trongPython
, 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ộtiterator
dạ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ề
enumerate
vàzip
trên trang web Real Python
Tài liệu bổ sung
- Thư viện itertools