Bài 2.7. Vòng lặp for trong Python

Chào mừng các bạn quay trở lại với series học Python! Trong bài học trước, chúng ta đã tìm hiểu về các cấu trúc điều khiển rẽ nhánh. Hôm nay, chúng ta sẽ khám phá một trong những công cụ mạnh mẽ và được sử dụng thường xuyên nhất trong Python (và hầu hết các ngôn ngữ lập trình khác): vòng lặp for.

Hãy tưởng tượng bạn cần in ra màn hình tên của tất cả học sinh trong một lớp có 50 người, hoặc tính tổng tiền lương của 1000 nhân viên. Việc viết 50 hay 1000 dòng lệnh print() hoặc phép cộng riêng lẻ là cực kỳ nhàm chán và không hiệu quả. Đây chính là lúc vòng lặp for tỏa sáng, giúp chúng ta tự động hóa các tác vụ lặp đi lặp lại một cách thanh lịch và gọn gàng.

Cú pháp cơ bản của vòng lặp for

Vòng lặp for trong Python được sử dụng để lặp qua các phần tử của một đối tượng có thể lặp (iterable objects) như chuỗi (string), danh sách (list), tuple, tập hợp (set), từ điển (dictionary), hoặc kết quả từ hàm range().

Cú pháp chung của vòng lặp for như sau:

for <biến_lặp> in <đối_tượng_lặp>:
    # Khối lệnh cần thực thi cho mỗi lần lặp
    # Khối lệnh này phải được thụt lề vào trong
    print(<biến_lặp>) # Ví dụ: in ra giá trị của biến lặp
# Các lệnh bên ngoài vòng lặp (không thụt lề)

Giải thích:

  • for: Từ khóa để bắt đầu vòng lặp for.
  • <biến_lặp> (ví dụ: item, x, char, number): Đây là một biến tạm thời sẽ nhận giá trị của từng phần tử trong <đối_tượng_lặp> sau mỗi lần lặp. Bạn có thể đặt tên bất kỳ cho biến này, nhưng nên chọn tên có ý nghĩa.
  • in: Từ khóa kết nối biến lặp với đối tượng lặp.
  • <đối_tượng_lặp> (ví dụ: một chuỗi, một danh sách): Là đối tượng chứa các phần tử mà bạn muốn lặp qua.
  • :: Dấu hai chấm kết thúc dòng for, báo hiệu khối lệnh lặp sắp bắt đầu.
  • Khối lệnh thụt lề: Tất cả các dòng lệnh bạn muốn thực thi bên trong vòng lặp phải được thụt vào một khoảng trắng (thường là 4 dấu cách hoặc 1 tab). Đây là cách Python xác định phạm vi của vòng lặp.

Lặp qua các loại dữ liệu tuần tự

Hãy cùng xem cách for hoạt động với các kiểu dữ liệu phổ biến nhé.

1. Lặp qua Chuỗi (String)

Khi bạn lặp qua một chuỗi, biến lặp sẽ nhận từng ký tự của chuỗi đó.

my_string = "Python"

print("** Bắt đầu lặp qua chuỗi: **")
for ky_tu in my_string:
  print(f"Ký tự hiện tại là: {ky_tu}")

print("** Kết thúc lặp qua chuỗi! **")

Giải thích:

  • Vòng lặp sẽ chạy qua từng ký tự trong chuỗi "Python".
  • Ở lần lặp đầu tiên, ky_tu sẽ là 'P', sau đó là 'y', 't', 'h', 'o', và cuối cùng là 'n'.
  • Mỗi lần lặp, lệnh print() bên trong sẽ được thực thi, in ra giá trị hiện tại của ky_tu.

Kết quả:

** Bắt đầu lặp qua chuỗi: **
Ký tự hiện tại là: P
Ký tự hiện tại là: y
Ký tự hiện tại là: t
Ký tự hiện tại là: h
Ký tự hiện tại là: o
Ký tự hiện tại là: n
** Kết thúc lặp qua chuỗi! **
2. Lặp qua Danh sách (List)

Tương tự như chuỗi, vòng lặp for có thể duyệt qua từng phần tử trong một danh sách.

fruits = ["Táo", "Chuối", "Cam", "Xoài"]

print("\n** Danh sách các loại trái cây: **")
for fruit in fruits:
  print(f"- {fruit}")

# Tính tổng các số trong danh sách
numbers = [10, 25, 5, 15, 30]
total = 0
for num in numbers:
  total = total + num # Cộng dồn giá trị của num vào total

print(f"\n** Tổng các số trong danh sách là: {total} **")

Giải thích:

  • Vòng lặp đầu tiên duyệt qua danh sách fruits. Biến fruit lần lượt nhận các giá trị "Táo", "Chuối", "Cam", "Xoài".
  • Vòng lặp thứ hai duyệt qua danh sách numbers. Biến num lần lượt nhận các giá trị 10, 25, 5, 15, 30. Biến total được dùng để cộng dồn giá trị của num trong mỗi lần lặp.

Kết quả:

** Danh sách các loại trái cây: **
- Táo
- Chuối
- Cam
- Xoài

** Tổng các số trong danh sách là: 85 **
3. Lặp qua Tuple

Tuple cũng là một đối tượng lặp, hoạt động tương tự như danh sách.

colors = ("Đỏ", "Xanh lá", "Xanh dương")

print("\n** Các màu sắc trong tuple: **")
for color in colors:
    print(f"Màu: {color}")

Giải thích:

  • Vòng lặp này rất giống với ví dụ về danh sách. Biến color sẽ lần lượt nhận các giá trị "Đỏ", "Xanh lá", "Xanh dương".

Kết quả:

** Các màu sắc trong tuple: **
Màu: Đỏ
Màu: Xanh lá
Màu: Xanh dương

Sử dụng hàm range() với vòng lặp for

Một cách rất phổ biến để tạo ra một chuỗi số nguyên để lặp là sử dụng hàm tích hợp range(). Hàm range() có thể nhận một, hai hoặc ba đối số:

  • range(stop): Tạo một dãy số từ 0 đến stop - 1.
  • range(start, stop): Tạo một dãy số từ start đến stop - 1.
  • range(start, stop, step): Tạo một dãy số từ start đến stop - 1, với mỗi bước nhảy là step.
Ví dụ 1: range(stop)
print("\n** Lặp 5 lần sử dụng range(5): **")
for i in range(5): # Tạo dãy số 0, 1, 2, 3, 4
  print(f"Lần lặp thứ: {i}")

Giải thích:

  • range(5) tạo ra một chuỗi các số bắt đầu từ 0 và kết thúc trước 5, tức là 0, 1, 2, 3, 4.
  • Biến i sẽ lần lượt nhận các giá trị này.

Kết quả:

** Lặp 5 lần sử dụng range(5): **
Lần lặp thứ: 0
Lần lặp thứ: 1
Lần lặp thứ: 2
Lần lặp thứ: 3
Lần lặp thứ: 4
Ví dụ 2: range(start, stop)
print("\n** Lặp từ 2 đến 6 (không bao gồm 6) sử dụng range(2, 6): **")
for num in range(2, 6): # Tạo dãy số 2, 3, 4, 5
  print(f"Số hiện tại: {num}")

Giải thích:

  • range(2, 6) tạo ra chuỗi số bắt đầu từ 2 và kết thúc trước 6, tức là 2, 3, 4, 5.

Kết quả:

** Lặp từ 2 đến 6 (không bao gồm 6) sử dụng range(2, 6): **
Số hiện tại: 2
Số hiện tại: 3
Số hiện tại: 4
Số hiện tại: 5
Ví dụ 3: range(start, stop, step)
print("\n** In các số chẵn từ 0 đến 10 sử dụng range(0, 11, 2): **")
for even_num in range(0, 11, 2): # Tạo dãy 0, 2, 4, 6, 8, 10
  print(f"Số chẵn: {even_num}")

print("\n** Đếm ngược từ 5 về 1 sử dụng range(5, 0, -1): **")
for countdown in range(5, 0, -1): # Tạo dãy 5, 4, 3, 2, 1
    print(f"Đếm ngược: {countdown}")

Giải thích:

  • range(0, 11, 2) tạo chuỗi số bắt đầu từ 0, kết thúc trước 11, và mỗi bước nhảy là 2 (0, 2, 4, 6, 8, 10).
  • range(5, 0, -1) tạo chuỗi số bắt đầu từ 5, kết thúc trước 0, và mỗi bước nhảy là -1 (đi lùi), tức là 5, 4, 3, 2, 1.

Kết quả:

** In các số chẵn từ 0 đến 10 sử dụng range(0, 11, 2): **
Số chẵn: 0
Số chẵn: 2
Số chẵn: 4
Số chẵn: 6
Số chẵn: 8
Số chẵn: 10

** Đếm ngược từ 5 về 1 sử dụng range(5, 0, -1): **
Đếm ngược: 5
Đếm ngược: 4
Đếm ngược: 3
Đếm ngược: 2
Đếm ngược: 1

Vòng lặp for lồng nhau (Nested Loops)

Bạn có thể đặt một vòng lặp for bên trong một vòng lặp for khác. Đây được gọi là vòng lặp lồng nhau. Vòng lặp bên trong sẽ thực thi hoàn toàn cho mỗi lần lặp của vòng lặp bên ngoài.

Ví dụ: In ra bảng cửu chương nhỏ

print("\n** Bảng cửu chương nhỏ (từ 1 đến 3): **")
for i in range(1, 4): # Vòng lặp ngoài: chạy từ 1 đến 3
  print(f"\n--- Bảng cửu chương {i} ---")
  for j in range(1, 11): # Vòng lặp trong: chạy từ 1 đến 10
    print(f"{i} x {j} = {i*j}")

Giải thích:

  • Vòng lặp ngoài với biến i chạy 3 lần (cho i = 1, i = 2, i = 3).
  • Với mỗi giá trị của i, vòng lặp bên trong với biến j sẽ chạy 10 lần (từ 1 đến 10).
  • Lệnh print() bên trong cùng sẽ in ra phép nhân tương ứng.

Kết quả:

** Bảng cửu chương nhỏ (từ 1 đến 3): **

--- Bảng cửu chương 1 ---
1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
1 x 10 = 10

--- Bảng cửu chương 2 ---
2 x 1 = 2
2 x 2 = 4
... (kết quả cho bảng 2) ...
2 x 10 = 20

--- Bảng cửu chương 3 ---
3 x 1 = 3
... (kết quả cho bảng 3) ...
3 x 10 = 30

Điều khiển luồng vòng lặp: breakcontinue

Đôi khi, bạn muốn thay đổi cách vòng lặp hoạt động: thoát khỏi vòng lặp sớm hoặc bỏ qua một lần lặp cụ thể. Python cung cấp hai câu lệnh cho việc này: breakcontinue.

1. Câu lệnh break

Câu lệnh break dùng để thoát hoàn toàn khỏi vòng lặp for (hoặc while) ngay lập tức, ngay cả khi chưa lặp hết tất cả các phần tử. Chương trình sẽ tiếp tục thực thi các lệnh sau khối vòng lặp.

Ví dụ: Tìm số đầu tiên lớn hơn 5 trong danh sách.

numbers = [1, 3, 7, 2, 8, 4]

print("\n** Tìm số đầu tiên lớn hơn 5: **")
for num in numbers:
  print(f"Đang kiểm tra số: {num}")
  if num > 5:
    print(f"Tìm thấy số {num} lớn hơn 5! Dừng vòng lặp.")
    break # Thoát khỏi vòng lặp ngay lập tức

print("** Đã ra khỏi vòng lặp. **")

Giải thích:

  • Vòng lặp duyệt qua danh sách numbers.
  • Khi num nhận giá trị 7, điều kiện num > 5 là đúng.
  • Lệnh print() thông báo tìm thấy số được thực thi.
  • Câu lệnh break được thực thi, vòng lặp kết thúc ngay tại đây. Các số 2, 8, 4 sẽ không được kiểm tra nữa.
  • Chương trình nhảy đến lệnh print("** Đã ra khỏi vòng lặp. **").

Kết quả:

** Tìm số đầu tiên lớn hơn 5: **
Đang kiểm tra số: 1
Đang kiểm tra số: 3
Đang kiểm tra số: 7
Tìm thấy số 7 lớn hơn 5! Dừng vòng lặp.
** Đã ra khỏi vòng lặp. **
2. Câu lệnh continue

Câu lệnh continue dùng để bỏ qua phần còn lại của lần lặp hiện tại và chuyển sang lần lặp tiếp theo ngay lập tức. Các lệnh bên dưới continue trong khối lặp sẽ không được thực thi trong lần lặp đó.

Ví dụ: Chỉ in các số chẵn trong danh sách.

numbers = [1, 2, 3, 4, 5, 6, 7, 8]

print("\n** Chỉ in các số chẵn: **")
for num in numbers:
  if num % 2 != 0: # Nếu số là số lẻ
    continue # Bỏ qua phần còn lại của lần lặp này, đi đến số tiếp theo
  # Lệnh print này chỉ chạy nếu số là số chẵn (không bị continue bỏ qua)
  print(f"Số chẵn tìm thấy: {num}")

print("** Đã duyệt xong danh sách. **")

Giải thích:

  • Vòng lặp duyệt qua danh sách numbers.
  • Với mỗi num, kiểm tra xem num % 2 != 0 (có phải số lẻ không).
  • Nếu là số lẻ (ví dụ: 1, 3, 5, 7), continue được thực thi. Lệnh print() phía dưới sẽ không chạy, và vòng lặp chuyển ngay sang kiểm tra số tiếp theo.
  • Nếu là số chẵn (ví dụ: 2, 4, 6, 8), điều kiện if là sai, continue không chạy, và lệnh print() phía dưới được thực thi.

Kết quả:

** Chỉ in các số chẵn: **
Số chẵn tìm thấy: 2
Số chẵn tìm thấy: 4
Số chẵn tìm thấy: 6
Số chẵn tìm thấy: 8
** Đã duyệt xong danh sách. **

Mệnh đề else trong vòng lặp for

Một tính năng ít được biết đến hơn nhưng khá thú vị của vòng lặp for (và while) trong Python là khả năng có mệnh đề else. Khối lệnh trong else sẽ được thực thi chỉ khi vòng lặp kết thúc một cách bình thường (tức là đã lặp qua hết tất cả các phần tử) mà không bị ngắt bởi câu lệnh break.

Ví dụ 1: Vòng lặp hoàn thành bình thường (không có break)

print("\n** Ví dụ else với vòng lặp hoàn thành: **")
for i in range(3):
    print(f"Lần lặp: {i}")
else:
    print("Vòng lặp đã hoàn thành mà không gặp break.")

Kết quả:

** Ví dụ else với vòng lặp hoàn thành: **
Lần lặp: 0
Lần lặp: 1
Lần lặp: 2
Vòng lặp đã hoàn thành mà không gặp break.

Ví dụ 2: Vòng lặp bị ngắt bởi break

print("\n** Ví dụ else với vòng lặp bị break: **")
numbers = [1, 3, 5, 8, 10]
for num in numbers:
    print(f"Kiểm tra số: {num}")
    if num % 2 == 0: # Tìm số chẵn đầu tiên
        print(f"Tìm thấy số chẵn: {num}. Thoát vòng lặp.")
        break
else:
    # Khối else này sẽ KHÔNG được thực thi vì vòng lặp bị break
    print("Không tìm thấy số chẵn nào trong danh sách.")

Giải thích:

  • Vòng lặp tìm số chẵn. Khi num8, điều kiện if đúng và break được thực thi.
  • Vì vòng lặp kết thúc do break chứ không phải do lặp hết danh sách, khối else sẽ không được thực thi.

Kết quả:

** Ví dụ else với vòng lặp bị break: **
Kiểm tra số: 1
Kiểm tra số: 3
Kiểm tra số: 5
Kiểm tra số: 8
Tìm thấy số chẵn: 8. Thoát vòng lặp.

Mệnh đề else này cực kỳ hữu ích khi bạn muốn thực hiện một hành động nào đó chỉ khi một điều kiện tìm kiếm (dẫn đến break) không được thỏa mãn trong suốt vòng lặp. Ví dụ: thông báo "Không tìm thấy" sau khi đã duyệt hết danh sách mà không break.


Vòng lặp for là một khái niệm nền tảng và vô cùng quan trọng trong lập trình Python. Việc nắm vững cách sử dụng for, kết hợp với range(), break, continue, và else sẽ giúp bạn viết code hiệu quả, tự động hóa các tác vụ lặp lại và giải quyết nhiều vấn đề phức tạp hơn. Hãy thực hành thật nhiều với các ví dụ khác nhau để trở nên thành thạo nhé!

Comments

There are no comments at the moment.