Chuyển đến nội dung chính

Hướng dẫn Vòng lặp Python

Hướng dẫn nhập môn toàn diện về vòng lặp trong Python. Học và thực hành vòng lặp while và for, vòng lặp lồng nhau, từ khóa break và continue, hàm range và hơn thế nữa!
Đã cập nhật 5 thg 6, 2026  · 15 phút đọc

range Python

Vòng lặp rất quan trọng trong Python cũng như các ngôn ngữ lập trình khác vì chúng giúp bạn thực thi một khối mã lặp đi lặp lại. Bạn sẽ thường xuyên gặp những tình huống cần dùng một đoạn mã nhiều lần nhưng không muốn viết đi viết lại cùng một dòng mã.

Trong hướng dẫn về vòng lặp Python này, bạn sẽ tìm hiểu các chủ đề sau:

  • Vòng lặp while trong Python: bạn sẽ học cách xây dựng và sử dụng vòng lặp while trong các ứng dụng khoa học dữ liệu. Bạn sẽ thực hành thông qua một số thử thách mã tương tác.
  • Tiếp theo, bạn sẽ chuyển sang vòng lặp for: một lần nữa, bạn sẽ học cách xây dựng và sử dụng vòng lặp for trong bối cảnh thực tế.
  • Bạn cũng sẽ học sự khác nhau giữa vòng lặp while và vòng lặp for.
  • Chủ đề về vòng lặp lồng nhau
  • Sau đó, bạn sẽ thấy cách sử dụng từ khóa breakcontinue.
  • Sự khác nhau giữa các hàm xrange()range()

While Loop

Vòng lặp while là một trong những vòng lặp đầu tiên mà bạn có lẽ sẽ gặp khi bắt đầu học lập trình. Nó cũng là một trong những vòng lặp trực quan nhất để hiểu: nếu bạn nghĩ về tên gọi của vòng lặp này, từ "while" gợi đến một "khoảng" hay một "quãng thời gian". Như bạn đã biết, từ "loop" chỉ một đoạn mã được thực thi lặp đi lặp lại.

Với tất cả điều đó, bạn có thể dễ dàng hiểu định nghĩa sau về vòng lặp while:

Vòng lặp while là một khái niệm lập trình mà khi được triển khai sẽ thực thi một đoạn mã lặp đi lặp lại khi điều kiện cho trước vẫn đúng.

Định nghĩa trên cũng nhấn mạnh ba thành phần bạn cần để xây dựng vòng lặp while trong Python:

  • Từ khóa while;
  • Một điều kiện trả về True hoặc False; Và
  • Một khối mã mà bạn muốn thực thi lặp đi lặp lại

Chỉ cần vậy thôi!

Cách Tạo Vòng lặp While trong Python

Giờ bạn đã biết cần gì để xây dựng vòng lặp while, việc còn lại là xem một ví dụ thực tế về việc sử dụng vòng lặp while trước khi tự làm bài tập! Xem ví dụ sau:

# Take user input
number = 2  

# Condition of the while loop
while number < 5 :  
    print("Thank you")
    # Increment the value of the variable "number by 1"
    number = number+1

# Thank you
# Thank you
# Thank you

Đoạn mã trên là một vòng lặp while rất đơn giản: nếu bạn để ý, ba thành phần mà bạn vừa đọc đều có mặt: từ khóa while, theo sau là một điều kiện trả về True hoặc False (number < 5) và một khối mã bạn muốn thực thi lặp lại:

print("Thank you")
number = number + 1

Nếu đi sâu hơn vào mã trên, bạn thấy có biến number lưu số nguyên 2. Vì giá trị trong number nhỏ hơn 5, bạn in ra "Thank you" và tăng giá trị của number thêm một. Chừng nào giá trị trong number còn nhỏ hơn 5, bạn tiếp tục thực thi hai dòng mã nằm trong vòng lặp while:

"Thank you"
"Thank you"

Bạn in ra "Thank you" thêm hai lần trước khi giá trị của number bằng 5 và điều kiện không còn đánh giá là True. Vì điều kiện lúc này là False, bạn sẽ thoát khỏi vòng lặp while và tiếp tục chương trình nếu còn mã khác. Ở đây không còn mã nào nên chương trình dừng.

Ví dụ trên hơi cơ bản, bạn cũng có thể thêm điều kiện if-else để tùy biến hơn. Xem ví dụ sau:

# Take user input
number = 2 

# Condition of the while loop
while number < 5 :  
    # Find the mod of 2
    if number%2 == 0:  
        print("The number "+str(number)+" is even")
    else:
        print("The number "+str(number)+" is odd")

    # Increment `number` by 1
    number = number+1

# The number 2 is even
# The number 3 is odd
# The number 4 is even

Giờ, hãy luyện tập!

Viết hàm collatz() cho phép người dùng nhập một số nguyên vào biến number. Nếu number là số chẵn, in kết quả của number/2. Nếu number là số lẻ, thì collatz() sẽ in và trả về 3 * number + 1. Chương trình sẽ tiếp tục gọi hàm collatz() trên number cho đến khi nó trả về 1.

Lưu ý đây thực chất là hiện thực dãy Collatz, tóm lược là một bài toán toán học: bạn chọn một số rồi lặp các phép tính trên cho đến khi đạt kết quả 1.

Bên dưới là lời giải:

def collatz(number):
    # Is the mod of 2 equal to 0?
    if number % 2 == 0:
        print(number // 2)
        return number // 2

    # If the mod of 2 isn't equal to 0, print `3 * number + 1`
    elif number % 2 == 1:
        result = 3 * number + 1
        print(result)
        return result

# Input   
n = 5

# As long as `n` is not equal to `1`, run `collatz()`
while n != 1:
    n = collatz(int(n))

# 16
# 8
# 4
# 2
# 1

Bắt đầu học Python miễn phí

Introduction to Python

BeginnerSkill Level
4 giờ
6.9M learners
Nắm vững những kiến thức cơ bản về phân tích dữ liệu với Python chỉ trong bốn giờ. Khóa học trực tuyến này sẽ giới thiệu giao diện Python và khám phá các gói phổ biến.
See DetailsRight Arrow

Intermediate Python

BeginnerSkill Level
4 giờ
1.4M learners
Nâng cao kỹ năng khoa học dữ liệu bằng cách tạo trực quan hóa với Matplotlib và thao tác DataFrame với pandas.

For Loop

Bạn có thể tiếp cận vòng lặp for theo cách tương tự vòng lặp while. Như bạn có thể đã đoán, thành phần "for" trong "for loop" ám chỉ việc bạn làm điều gì đó một số lần nhất định.

Nếu ghi nhớ những điều trên, bạn có thể dễ dàng định nghĩa vòng lặp for như sau:

Vòng lặp for là một khái niệm lập trình mà khi được triển khai sẽ thực thi một đoạn mã lặp đi lặp lại "trong" một số lần nhất định, dựa trên một dãy.

Trái với vòng lặp while, không có điều kiện hoạt động nào tham gia trực tiếp - bạn chỉ đơn giản thực thi một đoạn mã lặp lại một số lần. Nói cách khác, trong khi vòng lặp while chỉ tiếp tục thực thi khối mã bên trong chừng nào điều kiện còn True, thì vòng lặp for thực thi mã bên trong đúng một số lần xác định. "Số lần" này được quyết định bởi một dãy hay một danh sách có thứ tự.

Bạn sẽ tìm hiểu thêm về sự khác biệt giữa while và for trong chốc lát, nhưng lúc này, hãy tập trung vào những thành phần cần có để tạo một vòng lặp for:

  • Từ khóa for
  • Một biến
  • Từ khóa in
  • Hàm range(), một hàm dựng sẵn trong thư viện Python để tạo một dãy số
  • Đoạn mã bạn muốn thực thi lặp lại

Vòng lặp For trong Python

# Print "Thank you" 5 times
for number in range(5):
    print("Thank you")

# Thank you
# Thank you
# Thank you
# Thank you
# Thank you

Như bạn thấy, các thành phần bạn đã thấy ở phần trên xuất hiện lại trong ví dụ nhỏ này về vòng lặp for trong Python: từ khóa for, biến number, từ khóa in, hàm range() và đoạn mã bạn muốn thực thi nhiều lần, print("Thank you").

Không khó lắm, đúng không?

Xem thêm một ví dụ về vòng lặp for, nơi bạn dùng hai biến để xác định luồng điều khiển:

languages = ['R', 'Python',  'Scala', 'Java', 'Julia']

for index in range(len(languages)):
   print('Current language:', languages[index])

# Current language: R
# Current language: Python
# Current language: Scala
# Current language: Java
# Current language: Julia

Như bạn thấy, bạn bắt đầu vòng lặp với từ khóa for. Tiếp theo, bạn dùng các biến indexlanguages, từ khóa in, và hàm range() để tạo một dãy số. Ngoài ra, bạn còn dùng hàm len() trong trường hợp này, vì danh sách languages không phải số. Đoạn mã bạn muốn thực thi lặp lại là một câu lệnh in: print('Current language :', languages[index]).

Trong vòng lặp trên, bạn muốn diễn đạt rằng với mỗi chỉ số trong phạm vi len(languages), bạn muốn in ra ngôn ngữ lập trình khoa học dữ liệu. Giờ, len(languages) là 5, nên câu lệnh cũng có thể viết lại thành:

for index in range(5):
    print('Current language:', languages[index])

# Current language: R
# Current language: Python
# Current language: Scala
# Current language: Java
# Current language: Julia

Và một lần nữa, bạn nhận được cùng kết quả!

So sánh While và For trong Python

Hãy xem lại ví dụ vòng lặp while đầu tiên để xác định chính xác sự khác nhau giữa while và for. Bạn đã đọc ở trên rằng khác biệt nằm ở việc có hay không có điều kiện tham gia, nhưng điều này thể hiện trong mã ra sao và bạn có thể chuyển đổi giữa hai loại như thế nào?

# Take user input
number = 2  

while number < 5 :
    print("Thank you")
    # Increment `number` by 1
    number = number+1

# Thank you
# Thank you
# Thank you

Bạn có thể dùng vòng lặp for để in câu "Thank you" theo cách kiểm soát hơn:

# Print "Thank you" 3 times
for number in range(3) :  
    print("Thank you")

# Thank you
# Thank you
# Thank you

Thấy việc chuyển vòng lặp while sang vòng lặp for tương đương dễ thế nào chưa?

Nó hoạt động thế nào ư? Đơn giản thôi.

Trong vòng lặp for, số nguyên bên trong hàm range là phạm vi hay số lần điều khiển cần lặp và thực thi mã trong phần thân vòng lặp for.

Lưu ý hàm range() đếm từ 0 chứ không phải từ 1. Nghĩa là, trong ví dụ trên, dãy đếm sẽ là 0,1,2 chứ không phải 1,2,3. Đó là cách máy tính đếm trong bộ nhớ. Vì vậy, khi thiết kế vòng lặp for, luôn nhớ rằng bạn phải tính số đếm của range bắt đầu từ 0 chứ không phải 1.

Mẹo: điều này cũng đúng với danh sách trong Python, chẳng hạn. Nếu bạn muốn biết thêm về danh sách Python, hãy xem hướng dẫn 18 Câu Hỏi Phổ Biến Nhất Về Danh Sách Python của DataCamp.

Giờ, có một khác biệt thú vị nữa giữa vòng lặp for và while. Vòng lặp for nhanh hơn vòng lặp while. Để hiểu điều này, hãy xem ví dụ dưới đây.

import timeit

# A for loop example
def for_loop():
    for number in range(10000) :  
        # Execute the below code 10000 times
        sum = 3+4
        #print(sum)

timeit.timeit(for_loop)

# 267.0804728891719
import timeit

# A while loop example
def while_loop():
    i =0
    while i<10000:
        sum = 3+4
        #print(sum)
        i+=1

timeit.timeit(while_loop)

# 884.9233417965908

Trong đoạn mã trên, bạn có hai vòng lặp với khoảng 10000 vòng lặp. Cả hai nhìn giống nhau thoạt nhìn, cho đến khi bạn xem sâu hơn và hiểu cách chúng hoạt động. Gợi ý: hàm timeit() cho bạn manh mối về sự khác biệt!

Hãy nhớ: toàn bộ mã Python được biên dịch bằng trình biên dịch C, nghĩa là mã bạn thấy ở trên trước tiên được chuyển thành bytecode rồi được xử lý bởi trình biên dịch C bên dưới.

Khi thực thi vòng lặp for trong ví dụ trên bắt đầu, trình thông dịch Python nói chuyện với trình biên dịch C bên dưới và tạo một đối tượng danh sách kích thước 10000. Tiếp theo, nó gọi một iterator để truy cập chỉ mục trên từng phần tử trong 10000 phần tử của danh sách.

Trong khi đó, việc thực thi vòng lặp while không tạo bất kỳ đối tượng danh sách nào. Thực tế, trình biên dịch C bên dưới gọi toán tử so sánh boolean cho điều kiện i<10000 tới 9999 lần.

Bạn có thể hình dung rằng lặp qua một đối tượng danh sách đã được tạo sẵn với 10000 phần tử sẽ dễ dàng hơn cho trình biên dịch so với việc thực hiện phép so sánh boolean lặp đi lặp lại 9999 lần, nên hiệu năng thời gian của vòng lặp for tốt hơn vòng lặp while. Điều này thể hiện rõ trong thời gian thực thi: thời gian để vòng lặp for hoàn thành nhỏ hơn nhiều so với vòng lặp while.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgU2V0IGBmaWJfbm9gIHRvIDU1LCB0aGUgbnVtYmVyIHVudGlsIHdoZXJlIHlvdSB3YW50IHRvIHByaW50XG5maWJfbm8gPSA1NVxuXG4jIFNldCBgZmlyc3Rfbm9gIHRvIDBcbmZpcnN0X25vID0gMFxuXG4jIFNldCBgc2Vjb25kX25vYCB0byAxXG5zZWNvbmRfbm8gPSAxXG5cbiMgU2V0IHRoZSBjb3VudGVyIGBjb3VudGAgdG8gMCBcbmNvdW50ID0gMFxuXG4jIHdoaWxlIGxvb3AgdG8gcHJpbnQgdGhlIGZpYm9uYWNjaSBzZXJpZXMgdW50aWwgdGhlIGBmaWJfbm9gXG53aGlsZSBmaXJzdF9ubyA8PSBmaWJfbm86XG4gICAgICAgIyBQcmludCBgZmlyc3Rfbm9gXG4gICAgICAgcHJpbnQoZmlyc3Rfbm8pXG4gICAgICAgXG4gICAgICAgIyBGaWJvbm5hY2NpIG51bWJlclxuICAgICAgIG50aCA9IGZpcnN0X25vICsgX19fX19fX19fX1xuICAgICAgIFxuICAgICAgICMgdXBkYXRlIHZhbHVlcyBvZiBgZmlyc3Rfbm9gIGFuZCBgc2Vjb25kX25vYFxuICAgICAgIGZpcnN0X25vID0gX19fX19fX19fX19fXG4gICAgICAgc2Vjb25kX25vID0gX19fXG4gICAgICAgXG4gICAgICAgIyBTZXQgY291bnRlciBgY291bnRgICsxXG4gICAgICAgX19fX19fX19fXyIsInNvbHV0aW9uIjoiIyBTZXQgYGZpYl9ub2AgdG8gNTUsIHRoZSBudW1iZXIgdW50aWwgd2hlcmUgeW91IHdhbnQgdG8gcHJpbnRcbmZpYl9ubyA9IDU1XG5cbiMgU2V0IGBmaXJzdF9ub2AgdG8gMFxuZmlyc3Rfbm8gPSAwXG5cbiMgU2V0IGBzZWNvbmRfbm9gIHRvIDEcbnNlY29uZF9ubyA9IDFcblxuIyBTZXQgdGhlIGNvdW50ZXIgYGNvdW50YCB0byAwIFxuY291bnQgPSAwXG5cbiMgd2hpbGUgbG9vcCB0byBwcmludCB0aGUgZmlib25hY2NpIHNlcmllcyB1bnRpbCB0aGUgYGZpYl9ub2BcbndoaWxlIGZpcnN0X25vIDw9IGZpYl9ubzpcbiAgICAgICAjIFByaW50IGBmaXJzdF9ub2BcbiAgICAgICBwcmludChmaXJzdF9ubylcbiAgICAgICBcbiAgICAgICAjIEZpYm9ubmFjY2kgbnVtYmVyXG4gICAgICAgbnRoID0gZmlyc3Rfbm8gKyBzZWNvbmRfbm9cbiAgICBcbiAgICAgICAjIHVwZGF0ZSB2YWx1ZXMgb2YgYGZpcnN0X25vYCBhbmQgYHNlY29uZF9ub2BcbiAgICAgICBmaXJzdF9ubyA9IHNlY29uZF9ub1xuICAgICAgIHNlY29uZF9ubyA9IG50aFxuICAgICAgIFxuICAgICAgICMgU2V0IGNvdW50ZXIgYGNvdW50YCArMVxuICAgICAgIGNvdW50ICs9IDEiLCJzY3QiOiJFeCgpLmNoZWNrX29iamVjdChcImZpYl9ub1wiLCAwKS5oYXNfZXF1YWxfdmFsdWUoaW5jb3JyZWN0X21zZz1cIkRpZCB5b3UgY29ycmVjdGx5IGRlZmluZSBgZmliX25vYD9cIilcbkV4KCkuaGFzX2VxdWFsX2FzdChcIllvdSBkb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYGZpcnN0X25vYCFcIiwgY29kZT1cImZpcnN0X25vID0gMFwiLCBleGFjdD1GYWxzZSlcbkV4KCkuaGFzX2VxdWFsX2FzdChcIllvdSBkb24ndCBuZWVkIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYHNlY29uZF9ub2AhXCIsIGNvZGU9XCJzZWNvbmRfbm8gPSAxXCIsIGV4YWN0PUZhbHNlKVxuRXgoKS5oYXNfZXF1YWxfYXN0KFwiWW91IGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBgY291bnRgIVwiLCBjb2RlPVwiY291bnQgPSAwXCIsIGV4YWN0PUZhbHNlKVxuXG5FeCgpLmNoZWNrX3doaWxlKDApLmNoZWNrX3Rlc3QoKS5oYXNfZXF1YWxfYXN0KClcbkV4KCkuY2hlY2tfd2hpbGUoMCkuY2hlY2tfYm9keSgpLmNoZWNrX2Z1bmN0aW9uKFwicHJpbnRcIiwgMClcbkV4KCkuY2hlY2tfd2hpbGUoMCkuY2hlY2tfYm9keSgpLmhhc19lcXVhbF9hc3QoXCJJdCBsb29rcyBsaWtlIHRoZSBjb250ZW50cyBvZiBgbnRoYCBhcmVuJ3QgY29ycmVjdC5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZT1cIm50aCA9IGZpcnN0X25vICsgc2Vjb25kX25vXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0PUZhbHNlKVxuRXgoKS5jaGVja193aGlsZSgwKS5jaGVja19ib2R5KCkuaGFzX2VxdWFsX2FzdChcIkl0IGxvb2tzIGxpa2UgdGhlIGNvbnRlbnRzIG9mIGBmaXJzdF9ub2AgYXJlbid0IGNvcnJlY3QuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU9XCJmaXJzdF9ubyA9IHNlY29uZF9ub1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdD1GYWxzZSlcbkV4KCkuY2hlY2tfd2hpbGUoMCkuY2hlY2tfYm9keSgpLmhhc19lcXVhbF9hc3QoXCJJdCBsb29rcyBsaWtlIHRoZSBjb250ZW50cyBvZiBgc2Vjb25kX25vYCBhcmVuJ3QgY29ycmVjdC5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZT1cInNlY29uZF9ubyA9IG50aFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdD1GYWxzZSlcbkV4KCkuY2hlY2tfd2hpbGUoMCkuY2hlY2tfYm9keSgpLmhhc19lcXVhbF9hc3QoXCJJdCBsb29rcyBsaWtlIHRoZSB2YWx1ZSBvZiBgY291bnRgIGlzbid0IGNvcnJlY3QuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU9XCJjb3VudCArPSAxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0PUZhbHNlKSJ9

Giờ hãy thử vòng lặp for! Lưu ý bạn muốn chỉ định phạm vi từ 0 đến 11, vì bạn chỉ muốn hiển thị các số trong dãy đến 55, là số thứ 11 trong dãy.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgSW5pdGlhbGl6ZSBgZmlyc3Rfbm9gIHRvIGAwYFxuZmlyc3Rfbm8gPSAwXG5cbiMgSW5pdGlhbGl6ZSBgc2Vjb25kX25vYCB0byBgMWBcbnNlY29uZF9ubyA9IDFcblxuIyBJbml0aWFsaXplIGBudW1iZXJzYFxubnVtYmVycyA9IF9fX19fX19fX19fXG5cbiMgRmluZCBhbmQgZGlzcGxheSBGaWJvbmFjY2kgc2VyaWVzXG5mb3IgbnVtIGluIF9fX19fX186XG4gICAgICAgICAgIGlmKG51bSA8PSAxKTpcbiAgICAgICAgICAgIyBVcGRhdGUgb25seSBgbnRoYFxuICAgICAgICAgICAgICAgICAgICAgIG50aCA9IF9fX1xuICAgICAgICAgICBlbHNlOlxuICAgICAgICAgICAjIFVwZGF0ZSB0aGUgdmFsdWVzIGBudGhgLCBgZmlyc3Rfbm9gIGFuZCBgc2Vjb25kX25vYFxuICAgICAgICAgICAgICAgICAgICAgIG50aCA9IGZpcnN0X25vICsgc2Vjb25kX25vXG4gICAgICAgICAgICAgICAgICAgICAgZmlyc3Rfbm8gPSBzZWNvbmRfbm9cbiAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfbm8gPSBfX19fX19fX19fXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICMgUHJpbnQgYG50aGBcbiAgICAgICAgICAgcHJpbnQobnRoKSIsInNvbHV0aW9uIjoiIyBJbml0aWFsaXplIGBmaXJzdF9ub2AgdG8gYDBgXG5maXJzdF9ubyA9IDBcblxuIyBJbml0aWFsaXplIGBzZWNvbmRfbm9gIHRvIGAxYFxuc2Vjb25kX25vID0gMVxuICAgICAgICAgICBcbiMgSW5pdGlhbGl6ZSBgbnVtYmVyc2Bcbm51bWJlcnMgPSByYW5nZSgwLDExKVxuXG4jIEZpbmQgYW5kIGRpc3BsYXkgRmlib25hY2NpIHNlcmllc1xuZm9yIG51bSBpbiBudW1iZXJzOlxuICAgICAgICAgICBpZihudW0gPD0gMSk6XG4gICAgICAgICAgICMgVXBkYXRlIG9ubHkgYG50aGBcbiAgICAgICAgICAgICAgICAgICAgICBudGggPSBudW1cbiAgICAgICAgICAgZWxzZTpcbiAgICAgICAgICAgIyBVcGRhdGUgdGhlIHZhbHVlcyBgbnRoYCwgYGZpcnN0X25vYCBhbmQgYHNlY29uZF9ub2BcbiAgICAgICAgICAgICAgICAgICAgICBudGggPSBmaXJzdF9ubyArIHNlY29uZF9ub1xuICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X25vID0gc2Vjb25kX25vXG4gICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX25vID0gbnRoXG5cbiAgICAgICAgICAgIyBQcmludCBgbnRoYFxuICAgICAgICAgICBwcmludChudGgpIiwic2N0IjoiRXgoKS5oYXNfZXF1YWxfYXN0KFwiWW91IGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBgZmlyc3Rfbm9gIVwiLCBjb2RlPVwiZmlyc3Rfbm8gPSAwXCIsIGV4YWN0PUZhbHNlKVxuRXgoKS5oYXNfZXF1YWxfYXN0KFwiWW91IGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBgc2Vjb25kX25vYCFcIiwgY29kZT1cInNlY29uZF9ubyA9IDFcIiwgZXhhY3Q9RmFsc2UpXG5FeCgpLmNoZWNrX29iamVjdChcIm51bWJlcnNcIilcblxuRXgoKS5jaGVja19mb3JfbG9vcCgwKS5jaGVja19pdGVyKCkuaGFzX2VxdWFsX2FzdCgpXG5cbkV4KCkuY2hlY2tfZm9yX2xvb3AoMCkuY2hlY2tfYm9keSgpLmNoZWNrX2lmX2Vsc2UoMCkuY2hlY2tfdGVzdCgpLmhhc19lcXVhbF9hc3QoXCJEaWQgeW91IGNvcnJlY3RseSBjaGVjayB0aGF0IHRoZSBudW1iZXIgaXMgc21hbGxlciBvciBlcXVhbCB0aGFuIDE/XCIsIGNvZGU9XCJudW0gPD0gMVwiLCBleGFjdD1GYWxzZSlcbkV4KCkuY2hlY2tfZm9yX2xvb3AoMCkuY2hlY2tfYm9keSgpLmNoZWNrX2lmX2Vsc2UoMCkuY2hlY2tfYm9keSgpLmhhc19lcXVhbF9hc3QoXCJJdCBsb29rcyBsaWtlIHRoZSBjb250ZW50cyBvZiBgbnRoYCBhcmVuJ3QgY29ycmVjdC5cIiwgY29kZT1cIm50aCA9IG51bVwiLCBleGFjdD1GYWxzZSlcblxuRXgoKS5jaGVja19mb3JfbG9vcCgwKS5jaGVja19ib2R5KCkuY2hlY2tfaWZfZWxzZSgwKS5jaGVja19vcmVsc2UoKS5oYXNfZXF1YWxfYXN0KFwiSXQgbG9va3MgbGlrZSB0aGUgY29udGVudHMgb2YgYG50aGAgYXJlbid0IGNvcnJlY3QuXCIsY29kZT1cIm50aCA9IGZpcnN0X25vICsgc2Vjb25kX25vXCIsIGV4YWN0PUZhbHNlKVxuRXgoKS5jaGVja19mb3JfbG9vcCgwKS5jaGVja19ib2R5KCkuaGFzX2VxdWFsX2FzdChcIkl0IGxvb2tzIGxpa2UgdGhlIGNvbnRlbnRzIG9mIGBmaXJzdF9ub2AgYXJlbid0IGNvcnJlY3QuXCIsY29kZT1cImZpcnN0X25vID0gc2Vjb25kX25vXCIsIGV4YWN0PUZhbHNlKVxuRXgoKS5jaGVja19mb3JfbG9vcCgwKS5jaGVja19ib2R5KCkuaGFzX2VxdWFsX2FzdChcIkl0IGxvb2tzIGxpa2UgdGhlIGNvbnRlbnRzIG9mIGBzZWNvbmRfbm9gIGFyZW4ndCBjb3JyZWN0LlwiLGNvZGU9XCJzZWNvbmRfbm8gPSBudGhcIiwgZXhhY3Q9RmFsc2UpXG5cbkV4KCkuY2hlY2tfZm9yX2xvb3AoMCkuY2hlY2tfYm9keSgpLnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBkb19ldmFsPUZhbHNlLCBjb3B5PUZhbHNlKSJ9

Vòng lặp Lồng nhau

Như bạn có thể thấy trong một ví dụ ở trên, có điều kiện if-else bên trong vòng lặp while cho phép bạn đưa thêm điều kiện vào mã.

Khoan đã!

Đó không phải là cách duy nhất để tùy biến vòng lặp. Bạn cũng có thể chèn thêm một vài vòng lặp while vào mã hiện có và điều này được gọi là vòng lặp lồng nhau. Bạn có thể sửa ví dụ trên để thêm một vòng lặp while khác như dưới đây:

# Take user input
number = 2 

# condition of the while loop
while number < 5 :  
    # condition of the nested while loop    
    while number % 2 == 0: 
        print("The number "+ str(number)+" is even")

Trong ví dụ trên có một vòng lặp while khác được "lồng" bên trong vòng lặp ngoài, vòng lặp trong này thêm một kiểm tra để xem number % (mod) 2 có bằng 0 không.

Nói cách khác, nó kiểm tra xem số đó có phải số chẵn rồi in ra câu "The number is even".

Nhưng có một điểm cần chú ý: nếu bạn nhìn kỹ, bạn sẽ thấy giống như mã trước đó, câu lệnh number=number+1 lần này bị thiếu. Vì bạn không tăng biến number ở đâu cả, giá trị của biến giữ nguyên mỗi lần và mã rơi vào vòng lặp vô hạn. Nghĩa là, một khi đã vào vòng lặp, nó không bao giờ thoát ra và in câu lệnh vô số lần vì biến number sẽ luôn bằng 2. Số này, dĩ nhiên, nhỏ hơn 5 và là số chẵn.

Giờ hãy xem vòng lặp for lồng nhau sẽ trông như thế nào:

# Print the below statement 3 times
for number in range(3) :  
    print("-------------------------------------------")
    print("I am outer loop iteration "+str(number))
    # Inner loop
    for another_number in range(5):  
        print("****************************")
        print("I am inner loop iteration "+str(another_number))
-------------------------------------------
I am outer loop iteration 0
****************************
I am inner loop iteration 0
****************************
I am inner loop iteration 1
****************************
I am inner loop iteration 2
****************************
I am inner loop iteration 3
****************************
I am inner loop iteration 4
-------------------------------------------
I am outer loop iteration 1
****************************
I am inner loop iteration 0
****************************
I am inner loop iteration 1
****************************
I am inner loop iteration 2
****************************
I am inner loop iteration 3
****************************
I am inner loop iteration 4
-------------------------------------------
I am outer loop iteration 2
****************************
I am inner loop iteration 0
****************************
I am inner loop iteration 1
****************************
I am inner loop iteration 2
****************************
I am inner loop iteration 3
****************************
I am inner loop iteration 4

Mã trên là phiên bản đã chỉnh sửa của ví dụ vòng lặp for đầu tiên. Lưu ý cách một vòng lặp for thứ hai được dùng bên trong vòng lặp ngoài.

Hãy chạy mã.

Bạn sẽ thấy điều khiển đi vào vòng lặp for đầu tiên và giá trị của biến number được khởi tạo là 0. Dòng in đầu tiên được in, rồi điều khiển đi vào vòng lặp for thứ hai, nơi giá trị của biến another_number được khởi tạo là 0. Dòng in đầu tiên trong vòng lặp thứ hai được in một lần.

Giờ, điều khiển quay lại vòng lặp trong một lần nữa và giá trị của another_number lại được khởi tạo thành số nguyên tiếp theo, sau đó in câu lệnh bên trong hàm print().

Quy trình nói trên tiếp tục cho đến khi điều khiển đã đi hết cuối của hàm range(), trong trường hợp này là 5, rồi điều khiển quay trở lại vòng lặp ngoài cùng, khởi tạo biến number thành số nguyên tiếp theo, in câu lệnh trong hàm print(), vào vòng lặp trong và lặp lại tất cả các bước trên cho đến khi hàm range() được đi hết.

Hành trình điều khiển di chuyển từ vòng lặp ngoài cùng, đi qua vòng lặp trong rồi quay lại vòng lặp for ngoài tiếp tục cho đến khi điều khiển bao trùm toàn bộ phạm vi, là 3 lần trong trường hợp của bạn.

Giờ bạn đã đọc phần giải thích về vòng lặp lồng nhau, đã đến lúc tự bắt tay vào làm! Viết một chương trình Python để tạo mẫu sau, sử dụng vòng lặp for lồng nhau: loops Python

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgSW5pdGlhbGl6ZSB0aGUgZmlyc3QgZml2ZSByb3dzXG5uID0gX1xuXG4jIFN0YXJ0IHRoZSBsb29wIHRvIHByaW50IHRoZSBmaXJzdCBmaXZlIHJvd3NcbmZvciBpIG4gcmFuZ2UoXyk6XG4gICAgZm9yIGogaW4gcmFuZ2UoaSk6XG4gICAgICAgIHByaW50KCcqICcsIGVuZD1cIlwiKVxuICAgIHByaW50KCcnKVxuXG4jIFN0YXJ0IHRoZSBsb29wIHRvIHByaW50IHRoZSByZW1haW5pbmcgcm93cyBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHN0YXJzXG5mb3IgaSBpbiByYW5nZShuLDAsLTEpOlxuICAgIGZvciBqIGluIHJhbmdlKF8pOlxuICAgICAgICBwcmludCgnKiAnLCBlbmQ9XCJcIilcbiAgICBwcmludCgnJylIiwic29sdXRpb24iOiIjIEluaXRpYWxpemUgdGhlIGZpcnN0IGZpdmUgcm93c1xubiA9IDVcblxuIyBTdGFydCB0aGUgbG9vcCB0byBwcmludCB0aGUgZmlyc3QgZml2ZSByb3dzXG5mb3IgaSBpbiByYW5nZShuKTpcbiAgICBmb3IgaiBpbiByYW5nZShpKTpcbiAgICAgICAgcHJpbnQoJyogJywgZW5kPVwiXCIpXG4gICAgcHJpbnQoJycpXG5cbiMgU3RhcnQgdGhlIGxvb3AgdG8gcHJpbnQgdGhlIHJlbWFpbmluZyByb3dzIGluIGRlY3JlYXNpbmcgb3JkZXIgb2Ygc3RhcnNcbmZvciBpIG4gcmFuZ2UobiwwLC0xKTo\nICAgIGZvciBqIGluIHJhbmdlKGkpOlxuICAgICAgICBwcmludCgnKiAnLCBlbmQ9XCJcIilcbiAgICBwcmludCgnJylIiwic2N0IjoiRXgoKS5oYXNfZXF1YWxfYXN0KFwiSW5pdGlhbGl6ZSB0aGUgdmFsdWUgb2YgYG5gIGF0IDUhXCIsIGNvZGU9XCJuID0gNVwiLCBleGFjdD1GYWxzZSlcblxuRXgoKS5jaGVja19mb3JfbG9vcCgwKS5jaGVja19pdGVyKCkuaGFzX2VxdWFsX2FzdChcInJhbmdlKG4pXCIpXG5FeCgpLmNoZWNrX2Zvcl9sb29wKDApLmNoZWNrX2JvZHkoKS5jaGVja19mb3JfbG9vcCgwKS5jaGVja19pdGVyKCkuaGFzX2VxdWFsX2FzdChcInJhbmdlKGkpXCIpXG5FeCgpLmNoZWNrX2Zvcl9sb29wKDApLmNoZWNrX2JvZHkoKS5jaGVja19mb3JfbG9vcCgwKS5jaGVja19pdGVyKCkuaGFzX2VxdWFsX2FzdChcInByaW50ICgnKiAnLCBlbmQ9XFxcIlxcXCIpXCIpXG5FeCgpLmNoZWNrX2Zvcl9sb29wKDApLmNoZWNrX2JvZHkoKS50ZXN0X2Z1bmN0aW9uKFwicHJpbnRcIiwgMSlcblxuRXgoKS5jaGVja19mb3JfbG9vcCgxKS5jaGVja19pdGVyKCkuaGFzX2VxdWFsX2FzdChcInJhbmdlKG4sMCwtMSlcIilcbkV4KCkuY2hlY2tfZm9yX2xvb3AoMSkuY2hlY2tfYm9keSgpLmNoZWNrX2Zvcl9sb29wKDApLmNoZWNrX2l0ZXIoKS5oYXNfZXF1YWxfYXN0KFwicmFuZ2UoaSlcIilcbkV4KCkuY2hlY2tfZm9yX2xvb3AoMSkuY2hlY2tfYm9keSgpLmNoZWNrX2Zvcl9sb29wKDApLmNoZWNrX2l0ZXIoKS5oYXNfZXF1YWxfYXN0KFwicHJpbnQgKCcqICcsIGVuZD1cXFwiXFxcIilcIilcbkV4KCkuY2hlY2tfZm9yX2xvb3AoMSkuY2hlY2tfYm9keSgpLnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCAxKSJ9

breakcontinue: Tạo Vòng lặp Vô hạn

Bạn có thể dùng breakcontinue trong bất kỳ vòng lặp nào bạn tạo. Các từ khóa này không chỉ giới hạn cho việc phá vỡ các vòng lặp vô hạn cố ý, nhưng nên dùng cẩn thận. Cả hai khiến người khác — kể cả chính bạn vài tháng sau khi xem lại mã — khó hiểu luồng điều khiển trong vòng lặp và nơi điều kiện kết thúc. Thêm nữa, bạn không cần dùng breakcontinue: như bạn đã thấy đến giờ, bạn vẫn làm rất tốt mà không cần chúng!

Tuy nhiên, trong một số trường hợp, viết các vòng lặp vô hạn có chủ đích có thể rõ ràng hơn so với các vòng lặp for và while truyền thống mà bạn đã thấy. Dĩ nhiên, trong những trường hợp đó, việc dùng các từ khóa này là được khuyến khích!

Ngắt và Bỏ qua trong Vòng lặp While bằng Python

May mắn là có cách thoát khỏi tình huống vòng lặp vô hạn ở trên, đó là dùng từ khóa break.

# Take user input
number = 2 

# Condition of the while loop
while number < 5 :  
    # condition of the nested while loop
    while number % 2 == 0:  
        print("The number "+str(number)+" is even")
        break

    number+=1

Khi chạy mã trên, nó sẽ không rơi vào vòng lặp vô hạn nữa.

"Phép thuật gì đây!" bạn kêu lên. - Bình tĩnh, không có phép thuật nào cả.

Khi điều khiển gặp từ khóa break, nó hiểu rằng cần thoát khỏi vòng lặp (trong trường hợp này là vòng lặp trong) và thực thi dòng mã tiếp theo. Do đó, nó thoát khỏi vòng lặp while bên trong và quay lại vòng lặp ngoài, tiếp tục công việc thường lệ cho đến khi điều kiện trong vòng lặp while ngoài còn đúng.

Bạn nên lưu ý rằng phải có một dòng mã tồn tại sau từ khóa break nếu không nó sẽ không có tác dụng. Hãy thử xóa dòng mã sau từ khóa break trong ví dụ trên rồi chạy lại.

Nếu bạn chèn từ khóa continue sau câu lệnh break thì sao? Hãy xem đoạn mã dưới đây:

number = 2 

while number < 5 :
    while number % 2 == 0: 
        print("The number "+str(number)+" is even")
        break

    continue

    number+=1

Mã trên là phiên bản được sửa đôi chút của ví dụ từ khóa break.

Khi chạy mã trên bạn sẽ lại gặp vòng lặp vô hạn. Trước khi bứt tóc vì bực bội, hãy nhìn kỹ. Bạn sẽ thấy có từ khóa continue sau break. Từ khóa continue chuyển điều khiển quay lại vòng lặp ngoài cùng trước cả khi biến number được tăng lên và vì thế mã rơi vào vòng lặp vô hạn.

Ngắt và Bỏ qua trong Vòng lặp For

Nếu bạn không muốn thực thi vòng lặp for bên trong trong ví dụ trên cho toàn bộ phạm vi thì sao? Bạn có thể dùng câu lệnh break tương tự như trong trường hợp vòng lặp while.

# Print the below statement 3 times
for number in range(3) : 
    print("-------------------------------------------")
    print("I am outer loop iteration "+str(number))
    for another_number in range(3):
        print("****************************")
        print("I am inner loop iteration "+str(another_number))
        break

Trong ví dụ trên, từ khóa break sau vòng lặp trong chỉ đạo điều khiển thoát khỏi vòng lặp trong, sau đó điều khiển quay về vòng lặp ngoài.

Chạy ví dụ dưới đây:

# Print the below statement 3 times
for number in range(3) :  
    print("-------------------------------------------")
    print("I am outer loop iteration "+str(number))
    continue
    for another_number in range(3):
        print("****************************")
        print("I am inner loop iteration "+str(another_number))
        break

Trong mã trên chỉ vòng lặp ngoài cùng được thực thi và điều khiển thậm chí không chạm vào vòng lặp trong.

"Tại sao?" bạn hỏi.

Hãy nhìn kỹ mã. Có một từ khóa continue ngay sau câu lệnh in thứ hai trong vòng lặp ngoài cùng. Nó chỉ đạo điều khiển nhảy về vòng lặp for ngoài và bắt đầu lại, vì thế điều khiển không bao giờ chạm vào vòng lặp trong.

Không giống vòng lặp while, bạn không cần một đoạn mã sau từ khóa break trong vòng lặp for. Một câu lệnh break đơn lẻ vẫn hoạt động tốt bên trong vòng lặp for.

range() so với xrange()

Hai hàm này giống nhau, nhưng nếu bạn dùng Python 3, bạn chỉ có hàm range(). Trong Python 3.x, hàm xrange() được đổi tên thành range(). Nghĩa là nếu bạn cố dùng hàm xrange() với Python 3, bạn sẽ nhận lỗi NameError: name 'xrange' is not defined.

Để hiểu hai hàm này giống nhau như thế nào, hãy xem ví dụ sau:

# Print the below statement 3 times
for number in range(5,10,2) :  
    print("I am number : "+str(number))

# I am number : 5
# I am number : 7
# I am number : 9

Khi chạy mã trên, bạn sẽ thấy giá trị của biến number được bỏ qua theo bước 2, và đó là do các tham số trong hàm range().

Tham số đầu tiên trong hàm này là điểm bắt đầu. Đó là nơi điều khiển bắt đầu đếm. Tham số thứ hai là điểm dừng, nơi điều khiển phải dừng lại và tham số cuối là bước nhảy, xác định bước mà điều khiển phải nhảy khi đếm.

Vì vậy, trong trường hợp trên, điều khiển bắt đầu từ 5 rồi đi qua vòng lặp đến 9, mỗi lần cộng thêm 2. Tức là 5, 5+2=7, 7+2=9.

Bạn đã học cách hàm range() được dùng để xác định số lần mã của bạn phải lặp. Giờ, trong Python 2.x, bạn sẽ thấy còn một cách nữa là dùng hàm xrange(). Chạy mã dưới đây:

# Print the below statement 3 times
for number in xrange(10) :  
    print("I am number : "+str(number))
I am number : 0
I am number : 1
I am number : 2
I am number : 3
I am number : 4
I am number : 5
I am number : 6
I am number : 7
I am number : 8
I am number : 9

Bạn thấy có gì khác trong đầu ra của mã trên so với đầu ra của mã không dùng xrange() không? Không có gì khác?

Đúng vậy. Bạn sẽ không thấy khác biệt nào trong đầu ra của mã.

Vậy tại sao nên dùng hàm xrange()? Bạn sẽ biết ở phần sau của hướng dẫn. Trước tiên hãy chạy mã dưới đây:

print(xrange(10))
print(range(10))
xrange(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bạn có thể thấy trong đầu ra ở trên, có sự khác biệt giữa hai câu lệnh in. Ở câu lệnh in chứa hàm xrange(), bạn nhận được đối tượng hàm xrange() được in ra. Điều này khác với câu lệnh in có hàm range(): ở đó, bạn nhận được một danh sách các số nguyên từ 0 đến 9.

Đây chính là khác biệt giữa hàm range() và hàm xrange().

Khi bạn dùng hàm range(), một danh sách của toàn bộ phạm vi được lưu trong RAM và hiển thị cho bạn. Tuy nhiên, khi bạn dùng hàm xrange(), danh sách không được lưu trong bộ nhớ. Thay vào đó, hàm xrange() tạo ra các số nguyên trong toàn bộ phạm vi khi bạn cần. Bằng cách này, hàm xrange() giúp tiết kiệm bộ nhớ trên các hệ thống hạn chế tài nguyên.

Trau dồi Kỹ năng Python!

Chúc mừng, bạn đã đến cuối hướng dẫn này. Giờ bạn đã biết cách dùng vòng lặp trong Python, hãy tiếp tục luyện tập. Càng luyện tập nhiều, bạn sẽ càng giỏi!

Chủ đề

Khóa học Python liên quan

Courses

Nhập môn Python

4 giờ
6.9M
Nắm vững phân tích dữ liệu với Python chỉ trong 4 giờ. Khóa học online này giúp bạn làm quen với giao diện Python và các thư viện phổ biến.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow