AI Cho Mọi Người

AI Cho Mọi Người

Vòng lặp for và while

Vòng lặp for

Vòng lặp for trong Python cho phép chúng ta thực thi một khối code nhiều lần hay duyệt các phần tử một iterable. Cú pháp của vòng lặp for như sau

trong đó iterable có thể là list, range, hay file.

Ví dụ, đoạn code sau thực thi khối code trong for 5 lần.

# dùng hàm range để tạo một iterable có giá trị 0,1,2,3,4

for i in range(5):
    print('Hello AI VIETNAM')
  
    # chúng ta có thể sử dụng giá trị i trong mỗi vòng lặp
    print('Giá trị hiện tại của i là:', i)

 

Kết quả

Hello AI VIETNAM
Giá trị hiện tại của i là: 0
Hello AI VIETNAM
Giá trị hiện tại của i là: 1
Hello AI VIETNAM
Giá trị hiện tại của i là: 2
Hello AI VIETNAM
Giá trị hiện tại của i là: 3
Hello AI VIETNAM
Giá trị hiện tại của i là: 4

 

Nếu chúng ta không qua tâm đến giá trị của biến i, chúng ta có thể dùng ký tự _ trong for như sau

# dùng hàm range để tạo một iterable có giá trị 0,1,2,3,4

for _ in range(5):
    print('Hello AI VIETNAM')
    print('làm gì đó ...')

 

Kết quả

Hello AI VIETNAM
làm gì đó ...
Hello AI VIETNAM
làm gì đó ...
Hello AI VIETNAM
làm gì đó ...
Hello AI VIETNAM
làm gì đó ...
Hello AI VIETNAM
làm gì đó ...

 

Chúng ta có thể sử dụng từ khóa break để thoát khỏi vòng lặp for. Từ khóa break thường được dùng kết hợp với điều kiện if. Ví dụ sau duyệt các phần tử của một iterable, và khi gặp phần tử có giá trị là 5 thì chương trình sẽ thoát vòng lặp for.

# duyệt phần tử trong range(10)
for i in range(10):
    # hỏi phần tử i có bằng 5 không?
    if i == 5:
        # nếu bằng thì thoát vòng lặp for này
        break
    
    # làm gì đó với i    
    print('Giá trị i là', i)

 

Kết quả

Giá trị i là 0
Giá trị i là 1
Giá trị i là 2
Giá trị i là 3
Giá trị i là 4

 

Một từ khóa khác cũng được dùng phổ biến trong các vòng lặp là từ khóa continue. Khi đang thực thi khối code k trong vòng lặp for và gặp từ khóa này, chương trình sẽ không thực thi phần code còn lại (phần code chưa thực thi) của k mà quay lại phần biểu thức for. Vi dụ sau duyệt các phần tử trong một iterable và khi phần tử có giá trị là 5, từ khóa continue sẽ được gọi.

# duyệt phần tử trong range(10)
for i in range(10):
    # hỏi phần tử i có bằng 5 không?
    if i == 5:
        # nếu bằng thì gọi continue
        # phần code sau continue sẽ không  
        # được thực thì trong lần lặp này
        continue

    # làm gì đó với i
    print('Giá trị i là', i)

 

Kết quả

Giá trị i là 0
Giá trị i là 1
Giá trị i là 2
Giá trị i là 3
Giá trị i là 4
Giá trị i là 6
Giá trị i là 7
Giá trị i là 8
Giá trị i là 9

 

Chúng ta thấy rằng khi biến i có giá trị là 5, từ khóa continue được gọi và phần code print('Giá trị i là', i) không được thực thi. Do đó, giá trị i = 5 không được in ra.

Mô phỏng búng đồng xu

Chúng ta sẽ mô phỏng việc búng đồng tiền xu để hiểu hơn về hàm random.random(). Đồng tiền xu có 2 mặt, mặt trước và mặt sau. Chương trình được yêu cầu đếm số lần xuất hiện của mặt trước và mặt sau cho 1000 lần thử.

Chúng ta sẽ dùng vòng lặp for, mỗi lần lặp, chương trình sẽ tạo ra 1 số ngẫu nhiên n nằm trong khoảng 0 và 1 bằng hàm random.random(). Mặt sau xuất hiện khi n < 0.5, và ngược lại, mặt trước xuất hiện. Sau 1000 lần thử, in số lần xuất hiện mặt trước và mặt sau.

Thảo luận

1) Hàm random.random() sinh ra số ngẫu n có phân bố đều (uniform distribution) trong khoảng `[0,1)` (không bao gồm số 1).

2) Mặt sau xuất hiện khi n < 0.5. Điều này đồng nghĩa với việc miền giá trị cho việc mặt sau xuất hiện là một đoạn [0, 0.5). Lập luận tương tự, miền giá trị cho việc mặt trước xuất hiện[0.5, 1).

3) Theo xác suất, khi số lần thử đủ lớn thì số lần xuất hiện mặt trước và mặt sau sẽ xấp xỉ bằng nhau vì miền giá trị của 2 trường hợp bằng nhau.

 

Trước khi xem phần code mẫu bên dưới, các bạn nên tự cài trước bài toán này.

 

Phần code mẫu

# aivietnam.ai
import random

# Tổng số lần búng đồng xu
total_flips = 0  

# số lần mặt sau xuất hiện
num_tails = 0

# số lần mặt trước xuất hiện
num_heads = 0

for _ in range(1000):
    # sinh số ngẫu nhiên nằm trong khoảng [0,1)
    n = random.random()
    if n < 0.5:
        num_tails = num_tails + 1
    else:
        num_heads = num_heads + 1
    
    # code ở vị trí này không thuộc khối else    
    total_flips = total_flips + 1
    
# code ở ví trị này không thuộc khối code cho for
# vòng lặp for đã thực hiên xong
print('total_flips: %d' % total_flips)
print('num_tails: %d' % num_tails)
print('num_heads: %d' % num_heads)

 

Kết quả

total_flips: 1000
num_tails: 525
num_heads: 475

 

Bài tập 1: Các bạn làm bài tương tự với con xúc xắc. Con xúc xắc có 6 mặt (mặt số 1 đến số 6). Viết chương trình mô phỏng ném con xúc xắc 10000 lần và đếm số lần xuất hiện của mỗi mặt.

Bài tập 2:
Các bạn làm lại bài mô phỏng búng đồng xu với điều kiện cho trước là khả năng xuất hiện của mặt trước là khoảng 70% và khả năng xuất hiện của mặt sau là khoảng 30%.

 

Vòng lặp while

Vòng lặp while có cú pháp như sau

 

Ví dụ chúng ta muốn dùng while để thực thi một đoạn code 5 lần

# tạo biến i
i = 0

# bắt đầu vòng lặp while
while i<5:
    print('Làm gì đó ...')
    i = i + 1
print('Phần code này khi đã thoát while')
  • Ban đầu biến i được khởi tạo bằng 0.
  • Khi vào vòng lặp while, điều kiện i < 5 được kiểm tra. Lúc này, i = 0 nên biểu thức i < 5 (tức 0 < 5) trả về True, và phần code trong while được thực hiện. Cụ thể, string ‘làm gì đó …’ được in ra và i được gán giá trị mới là 1.
  • Sau khi phần code trong while thực thi xong, điều kiện i < 5 được kiểm tra. Lúc này, i = 1 nên biểu thức i < 5 (tức 1 < 5) trả về True, và phần code trong while được thực hiện (string ‘làm gì đó …’ được in ra và i được gán giá trị mới là 2.)
  • …. string ‘làm gì đó …’ được in ra và i được gán giá trị mới là 5.
  • Sau đó, điều kiện i < 5 được kiểm tra. Lúc này, i = 5 nên biểu thức i < 5 (tức 5 < 5) trả về False, và thoát vòng lặp while. Chương trình tiếp tục thực thi phần code bên ngoài, sau while.

Quá trình thực thi có thể biểu diễn bằng flowchart như sau

 

Kết quả

Làm gì đó ...
Làm gì đó ...
Làm gì đó ...
Làm gì đó ...
Làm gì đó ...
Phần code này khi đã thoát while

 

Câu hỏi nhanh: Điều gì xảy ra khi bỏ dòng code i = i + 1 trong while?

Dùng while-True-break

Thỉnh thoảng chúng ta cần chạy lặp một đoạn code cho đến khi nào một sự kiện xảy ra thì dừng lại. Ví dụ, chương trình sau lặp lại việc sinh ra một số nguyên, ngẫu nhiên nằm trong đoạn [0, 10]. Vòng lặp dừng lại khi số ngẫu nhiên sinh ra là số 5.

import random

# cho vòng lặp chạy vô tận
while True:
    # sinh số ngẫu nhiêu
    num = random.randint(0,10)
    print('Số sinh ra có giá trị là', num)
    
    # kiểm tra num có bằng 5 hay không?
    if num == 5:
        # nếu có thì thoát khỏi while
        break;
print('Đã thoát khỏi while')

 

Kết quả

Số sinh ra có giá trị là 4
Số sinh ra có giá trị là 3
Số sinh ra có giá trị là 8
Số sinh ra có giá trị là 1
Số sinh ra có giá trị là 0
Số sinh ra có giá trị là 5
Đã thoát khỏi while

 

Khi dùng vòng lặp while, các bạn cần để ý đến điều kiện thoát  vòng lặp. Đây là lỗi khá phổ biến nên các bạn cần chú ý.

 

Bài tập: Viết chương trình sinh ra 1 số nguyên, ngẫu nhiên n nằm trong đoạn [0, 10] và n khác 5.