Vòng lặp for là một cấu trúc lệnh quan trọng mà bất kỳ nhà phát triển Python nào cũng cần phải nắm vững. Chức năng cốt lõi của nó là cung cấp một cơ chế linh hoạt để lặp qua các phần tử trong một tập hợp, như string, tuple hoặc list. Trong bài viết này mình sẽ giúp bạn tìm hiểu thêm về cấu trúc, nguyên lý hoạt động và cách áp dụng vòng lặp for trong Python.
Vòng lặp for trong Python
Vòng lặp for
trong Python cho phép bạn duyệt qua từng phần tử của một dãy, chẳng hạn như list, tuple hoặc string. Vòng lặp này sẽ thực hiện một hành động giống nhau trên mỗi phần tử của dãy. Bắt đầu bằng từ khóa for
, sau đó là một biến đại diện cho phần tử hiện tại trong dãy. Từ khóa in
liên kết biến này với dãy bạn muốn lặp. Cuối tiêu đề vòng lặp luôn có dấu hai chấm (:
), và khối code thụt vào phía dưới sẽ được thực thi một lần cho mỗi phần tử trong dãy.
Cú pháp của vòng lặp for trong Python
for iterating_var in sequence:
statement(s)
Trong đó:
iterating_var
là biến mà giá trị của từng phần tử trong dãy sẽ được gán vào trong mỗi lần lặp.
statement(s)
là khối code mà bạn muốn thực thi lặp đi lặp lại.
Trước khi vòng lặp bắt đầu, sequence
sẽ được đánh giá. Nếu đó là một list, biểu thức list (nếu có) sẽ được tính toán trước. Sau đó, phần tử đầu tiên (ở vị trí chỉ mục 0) trong dãy sẽ được gán cho biến iterating_var
.
Trong mỗi lần lặp, khối lệnh statement(s) sẽ được thực thi với giá trị hiện tại của iterating_var. Tiếp theo, phần tử kế tiếp trong dãy sẽ được gán cho iterating_var, và vòng lặp sẽ tiếp tục cho đến khi toàn bộ dãy được duyệt hết.
Flowchart của vòng lặp for trong Python
Sơ đồ luồng dưới đây minh họa cách hoạt động của vòng lặp for
:
Vòng lặp for trong Python với string
Một chuỗi (string) là một dãy các ký tự Unicode, mỗi ký tự có một chỉ mục vị trí. Vì string là một dãy, bạn có thể duyệt qua từng ký tự của nó bằng vòng lặp for
.
Ví dụ sau sẽ so sánh từng ký tự và hiển thị ký tự đó nếu nó không phải là nguyên âm (‘a’, ‘e’, ‘i’, ‘o’, ‘u’).
zen = '''
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
'''
for char in zen:
if char not in 'aeiou':
print (char, end='')
Khi thực thi mã này, bạn sẽ nhận được kết quả sau:
Btfl s bttr thn gly.
Explct s bttr thn mplct.
Smpl s bttr thn cmplx.
Cmplx s bttr thn cmplctd.
Giải thích:
- Đoạn mã trên định nghĩa một chuỗi nhiều dòng được lưu trong biến
zen
. - Vòng lặp
for char in zen
: sẽ duyệt qua từng ký tự trong chuỗizen
, gán lần lượt các ký tự cho biếnchar
. - Câu lệnh
if char not in 'aeiou'
: kiểm tra xem ký tựchar
có phải là nguyên âm hay không. Nếu ký tự đó không phải là nguyên âm, thì:print(char, end='')
sẽ in ký tựchar
ra màn hình, nhưng không xuống dòng sau mỗi ký tự (vìend=''
). Điều này làm cho các ký tự in liên tiếp nhau trên cùng một dòng.
Bằng cách này, chương trình sẽ in ra tất cả các ký tự không phải nguyên âm trong chuỗi zen.
Vòng lặp for trong Python với Tuple
Tuple trong Python cũng là một kiểu dữ liệu dạng chuỗi có chỉ mục, vì vậy mình có thể duyệt qua từng phần tử của chúng bằng vòng lặp for
.
Ở ví dụ sau, vòng lặp for
sẽ duyệt qua một tuple chứa các số nguyên và tính tổng của tất cả các số:
numbers = (34,54,67,21,78,97,45,44,80,19)
total = 0
for num in numbers:
total += num
print ("Total =", total)
Khi chạy mã này, kết quả như sau:
Total = 539
Vòng lặp for trong Python với List
Tương tự như tuple, list trong Python cũng là một kiểu dữ liệu dạng chuỗi có chỉ mục. Vì vậy, bạn có thể duyệt qua từng phần tử của chúng bằng vòng lặp for
.
Trong ví dụ tiếp theo, vòng lặp for
sẽ duyệt qua một list các số nguyên và chỉ in ra các số chia hết cho 2:
numbers = [34,54,67,21,78,97,45,44,80,19]
total = 0
for num in numbers:
if num%2 == 0:
print (num)
Khi chạy đoạn code này, kết quả sẽ như sau:
34
54
78
44
80
Vòng lặp for trong Python với object range
Trong Python, hàm range()
được tích hợp sẵn trả về một đối tượng iterator, giúp tạo ra một chuỗi các số. Đối tượng này chứa các số nguyên từ giá trị bắt đầu (start)
đến giá trị kết thúc (stop)
, với bước nhảy (step)
. Chúng ta có thể sử dụng vòng lặp for
kết hợp với range()
một cách hiệu quả.
Hàm range()
có cú pháp như sau:
range(start, stop, step)
Trong đó:
Start
: Giá trị bắt đầu của phạm vi. Tùy chọn. Mặc định là 0.Stop
: Phạm vi kết thúc trước giá trị stop.Step
: Các số nguyên trong phạm vi tăng thêm giá trị step. Tùy chọn, mặc định là 1.
Trong ví dụ này, mình sẽ minh họa cách sử dụng range()
với vòng lặp fo
r.
for num in range(5):
print (num, end=' ')
print()
for num in range(10, 20):
print (num, end=' ')
print()
for num in range(1, 10, 2):
print (num, end=' ')
Khi bạn chạy mã trên, nó sẽ tạo ra kết quả sau:
0 1 2 3 4
10 11 12 13 14 15 16 17 18 19
1 3 5 7 9
Vòng lặp For với Dictionaries trong Python
Khác với list, tuple hay string, kiểu dữ liệu dictionary trong Python không phải là một sequence, vì các phần tử của nó không có chỉ mục vị trí. Tuy nhiên, bạn vẫn có thể duyệt qua một dictionary bằng vòng lặp for
.
Khi chạy một vòng lặp for
đơn giản trên một đối tượng dictionary, vòng lặp sẽ duyệt qua các key có trong dictionary đó.
numbers = {10:"Ten", 20:"Twenty", 30:"Thirty",40:"Forty"}
for x in numbers:
print (x)
Đoạn code trên khi chạy sẽ cho ra kết quả như sau:
10
20
30
40
Khi đã lấy được key, bạn có thể dễ dàng truy cập đến giá trị tương ứng bằng cách sử dụng toán tử ngoặc vuông [] hoặc phương thức get()
.
Ví dụ sau đây minh họa cách truy cập giá trị bằng toán tử ngoặc vuông.
numbers = {10:"Ten", 20:"Twenty", 30:"Thirty",40:"Forty"}
for x in numbers:
print (x,":",numbers[x])
Kết quả của đoạn code trên là:
10 : Ten
20 : Twenty
30 : Thirty
40 : Forty
Các phương thức items()
, keys()
và values()
của lớp dict
trả về các view object dict_items
, dict_keys
và dict_values
tương ứng. Những đối tượng này là các iterator, vì vậy bạn có thể dùng vòng lặp for
để duyệt qua chúng.
Object dict_items
là một danh sách các tuple chứa cặp key-value. Chúng ta có thể sử dụng vòng lặp for
để duyệt qua các phần tử của nó như sau:
numbers = {10:"Ten", 20:"Twenty", 30:"Thirty",40:"Forty"}
for x in numbers.items():
print (x)
Đoạn code trên sẽ tạo ra kết quả sau:
(10, ‘Ten’)
(20, ‘Twenty’)
(30, ‘Thirty’)
(40, ‘Forty’)
Sử dụng else với vòng lặp for
Python cho phép sử dụng lệnh else
kèm với vòng lặp. Tuy nhiên, lệnh else
chỉ được thực thi khi vòng lặp đã hoàn tất việc duyệt qua danh sách.
Ví dụ sau minh họa việc kết hợp else
với vòng lặp for
để tìm các số nguyên tố trong khoảng từ 10 đến 20.
# Vòng lặp for để duyệt từ 10 đến 20
for num in range(10, 20):
# Vòng lặp for để duyệt các ước số
for i in range(2,num):
# If statement để xác định ước số đầu tiên
if num%i == 0:
# Để tính ước số thứ hai
j=num/i
print ("%d bằng %d * %d" % (num,i,j))
# Để chuyển sang số tiếp theo
break
else:
print (num, "là một số nguyên tố")
break
Khi chạy đoạn code trên, bạn sẽ nhận được kết quả như sau:
10 bằng 2 * 5
11 là một số nguyên tố
12 bằng 2 * 6
13 là một số nguyên tố
14 bằng 2 * 7
15 bằng 3 * 5
16 bằng 2 * 8
17 là một số nguyên tố
18 bằng 2 * 9
19 là một số nguyên tố
Giải thích:
- Đầu tiên, mình duyệt qua các số từ 10 đến 19 bằng vòng lặp
for num in range(10, 20):.
- Với mỗi số
num
, mình dùng một vòng lặpfor i in range(2,num):
để kiểm tra xem num có ước số nào khác 1 và chính nó không. - Nếu
num
chia hết choi
(tức lànum % i == 0
), có nghĩa lài
là một ước số củanum
. Mình in ra kết quả và dùng lệnhbreak
để thoát khỏi vòng lặpfor i
. - Nếu không tìm thấy ước số nào trong vòng lặp
for i
, thì số đó là số nguyên tố. Trường hợp này, vòng lặpfor i
sẽ không thực hiện câu lệnhbreak
đầu tiên và đi xuống lệnhelse
để in số nguyên tố ra màn hình rồi mới dùngbreak
thoát khỏi vòng lặpfor i
.
Lời kết
Chúng ta vừa cùng nhau khám phá chi tiết về vòng lặp for trong Python, một công cụ quan trọng trong lập trình. Hy vọng những kiến thức này sẽ giúp bạn hiểu rõ và sử dụng vòng lặp một cách hiệu quả trong các dự án của mình. Hãy tiếp tục thực hành để nâng cao kỹ năng lập trình Python của bạn.