Reportar esta app

Description

Trong một chương trình, bình thường các lệnh sẽ lần lượt được thực hiện theo thứ tự xuất hiện của nó trong file code. Nếu chỉ thực thi lệnh như vậy các chương trình sẽ rất hạn chế. Vì vậy người ta đưa vào các cấu trúc điều hiển có tác dụng làm tham đổi trật tự thực thi lệnh trong chương trình.

Ví dụ, bạn chỉ thực thi lệnh khi đáp ứng một điều kiện nào đó. Bạn cũng có thể muốn lặp đi lặp lại việc thực hiện một nhóm lệnh. Trường hợp thứ nhất người ta gọi là rẽ nhánh, trường hợp thứ hai gọi là vòng lặp.

Python có các cấu trúc điều khiển rẽ nhánh và các cấu trúc lặp tương tự như các ngôn ngữ khác. Trong bài học này chúng ta sẽ xem xét cách sử dụng cấu trúc lặp if-elif-else.

Chương trình minh họa

Tạo file equation.py và viết code như sau.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from math import sqrt # sử dụng hàm tính căn sqrt trong module math

print('--- EQUATION SOLVER ---')

a = float(input('a = '))
b = float(input('b = '))
c = float(input('c = '))

d = b*b - 4*a*c

if d >= :
    print('THERE ARE REAL SOLUTIONS:')
    x1 = (-b + sqrt(d))/(2*a)
    x2 = (-b - sqrt(d))/(2*a)
    print(f'x1 = {x1}')
    print(f'x2 = {x2}')
else:
    print('THERE ARE COMPLEX SOLUTIONS BUT I CANNOT SHOW YOU.')

input('\nThank you! Press enter to quit ...')

chạy script trên ở dạng chương trình console (click đúp vào file equation.py hoặc click phải -> open with-> Python) bạn thu được kết quả như sau:

Đây là một ví dụ đơn giản minh hoạt cách sử dụng cấu trúc rẽ nhánh if-else trong Python:


1
2
3
4
5
if d >= :
    print('THERE ARE REAL SOLUTIONS:')
    # code khác
else:
    print('THERE ARE COMPLEX SOLUTIONS BUT I CANNOT SHOW YOU.')

Cấu trúc rẽ nhánh if.

Cấu trúc rẽ nhánh quyết định xem những lệnh nào sẽ được thực hiện căn cức vào giá trị (kiểu bool) của một biểu thức điều kiện.

Như trong ví dụ trên, nếu d>= 0 ( biểu thức logic điều kiện) thì chúng ta tính nghiệm thực của phương trình và in ra kết quả. Nếu d<0 thì chỉ thông báo là có nghiệm phức nhưng không tính toán được ( vì hàm sqrt của Python không chấp nhận đối với số âm).

Cấu trúc này làm thay đổi luồng thực thi (trật tự thực hiện lệnh) của chương trình. Trật tự thực hiện lệnh phụ thuộc vào giá trị của biểu thức điều kiện. Có những lệnh sẽ không được thực hiện.

Tham khảo thêm ngay  Hướng dẫn tự học lập trình Python

Cú pháp cơ bản của cấu trúc này như sau:


1
2
3
4
if &lt;biểu thức điều kiện> :
    ...
    # khối code
    ...

một số ví dụ:


1
2
3
4
5
6
7
8
9
age = int(input('Your age: '))
if(age >= 18):
    print('Welcome!')
    print(f'Your birth year is {2020-age}')

name = input('Your name: ')
if(name.lower() == 'donald'):
    print('Mr. President!')
    print('Welcome to heaven!')

Biểu thức điều kiện là một biểu thức có kiểu kết quả là bool. Phần if <biểu thức điều kiện>: được gọi là header, phần khối code được gọi là suite (thân). Tổ hợp header và suite được gọi là một caluse (mệnh đề).

Phần suite là bắt buộc. Tất cả lệnh trong suite phải viết với cùng số thụt đầu dòng. Số lượng thụt đầu dòng không bắt buộc nhưng quy ước là 1 thụt đầu dòng = 4 space. Các IDE đều hỗ trợ viết thụt đầu dòng tự động. Bạn cũng có thể tự thụt đầu dòng bằng phím tab hoặc space.

Nếu vô tình làm thay đổi thụt đầu dòng bạn sẽ gặp phải cú pháp:

Mệnh đề elif và else

Trong cấu trúc rẽ nhánh đơn giản nhất bạn chỉ cần một mệnh đề if là đủ.

Hãy giả sử bạn viết script kiểm tra tuổi đi học theo các nấc sau: (1) dưới 6 tuổi -> trẻ mầm non, (2) từ 6 đến 12-> học sinh tiểu học, (3) từ 12-15 -> học sinh trung học cơ sở , (4) từ 16-18 -> học sinh trung học, (5) trên 18 tuổi -> đại học/ đi làm

Dĩ nhiên bạn có thể viết 5 lệnh if:


1
2
3
4
5
6
7
8
9
10
11
12
age = int(input('Your age: '))

if( &lt; age &lt; 6):
    print('Mầm non')
if(6 &lt;= age &lt; 12):
    print('Tiểu học')
if(12 &lt;= age &lt; 15):
    print('Trung học cơ sở')
if(15 &lt;= age &lt; 18):
    print('Trung học phổ thông')
if(18 &lt;= age):
    print('Đại học / đi làm')

Cách này sử dụng không sai nhưng có vấn đề. Ví dụ, nếu bạn nhập giá trị 14, Python sẽ kiểm tra tất cả các cấu trúc if. Mặc dù lệnh ở cấu trúc if(12<=age<15) được thực thi, Python tiếp tục kiểm tra cả 2 cấu trúc if còn lại. Điều này dẫn đến làm thừa việc.

Giờ hãy điều chỉnh lại như sau:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
age = int(input('Your age: '))

if( &lt; age &lt; 6):
    print('Mầm non')
elif(6 &lt;= age &lt; 12):
    print('Tiểu học')
elif(12 &lt;= age &lt; 15):
    print('Trung học cơ sở')
elif(15 &lt;= age &lt; 18):
    print('Trung học phổ thông')
elif(18 &lt;= age &lt;= 100):
    print('Đại học / đi làm')
else:
    print('Bạn còn sống không đấy?')

Trong đoạn script này chúng ta vận dụng hai mệnh đề khác của cấu trúc if: mệnh đề elif và else.

Tham khảo thêm ngay  Kiểu chuỗi ký tự (String) trong Python

Giả sử bạn nhập giá trị 14: Python sẽ làm như sau:

  1. Kiểm tra mệnh đề if-> bỏ qua, vì age nằm ngoài khoảng (0,6);
  2. Kiểm tra mệnh đề elif( 6<= age<12) -> bỏ qua, vì age nằm ngoài [6,12)
  3. Kiểm tra mệnh đề elif (12<=age<15) -> thực hiện, vì age nằm trong khoảng [12,15)
  4. Bỏ qua hết các mệnh còn lại.

Đây là lợi thế của mệnh đề elif: nếu một mệnh đề phù hợp và được thực hiện, các mệnh đề còn lại bị bỏ qua.

Giả sử bạn nhập giá 101 hoặc -1. Theo logic trên, Python sẽ kiểm tra mệnh đề if là tất cả các mệnh đề elif. Tuy nhiên nó không tìm được mệnh đề phù hợp. Khi này Python sẽ thực hiện mệnh đề else.

Mệnh đề else cần viết cuối cùng trong danh sách. Nó là mệnh đề sẽ thực hiện nếu tất cả các mệnh đề khác không phù hợp. Trong ví dụ của chúng ta, trường hợp giá trị tuổi nhỏ hơn 0 hoặc lớn hơn 100 là sẽ được thực hiện trong mệnh đề else.

Các cấu trúc if-elif-else lồng nhau.

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
age = int(input("Your age: "))
gender = input("Gender (male/female): ")
name = input("Your name: ")

if(age >= 18):
    print('Your age a legal.')
    if(name.isalpha()):
        if(gender.lower() == "male"):
            print(f'Welcome, Mr. {name}!')
        elif(gender.lower() == "female"):
            print(f'Welcome, lady {name}!')
        else:
            print(f'Welcome, {name}')
    else:
        print('Sorry, who are you?')
else:
    print('You are too young to come here!')

Trong ví dụ này bạn yêu cầu người dùng nhập tuổi, họ và giới tính.

Đầu tiên bạn kiểm tra tuổi. Nếu người dùng trên 18 tuổi, bạn tiếp tục kiểm tra tên. Nếu người dùng nhập tên (name.isalpha()), bạn tiếp tục kiểm tra giới tính. Nếu là name (male) sẽ in ra lời chào ‘Welcom, Mr.’, nếu là nữ sẽ in lời chào ‘Welcom,layday’, nếu không chỉ định giới tính thì chỉ in ra lời chào ‘Welcom’.

Tham khảo thêm ngay  Các loại phương thức (method) trong Python class

Nếu người dùng không cung cấp tên thì hỏi lại ‘Sorry, who are you?’. Nếu tuổi dưới 18 thì in thông báo ‘You are too young to come here.!’

Đây là ví dụ về cách đặt các lệnh if – elif-else lồng nhau.

Khi sử dụng các lệnh lồng nhau đặc biệt lưu ý đến thụt đầu dòng: các lệnh nằm trong cùng một suite phải có cùng thụt đầu dòng như nhau.

Từ khóa pass

Đây là từ khóa tương đối lạ với các bạn học C. Từ khóa này được đưa ra do đặc thù củ Python khi viết code block.

Hãy cùng thực hiện một ví dụ đơn giản sau:


1
2
3
4
5
6
age = int(input('Your age: '))
if(age >= 18):
    print('Welcome!')
else:

print('Goodbye!')

Bạn sẽ gặp ngay lỗi cú pháp (báo ở dòng lệnh print(‘Goodbye!’)): expected an indented block.

Trong Python, các lệnh như if, while, for, khai báo hàm…được gọi là lệnh phức hợp (compund statment).

Mỗi lệnh phức hợp chứ một hoặc nhiều mệnh đề (clause). Như cấu trúc if có thể có nhiều mệnh đề tương ứng với if, các elif và else.

Mỗi clause tạo ra từ một header và một suite. Ví dụ, clause tương ứng với else có header là else: và suite là khối code nằm sau else:. Suite là khối code bắt buộc có trong clause. Bạn không thể viết header mà không có suite đi kèm.

Vậy nếu như bạn không muốn xử lý gì trong clause thì sao. Giả sử, trong trường hợp mệnh đề else bạn không muốn xử lý gì cả nhưng vẫn muốn viết nó, hoặc trong trường hợp tạm thời bạn chưa viết được code xử lý cho nó.

Từ khóa pass được sử dụng trong những tình huống như thế này:


1
2
3
4
5
6
age = int(input('Your age: '))
if(age >= 18):
    print('Welcome!')
else:
    pass
print('Goodbye!')

Khi này bạn vẫn có thể giữ được mệnh đề else nhưng nó sẽ không làm gì hết. Từ khóa pass được tạo ra chỉ đơn thuần là để đáp ứng yêu cầu cú pháp của Python: mỗi mệnh đề phải có đủ header và suite. Từ khóa pass đóng vai trò là một suite hình thức.

Đối với cấu trúc if, từ khóa pass có vẻ hơi vô ích. Tuy nhiên, trong cấu trúc xử lý ngoại lệnh bạn sẽ thấy cần đến nó hơn.

Từ khóa pass không phải là đặc thù của cấu trúc if-elif – else. Đây là từ khóa xuất phát từ cấu trúc chung của các lệnh phức hợp trong Python.

Leave a Reply

Your email address will not be published. Required fields are marked *