Bài 3: Câu Lệnh Điều Khiển Trong Python

Bài 3: Câu lệnh điều khiển trong python

Trong bài viết này, chúng ta sẽ đề cập tới các câu lệnh điều khiển trong python. Các câu lệnh điều khiển bao gồm if, if-else, for, while

Câu lệnh điều khiển if

Câu lệnh if là câu lệnh căn bản và quan trong nhất. Câu lệnh được sử dụng để quyết định xem một khối lệnh có được thực hiện hay không. Về cơ bản, chúng ta có thể phân loại thành 3 nhóm câu lệnh if như sau.

Nhóm if loại 1. Câu lệnh if bình thường

1
2if <điều kiện>:
3    # trường hợp <điều kiện> là đúng
4    câu lệnh 1
5    ...
6    câu lệnh n
7câu lệnh n+1

Nhóm if loại 2. Câu lệnh if có else

 1
 2if <điều kiện>:
 3    # trường hợp <điều kiện> là đúng
 4    câu lệnh 1
 5    ...
 6    câu lệnh n
 7else:
 8    # trường hợp <điều kiện> là sai
 9    câu lệnh 1
10    ...
11    câu lệnh n
12
13câu lệnh n+1

Nhóm if loại 3. Câu lệnh if else lồng nhau

 1
 2if <điều kiện 1>:
 3    # trường hợp <điều kiện> là đúng
 4    câu lệnh 1
 5    ...
 6    câu lệnh n
 7elif <điều kiện 2>:
 8    # trường hợp <điều kiện 1> là sai, <điều kiện 2> là đúng
 9    câu lệnh 1
10    ...
11    câu lệnh n
12...
13elif <điều kiện n>:
14
15    # trường hợp  <điều kiện 1> là sai,  <điều kiện 2> là sai, ... <điều kiện n-1> là sai, <điều kiện n> là đúng
16    câu lệnh 1
17    ...
18    câu lệnh n
19else:
20    # trường hợp <điều kiện 1> là sai, ...,  <điều kiện 2> là sai
21    câu lệnh 1
22    ...
23    câu lệnh n
24
25
26câu lệnh n+1

Ví dụ:

Mẹ bé Thu trước khi đi làm nói với bé Thu rằng: “Nếu trời sắp mưa, con hãy rút quần áo ở dây phơi đồ, hốt lúa cất vào bồ, bế em vào nhà, gài then đóng cửa thật chặt, gài then đóng cửa thật chặt. Con ngoan ở nhà, chiều mẹ về mua kẹo cho con ăn”. Chúng ta sẽ biến đổi lời căn dặn của mẹ bé Thu thành câu lệnh if như sau:

 1
 2thoi_tiet = 'sap_mua'
 3is_be_thu_ngoan = True
 4if thoi_tiet == 'sap_mua':
 5    print('rút quần áo ở dây phơi đồ')
 6    print('hốt lúa cất vào bồ')
 7    print('bế em vào nhà')
 8    print('gài then đóng cửa thật chặt')
 9    print('rút quần áo ở dây phơi đồ')
10
11if is_be_thu_ngoan:
12    print('Mẹ bé Thu mua kẹo')
13    print('Mẹ bé Thu cho bé Thu ăn kẹo')
14
15Kết quả
16
17rút quần áo  dây phơi đồ
18hốt lúa cất vào bồ
19bế em vào nhà
20gài then đóng cửa thật chặt
21rút quần áo  dây phơi đồ
22
23
24Mẹ  Thu mua kẹo
25Mẹ  Thu cho  Thu ăn kẹo

Chúng ta có câu tục ngữ: Chuồn chuồn bay thấp thì mưa, bay cao thì nắng, bay vừa thì râm.

Câu lệnh if else của câu tục ngữ trên là:

 1
 2vi_tri_chuon_chuon = 'bay_vua'
 3
 4if vi_tri_chuon_chuon == 'bay_thap':
 5    print('trời sắp mưa')
 6elif vi_tri_chuon_chuon == 'bay_cao':
 7    print('trời nắng')
 8elif vi_tri_chuon_chuon == 'bay_vua':
 9    print('trời râm')
10else:
11    print('không xác định')
12
13# Kết quả
14
15trời râm

Câu lệnh điều khiển for

Câu lệnh for được sử dụng để duyệt các phần tử trong các container như String, Tuple, List, Set hoặc Dictionary, Array.

for trong python tương đương với foreach trong các ngôn ngữ thuộc họ c. Python không có câu lệnh for giống for trong c/c++, c#, java …

Cú pháp câu lệnh for

1
2for item in container:
3    #statement

Ví dụ

 1
 2brands = ['iphone','samsung','xiaomi','nokia']
 3
 4for item in brands:
 5    print(item)
 6
 7#Kết quả
 8
 9iphone
10samsung
11xiaomi
12nokia

Hàm range

cú pháp

1
2range(start,stop,steep)

Hàm range được sử dụng để trả về một chuỗi các số từ start (mặc định là 0) đến stop, với bước nhảy là steep (mặc định là 1)

Ví dụ:

Tạo một chuỗi các số từ 5 đến 9, in ra các số trên

 1
 2itemRange = range(5,10)
 3
 4for item in itemRange:
 5    print(item)
 6
 7# Kết quả
 8
 95
106
117
128
139

Hàm range thường được sử dụng với hàm len, để duyệt index của list

 1
 2brands = ['iphone','samsung','xiaomi']
 3
 4for x in range(len(brands)):
 5    print(f"element at {x} in list is {brands[x]} ")
 6
 7# Kết quả
 8
 9element at 0 in list is iphone
10element at 1 in list is samsung
11element at 2 in list is xiaomi

Ngoài ra, còn tuỳ vào bài toán, chúng ta sử dụng hàm range một cách thông minh để code được trong sáng và sạch đẹp hơn.

Kết hợp câu lệnh for với if

Hoàng đế Julius Caesar là một nhà quân sự tài ba. Trong lúc ông lãnh đạo quân đội La Mã, để tránh bị rò rỉ nội dung thư tín khi truyền tải cho các tướng sĩ, ông đã thiết lập một bộ mật mã là dịch từng chữ trong thông tin qua 3 chữ cái trong bảng mã ascii. Nghĩa là, thay vì viết chữ a, ông lại viết thành chữ d, thay vì viết chữ b, ông lại viết chữ e, …., cho đến thay z thành c. Khi tướng sĩ của ông nhận được thư tín, chỉ cần dịch ngược lại với quy luật trên là có được nội dung bức thư.

Ví dụ nội dung bức thư ông gửi.

gdqk Jdoold qjdb pxrl ed

Khi tướng sĩ nhận được đoạn lệnh trên, họ tiến hành dịch ngược lại. g tương ứng với chữ d (d+3 =g) …, và giải mã bức mật thư của hoàng đế gửi là:

danh Gallia ngay muoi ba

Chúng ta viết chương trình nhỏ với for và if để mã hoá nội dung thông tin giúp Julius Caesar nhé.

 1
 2input = 'danh Gallia ngay muoi ba'
 3
 4for c in input:
 5    if c == 'a':
 6        print('d',end='')
 7    elif c == 'b':
 8        print('e',end='')
 9    elif c == 'c':
10        print('f',end='')
11    elif c == 'd':
12        print('g',end='')
13    elif c == 'e':
14        print('h',end='')
15    elif c == 'f':
16        print('i',end='')
17    elif c == 'g':
18        print('j',end='')
19    elif c == 'h':
20        print('k',end='')
21    elif c == 'i':
22        print('l',end='')
23    elif c == 'j':
24        print('m',end='')
25    elif c == 'k':
26        print('n',end='')
27    elif c == 'l':
28        print('o',end='')
29    elif c == 'm':
30        print('p',end='')
31    elif c == 'n':
32        print('q',end='')
33    elif c == 'o':
34        print('r',end='')
35    elif c == 'p':
36        print('s',end='')
37    elif c == 'q':
38        print('t',end='')
39    elif c == 'r':
40        print('u',end='')
41    elif c == 's':
42        print('v',end='')
43    elif c == 't':
44        print('w',end='')
45    elif c == 'u':
46        print('x',end='')
47    elif c == 'v':
48        print('y',end='')
49    elif c == 'w':
50        print('z',end='')
51    elif c == 'x':
52        print('a',end='')
53    elif c == 'y':
54        print('b',end='')
55    elif c == 'z':
56        print('c',end='')
57    else:
58        print(c,end='')
59print()
60
61# Kết quả
62
63gdqk Gdoold qjdb pxrl ed

Cách viết trên khá cơ bắp, tay to, dài dòng, chúng ta hãy viết đoạn code trên ngắn gọn hơn bằng cách.

  • Tạo ra 2 chuỗi, một chuỗi chứa các ký tự alphabet, một chuỗi chứa bảng mã hoá.

  • Tìm vị trí của từ cần mã hoá trong chuỗi alphabet

  • In ra từ cần lấy trong bảng mã hoá

 1
 2input = 'danh Gallia ngay muoi ba'
 3
 4alphabet = 'abcdefghijklmnopqrstuvwxyz'
 5caesar_cipher = 'defghijklmnopqrstuvwxyzabc'
 6
 7for c in input:
 8    index = alphabet.find(c)
 9    if index >-1:
10        print(caesar_cipher[index],end='')
11    else:
12        print(c,end='')
13
14print('')

từ khoá break, từ khoá continue, từ khoá pass

Để thoát khỏi vòng lặp for, chúng ta sử dụng từ khoá break

Để bỏ qua khối lệnh bên dưới, tiếp tục lệnh for, chúng ta sử dụng từ khoá continue.

Để giữ chỗ cho tính năng tương lai sẽ phát triển, chúng ta sử dụng từ khoá pass để đánh dấu, và cũng để cho chương trình có thể hoạt động được.

Ví dụ về break

Tìm là in ra 5 số lẻ nguyên dương đầu tiên bé hơn 100

 1
 2count = 0
 3
 4for x in range(100):
 5    if x % 2 != 0:
 6        print(x)
 7        count = count + 1
 8    if count >=5:
 9        break
10
11# Kết quả
12
131
143
155
167
179

Ví dụ về continue

In ra các số lẻ bé hơn 10

 1
 2for x in range(10):
 3    if x % 2 == 0:
 4        continue
 5    print(x)
 6
 7# Kết quả
 8
 91
103
115
127
139

Ví dụ về pass

Viết một vòng lặp for lặp 10 lần, để giành đó mai mốt code tiếp

1
2for x in range(10):
3    pass
4
5# Kết quả

Vòng lặp while

Ý nghĩa: Trong khi điều kiện còn đúng, thì thực hiện câu lệnh.

Kết thúc vòng lặp khi điều kiện sai

Cú pháp

1
2while <condition>:
3    # statement

Ví dụ:

In ra các số nguyên bé hơn 10

1
2
3i = 1
4while i < 10:
5  print(i)
6  i += 1

vòng lặp while có thể sử dụng các từ khoá pass, continue, break giống như for

Kỹ thuật duyệt container trong python

Python hỗ trợ nhiều hàm dựng sẵn, giúp chúng ta có thể duyệt các container một cách dễ dàng.

Việc sử dụng các hàm duyệt bên dưới, giúp cho coder:

  • Sử dụng nhanh chóng, giảm thời gian coding.

  • Tên hàm chính là từ khoá, mô tả chính xác mục đích sử dụng hàm. Giúp giảm thời gian đọc code, khi so với việc sử dụng for/while.

  • Code ngắng gọn hơn, rõ ràng hơn, so với for & while.

Duyệt container sử dụng hàm enumerate

Hàm enumerate hỗ trợ trả về index và value của container

Ví dụ:

 1
 2
 3brands = ['iphone','samsung','xiaomi','nokia']
 4
 5for index,item in enumerate(brands):
 6    print(f"element at index {index} in list is {item} ")
 7
 8
 9# Kết quả
10
11element at index 0 in list is iphone
12element at index 1 in list is samsung
13element at index 2 in list is xiaomi
14element at index 3 in list is nokia

Duyệt container sử dụng hàm zip

Hàm dựng sẵn zip hỗ trợ chúng ta kết hợp 2 container cùng loại (list với list, dict với dict, string với string) với nhau

Ví dụ:

 1
 2alphabet = 'abcdefghijklmnopqrstuvwxyz'
 3caesar_cipher = 'defghijklmnopqrstuvwxyzabc'
 4
 5
 6for decode, encode in zip(alphabet,caesar_cipher):
 7    print(f"Caesar send {encode}, we have {decode}")
 8
 9# Kết quả
10
11Caesar send d, we have a
12Caesar send e, we have b
13Caesar send f, we have c
14Caesar send g, we have d
15Caesar send h, we have e
16Caesar send i, we have f
17Caesar send j, we have g
18Caesar send k, we have h
19Caesar send l, we have i
20Caesar send m, we have j
21Caesar send n, we have k
22Caesar send o, we have l
23Caesar send p, we have m
24Caesar send q, we have n
25Caesar send r, we have o
26Caesar send s, we have p
27Caesar send t, we have q
28Caesar send u, we have r
29Caesar send v, we have s
30Caesar send w, we have t
31Caesar send x, we have u
32Caesar send y, we have v
33Caesar send z, we have w
34Caesar send a, we have x
35Caesar send b, we have y
36Caesar send c, we have z

Duyệt dic sử dụng hàm items

Ví dụ:

 1
 2profile = {'name':'alex','age':18,'location':'vietnam'}
 3
 4for key, value in profile.items():
 5    print(key,value)
 6
 7# Kết quả
 8
 9name alex
10age 18
11location vietnam

Duyệt container sử dụng hàm sorted

Hàm sorted sẽ xắp xếp lại phần tử trong container theo thứ tự (với số thì từ nhỏ đến lớn, với chữ thì theo thứ tự từ điển), và trả về từng phần tử trong container đã được sort.

Ví dụ:

 1
 2
 3brands = ['iphone','samsung','xiaomi','nokia']
 4
 5for item in sorted(brands):
 6    print(item)
 7
 8# Kết quả
 9
10iphone
11nokia
12samsung
13xiaomi

Duyệt container sử dụng hàm reversed

Hàm reversed sẽ duyệt ngược phần tử trong container. Hàm này không làm ảnh hưởng thứ tự của các phần tử trong container

Ví dụ:

 1
 2
 3brands = ['iphone','samsung','xiaomi','nokia']
 4
 5for item in reversed(brands):
 6    print(item)
 7
 8# Kết quả
 9
10iphone
11nokia
12samsung
13xiaomi

List Comprehension

List comprehension cung cấp cho chúng ta một cú pháp ngắn gọn, súc tích, giúp chúng ta tạo một list, là tập con từ một list lớn.

Cú pháp chung của list comprehension là:

1
2newlist = [expression for item in iterable if condition == True]

Với condition là điều kiện lọc để giảm số lượng phần tử trả về.

expression: có thể là một biểu thức if

Ví dụ:

 1
 2brands = ['iphone','samsung','xiaomi','nokia']
 3filter_brands = []
 4
 5for item in brands:
 6    if 'i' in item:
 7        filter_brands.append(item)
 8
 9print(filter_brands)
10
11# Kết quả
12>>> print(filter_brands)
13['iphone', 'xiaomi', 'nokia']

Đoạn mã trên thực hiện việc in ra các hãng có chứa ký tự i trong tên. Chúng ta tốn 3 dòng code (1 vòng for, 1 vòng if, 1 vòng append). Giờ chúng ta sẽ viết lại bằng list comprehension

 1
 2
 3brands = ['iphone','samsung','xiaomi','nokia']
 4
 5filter_brands = [item for item in brands if 'i' in item]
 6
 7print(filter_brands)
 8
 9#Kết quả
10
11>>> print(filter_brands)
12['iphone', 'xiaomi', 'nokia']

Ví dụ 2

Viết hoa toàn bộ tên hãng

 1
 2# Mẫu vòng lặp for
 3
 4brands = ['iphone','samsung','xiaomi','nokia']
 5
 6old_upper_brands = []
 7for brand in brands:
 8    old_upper_brands.append(brand.upper())
 9
10# Mẫu list comprehension
11
12new_upper_brands = [brand.upper() for brand in brands]

Ví dụ 3:

Cho một list có 10 phần tử, lấy ra các phần tử > 5, thay các phần tử lớn hơn 10 bằng 0

 1
 2# Mẫu cũ
 3items = [100,5,8,2,9,7,1,20,89,99]
 4old_items = []
 5for item in items:
 6    if item > 5: # chỉ xét những phần tử >5
 7        if item>10: # thay những phần tử > 10 thành 0
 8            old_items.append(0)
 9        else:
10            old_items.append(item)
11
12print(old_items)
13
14new_items = [item if item <=10 else 0 for item in items if item>5]
15
16print(new_items)
17
18# Kết quả
19
20>>> print(old_items)
21[0, 8, 9, 7, 0, 0, 0]
22
23>>> print(new_items)
24[0, 8, 9, 7, 0, 0, 0]

Cảm ơn các bạn đã theo dõi bài viết.

Comments