Các cấu trúc lặp trong Python: for và while

    1

    Các cấu trúc lặp trong Python bao gồm hai loại: lặp với số bước xác định trước (for) và lặp với số bước không xác định (while). Nhìn chung hai cấu trúc lặp trong Python tương đối gần gũi với các cấu trúc lặp trong C hay C#.

    Cấu trúc lặp while

    Hãy xem ví dụ sau:

    word = ''
    while(word.lower() != 'close'):
    	word = input('Enter a word: ')
    	print(f'You have typed "{word}"')
    

    Trong ví dụ này chúng ta liên tục yêu cầu người dùng nhập vào một từ. Nếu người dùng nhập từ ‘close’ thì sẽ kết thúc vòng lặp (và kết thúc chương trình). Nếu người dùng nhập từ khác thì sẽ yêu cầu nhập lại.

    Chúng ta không biết khi nào người dùng sẽ nhập ‘close’, và cũng có thể là không bao giờ. Vì vậy, vòng lặp while được gọi là vòng lặp với số bước không xác định trước.

    Biến word đóng vai trò là biến điều khiển cho biểu thức điều kiện.

    Hãy xem một ví dụ khác:

    # tính tổng các số từ 1 đến 99
    sum = 0
    i = 1
    while i < 100:
    	sum += i
    	i += 1
    print(sum)

    Trong ví dụ này chúng ta tính tổng các số từ 1 đến 99. Để thực hiện việc này chúng ta sử dụng một biến i với vai trò biến đếm. Biến i ban đầu nhận giá trị 1. Qua mỗi vòng lặp i sẽ tăng thêm 1 đơn vị, và biến sum sẽ cộng thêm giá trị bằng i. Quá trình này sẽ lặp đi lặp lại chừng nào i vẫn nhỏ hơn 100. Đến khi i đạt giá trị 100 thì vòng lặp kết thúc.

    Cấu trúc while của Python là một lệnh phức hợp với một mệnh đề. Trong đó, header là while <biểu thức logic>:. Biểu thức logic là loại biểu thức mà kết quả trả về thuộc kiểu bool (giá trị True hoặc False). Trong các ví dụ trên, biểu thức logic là i < 100char.lower() != 'close'.

    Chừng nào biểu thức logic còn nhận giá trị True thì sẽ thực hiện danh sách lệnh ở phần suite.

    Để tránh tạo thành vòng lặp vô tận, bên trong danh sách lệnh của vòng lặp while phải có lệnh có tác dụng làm thay đổi giá trị của biểu thức logic.

    Trong ví dụ thứ nhất, chúng ta liên tục yêu cầu người dùng nhập vào giá trị mới cho biến char. Điều này đảm bảo khả năng thoát khỏi vòng lặp.

    Trong ví dụ thứ hai, chúng ta làm biến đổi giá trị của i qua mỗi vòng lặp (tăng thêm 1 đơn vị). Điều này đảm bảo đến một lúc nào đó i sẽ có giá trị lớn hơn 100 và kết thúc vòng lặp.

    Cấu trúc lặp for

    Hãy xem các ví dụ sau

    # in ra các số trong phạm vi từ 1 đến 100
    for n in range(100):	
    	print(n + 1, end = '\t')
    # in ra các số trong phạm vi từ 100 đến 199
    for n in range(100, 200):
    	print(n, end = '\t')
    # in ra các số lẻ trong phạm vi từ 1 đến 99
    for n in range(1, 100, 2):
    	print(n, end = '\t')

    Cấu trúc for cho phép lặp lại việc thực hiện khối code theo một số lần xác định sẵn từ đầu.

    Cấu trúc for cũng là một lệnh phức hợp với một clause (khác với cấu trúc rẽ nhánh if có nhiều clause) trong đó header có dạng for <biến chạy> in range():. Suite trong các ví dụ trên chỉ chứa một hàm print().

    Số lần lặp và cách thức lặp được tạo ra bởi hàm range().

    Hàm range() trả về một biến chứa một dãy các giá trị nằm trong một khoảng xác định theo quy luật. Hàm này có 3 dạng:

    1. range(stop): nhận 1 tham số là giá trị cuối của dãy và trả về dãy số [0, stop – 1]. Ví dụ range(5) sẽ trả lại dãy số 0, 1, 2, 3, 4. Bước nhảy giữa các giá trị kế tiếp là 1.
    2. range(start, stop): nhận 2 tham số là giá trị đầu và cuối của dãy, trả về dãy [start, stop-1]. Ví dụ, range(1, 5) sẽ trả lại dãy số 1, 2, 3, 4 (bước nhảy giữa các giá trị kế tiếp là 1).
    3. range(start, stop, step): tương tự như trường hợp 2 nhưng bước nhảy được xác định bởi biến step. Ví dụ, range(1, 10, 2) sẽ trả lại dãy 1, 3, 5, 7, 9 (bước nhảy giữa các giá trị kế tiếp là 2).

    Trong hàm range, start, stop và step có thể nhận cả giá trị âm và dương:

    • Nếu step nhận giá trị âm (và start > stop) sẽ tạo ra dãy giảm dần. Ví dụ range(0, -5, -1) sẽ tạo ra dãy 0, -1, -2, -3, -4.
    • Nếu stop < start và step dương, hoặc stop > start và step âm, sẽ tạo ra chuỗi trống (không có giá trị nào). Ví dụ, range(2, -3, 1) và range(2, 3, -1) đều không tạo ra phần tử nào.

    Với danh sách giá trị mà hàm range() tạo ra như trên, cấu trúc for sẽ lần lượt lấy từng giá trị gán cho biến chạy (biến n trong các ví dụ trên) và thực hiện khối lệnh. Như vậy, số lần lặp đã xác định sẵn từ lúc gọi hàm range().

    Sử dụng vòng lặp for với các kiểu danh sách khác

    Ở trên chúng ta sử dụng for với các giá trị lấy từ danh sách tạo ra bởi hàm range(). Trong Python, nhiều loại dữ liệu tập hợp có thể sử dụng cùng vòng for.

    Ví dụ:

    for c in 'Hello world':
    	print(c, end = '\t')

    Trong ví dụ trên danh sách giá trị lại là xâu ký tự ‘Hello world’. Biến chạy sẽ lần lượt nhận từng ký tự từ xâu, bắt đầu từ ký tự đầu tiên ‘H’ đến ký tự cuối cùng ‘d’. Trong ví dụ trên chúng ta chỉ đơn giản là in ký tự tương ứng ra console.

    Hãy xem một ví dụ khác:

    companies = ['Apple', 'Google', 'Microsoft', 'Huawei', 'Yandex', 'Facebook']
    for c in companies:
    	print(c)

    Trong ví dụ trên, companies là một biến kiểu danh sách (list). Kiểu dữ liệu này chúng ta chưa học nhưng bạn có thể hình dung nó tương tự như kiểu mảng của C. Biến kiểu list cũng có thể trở thành danh sách dữ liệu cho vòng lặp for. Khi này biến chạy c sẽ lần lượt nhận các giá trị trong danh sách theo thứ tự.

    Một ví dụ khác:

    # tính tổng các số dương từ một tuple
    total = 0
    for num in (-22.0, 3.5, 8.1, -10, 0.5):
        if num > 0:
            total = total + num

    Trong ví dụ này bạn tính tổng các số dương từ một tuple. Tuple cũng là một kiểu dữ liệu tập hợp mà chúng ta sẽ học chi tiết sau.

    Không phải kiểu dữ liệu tập hợp nào cũng có thể làm danh sách lặp cho vòng for. Những kiểu dữ liệu sử dụng được cho vòng for được gọi là các kiểu iterable.

    Điều khiển vòng lặp, break và continue

    Khi làm việc với vòng lặp có thể xuất hiện hai tình huống:

    (1) Bạn muốn kết thúc vòng lặp sớm hơn dự định hoặc theo điều kiện. Lấy ví dụ, bạn cầm một danh sách khách hàng và muốn tìm tên một khách trong đó. Bạn xem lần lượt từng tên từ đầu danh sách. Nếu gặp tên khách hàng cần tìm, bạn sẽ dừng lại chứ không tiếp tục xem đến hết danh sách nữa. Ở đây bạn phá vỡ hoàn toàn vòng lặp.

    (2) Bạn muốn bỏ qua một chu kỳ trong vòng lặp để bắt đầu chu kỳ tiếp theo. Lấy ví dụ, bạn dự định chơi 10 ván bài. Ở ván thứ 3 bài xấu quá, bạn quyết định bỏ cuộc để chờ chơi ván tiếp theo. Ở đây bạn không dừng hoàn toàn vòng lặp mà chỉ bỏ không làm những việc nhẽ ra phải làm trong chu kỳ đó và khởi động một chu kỳ mới.

    Hai tình huống này được Python giải quyết bằng hai lệnh tương ứng: break (phá vỡ vòng lặp, kết thúc sớm) và continue (bỏ qua chu kỳ hiện tại, bắt đầu một chu kỳ lặp mới). Cả hai loại vòng lặp (for, while) đều có thể sử dụng break và continue.

    Ví dụ với break:

    # breaking out of a loop early
    for item in [1, 2, 3, 4, 5]:
        if item == 3:
            print(item, " ...break!")
            break
        print(item, " ...next iteration")

    Ví dụ này cho ra kết quả như sau:

    1  ...next iteration
    2  ...next iteration
    3  ...break!
    # demonstrating a `continue` statement in a loop
    x = 1
    while x < 4:
        print("x = ", x, ">> enter loop-body <<")
        if x == 2:
            print("x = ", x, " continue...back to the top of the loop!")
            x += 1
            continue
        x += 1
        print("--reached end of loop-body--")

    Ví dụ này cho ra kết quả như sau:

    x =  1 >> enter loop-body <<
    --reached end of loop-body--
    x =  2 >> enter loop-body <<
    x =  2  continue...back to the top of the loop!
    x =  3 >> enter loop-body <<
    --reached end of loop-body--

    Kết luận

    Trong bài học này chúng ta đã xem xét cách sử dụng vòng lặp trong Python, bao gồm vòng lặp for và vòng lặp while. Chúng ta cũng học về cách điều khiển vòng lặp với break và continue.

    Có thể nhận xét rằng vòng lặp trong Python không có nhiều khác biệt với vòng lặp ở các ngôn ngữ khác. Đặc biệt, từ khóa break và continue cơ bản là giống hệt như trong C. Vòng lặp for của Python rất gần gũi với vòng lặp for của C và foreach của C#.

    + Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
    + Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
    + Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
    Cảm ơn bạn!

    Theo dõi
    Thông báo của
    guest

    1 Thảo luận
    Cũ nhất
    Mới nhất
    Phản hồi nội tuyến
    Xem tất cả bình luận
    minh

    hay quá ạ