Dừng lại, bạn đang sử dụng While trong Python sai cách đấy !

Vòng lặp while trong Python là syntax cơ bản được sử dụng để thực thi lặp lại một khối code miễn là điều kiện nhất định là đúng. Tính năng này đặc biệt hữu ích khi không biết số lần lặp cần thiết trước khi vòng lặp bắt đầu, giúp nó phù hợp với các tình huống mà bạn cần lặp lại cho đến khi một điều kiện nhất định thay đổi, điều này có thể không thể đoán trước được.

Cú pháp cơ bản của while thì chắc ai cũng biết như sau:

while condition:
    # Đoạn code cần chạy lặp lại
    # Đoạn lệnh thay đổi điều kiện nếu cần thiết

Ở đây, điều kiện là một biểu thức Boolean mà vòng lặp while sẽ đánh giá trước mỗi lần lặp. Nếu điều kiện là True, phần thân vòng lặp (phần code bên dưới while) sẽ được thực thi. Sau mỗi lần lặp lại, điều kiện sẽ được đánh giá lại. Vòng lặp tiếp tục chạy cho đến khi điều kiện được đánh giá là False.

Sai lầm khi sử dụng while

Hãy cùng xem 1 ví dụ cơ bản khi sử dụng while mà chúng ta thường làm nhé.

# Khai báo biến đếm
count = 0

# Tiếp tục lặp lại chừng nào biến đếm còn nhỏ hơn 5
while count < 5:
    print("Count is:", count)
    # Tăng biến đếm lên để tránh vòng lặp vô hạn
    count += 1

Trong ví dụ này, vòng while sẽ in ra giá trị hiện tại của biến countvà sau đó tăng giá trị của count thêm 1. Vòng lặp sẽ chạy cho tới khi countbằng 5, và khi đó điều kiện count < 5 trở thành False và vòng lặp dừng lại.

Tại sao việc sử dụng loop như ở trên là sai lầm?

  1. Vòng lặp vô hạn : Nếu điều kiện không bao giờ trở thànhFalse, vòng lặp while sẽ tiếp tục vô tận, dẫn đến vòng lặp vô hạn. Để ngăn chặn điều này, bạn phải đảm bảo rằng code bên trong vòng lặp sửa đổi các biến liên quan đến điều kiện (ở ví dụ trên là count) theo cách mà điều kiện sẽ là False để kết thúc vòng lặp. Và nhiều khi bạn không thể đảm bảo điều này sẽ chắc chắn xảy ra mà không rơi vào trường hợp ngoại lệ nào.
  2. Đoạn code sai ở trên không có lệnh điều khiển vòng lặp: Python hỗ trợ một số câu lệnh điều khiển vòng lặp như:
    break: Thoát khỏi vòng lặp ngay lập tức, bất kể điều kiện gì.
    continue: Bỏ qua phần còn lại của code bên trong vòng lặp đối với lần lặp hiện tại và quay lại để kiểm tra điều kiện và có thể thực hiện lại vòng lặp.
    else: Một tính năng ít được sử dụng hơn với các vòng lặp, khối else chạy sau khi vòng lặp kết thúc một cách bình thường (tức là không nhấn vào câu lệnh break).

Cách đúng để viết vòng lặp

count = 0
while True:
    
    if count == 5:
        continue  # Nếu đếm đến 5, chúng ta skip
    if count < 5:
        break

    count += 1
    print("Count is:", count)

Trong ví dụ nâng cao này, khi số count bằng 5, câu lệnh continue làm cho vòng lặp bỏ qua việc in số 5 và chuyển thẳng sang lần lặp tiếp theo. Khi số đếm đạt tới 6, câu lệnh break sẽ dừng vòng lặp hoàn toàn.

Cách tiếp cận khác là sử dụng cờ (flag) để thay đổi/kiểm soát điều kiện while:

count = 0
run = True
while run:

    run = check_count(run)

    count += 1
    print("Count is:", count)

Đó là một ví dụ đơn giản kết hợp vòng lặp while bằng cách sử dụng cờ (flag) để xác định xem vòng lặp có tiếp tục thực thi hay không. Đây là bản phân tích phần code trên và lý do tại sao đây là cách tiếp cận phù hợp trong các chương trình phức tạp với nhiều chức năng kiểm soát việc thực thi vòng lặp:

Khởi tạo biến:

  • count = 0: Khởi tạo biến đếm count thành 0.
  • run = True: Khởi tạo biến Boolean run thành True. Biến này đóng vai trò điều khiển sự tiếp tục của vòng lặp.

Vòng lặp while:

  • while run: Vòng lặp sẽ tiếp tục thực thi miễn là biến run vẫn bằng True.

Gọi hàm bên trong vòng lặp:

  • run = check_count(run): Bên trong vòng lặp, hàm check_count(run) được gọi với giá trị hiện tại của run làm đối số. Giá trị trả về của hàm này sau đó được gán lại để chạy. Đây là một thao tác quan trọng vì nó ngụ ý rằng hàm check_count đánh giá một số điều kiện và xác định xem vòng lặp nên tiếp tục hay dừng bằng cách trả về giá trị Boolean (True hoặc False). Đóng vai trò chuyển tiếp, cờ (flag) này rất có đóng góp rất quan trọng trong vòng lặp while và thay đổi trạng thái của nó khi cần thiết, nếu nó kết thúc ở trạng thái False, nó sẽ đảm bảo tất cả điều kiện cần thiết khi được đặt ở cuối chương trình.

Tại sao việc này lại phù hợp với cách chương trình phức tạp?

Trong các chương trình phức tạp, đặc biệt là các chương trình liên quan đến nhiều quy trình hoặc điều kiện có thể thay đổi theo thời gian, việc quản lý trạng thái của chương trình có thể là một thách thức lớn. Việc sử dụng biến run theo cách này mang lại một cách tập trung, linh hoạt để kiểm soát luồng thực thi dựa trên các điều kiện động. Dưới đây là một số lý do tại sao phương pháp này có lợi:

Sự kiểm soát tuyệt đối:

Việc thực thi vòng lặp phụ thuộc vào biến run, biến này có thể bị gán và ảnh hưởng bởi bất kỳ hàm nào như check_count. Điều này cho phép một điểm kiểm soát tập trung, giúp quản lý và hiểu cách dừng vòng lặp dễ dàng hơn.

Modul hóa:

Hàm check_count có thể bao gồm bất kỳ logic nào cần thiết để quyết định xem vòng lặp có nên tiếp tục hay không. Sự tách biệt các mối quan tâm này làm cho code trở nên modul hơn và dễ quản lý hơn. Logic điều khiển việc thực thi vòng lặp có thể được cập nhật hoặc sửa đổi độc lập với phần còn lại của code trong vòng lặp.

Khả năng thích ứng:

Bằng cách ủy quyền điều khiển vòng lặp cho một hàm, chương trình có thể thích ứng dễ dàng hơn với các thay đổi.

Ví dụ: nếu cần xem xét tiêu chí mới để dừng vòng lặp, bạn có thể cập nhật hàm check_count mà không thay đổi cấu trúc vòng lặp cốt lõi.

Dễ dàng tích hợp:

Cách tiếp cận này có thể dễ dàng tích hợp với các phần khác của một hệ thống code phức tạp.
Ví dụ: check_count có thể kiểm trạng thái chương trình, đầu vào của người dùng hoặc các điều kiện khác, và việc này không  hề dễ đánh giá trực tiếp trong cấu trúc vòng lặp.

Kịch bản ví dụ cho hàm check_count

Để các bạn có một cái nhìn tổng quan hơn, hãy tưởng tượng một tình huống trong đó check_count kiểm tra xem một tài nguyên nhất định có còn khả dụng hay không hoặc liệu tình trạng lỗi có phát sinh ở đâu đó trong chương trình hay không. Ví dụ trong phần code sau

def check_count(current_run_status):
    # Ví dụ điều kiện: dừng nếu số lần lặp đạt tới 10 hoặc một cờ lỗi được đặt lên.
    global error_flag  
    # Giả sử cờ này được quản lý ở một nơi khác trong chương trình.
    if count >= 10 or error_flag:
        return False
    return current_run_status

Bằng cách này, vòng lặp sẽ trở nên rất mạnh mẽ và phản hồi nhanh hơn, giúp nó phù hợp với các môi trường lập trình phức tạp, nơi các điều kiện để tiếp tục không chỉ phụ thuộc vào số lần lặp đơn giản mà còn có thể liên quan đến việc kiểm tra trạng thái toàn diện trên toàn hệ thống bằng biến error_flag.

Vòng lặp while trong Python là một công cụ mạnh mẽ để thực hiện các tác vụ lặp đi lặp lại dựa trên điều kiện động. Điều cần thiết là phải quản lý điều kiện vòng lặp và các lần lặp lại một cách cẩn thận để đảm bảo vòng lặp thực thi như dự định và kết thúc vào thời điểm thích hợp và tất nhiên tránh việc rơi vào vòng lặp vô hạn nữa.

Yeah, bài viết hôm nay tới đây thôi, hi vọng đã giúp các bạn có thêm một góc nhìn khác về cách sử dụng while. Việc sử dụng while khi đi làm khác hẳn so với các video Python basic trên Youtube hoặc khi đi học đại học đúng không nào?

Còn rất nhiều điều hay ho hơn đang chờ các bạn khám phá nữa, hãy đọc thêm các bài viết khác của tôi trên blog của Flinters nhé!

Ví dụ serier về Class bên dưới mà tôi mới hoàn thành 😉

https://labs.flinters.vn/python/toi-uu-hoa-class-trong-python-voi-class-method-p1/
https://labs.flinters.vn/python/toi-uu-hoa-class-trong-python-voi-class-method-p2/

Add a Comment

Scroll Up