Chap 2 - Cách hoạt động của chương trình

Mục tiêu của cuốn sách này là dạy bạn nghĩ như một người am hiểu về máy tính. Là cách kết hợp một vài việc đặc trưng của toán học, kỹ thuật và khoa học tự nhiên. Giống như nhà toán học, khoa học máy tính sử dụng ngôn ngữ biểu thức đề thể hiện ý tưởng (thuật toán).

Ghép nối và tái tạo lại các chuỗi

Vì vậy, bạn biết những điều cơ bản của các hướng dẫn riêng biệt và rằng một chương trình chỉ là một loạt các hướng dẫn. Nhưng sức mạnh thực sự của việc lập trình không chỉ là chạy (hoặc thực hiện) một hướng dẫn sau ví dụ giống như làm một chuỗi công việc cuối tuần. Dựa trên cách trình bày biểu thức,  chương trình có thể quyết định bỏ qua hướng dẫn, lặp lại, hoặc chọn một trong những hướng dẫn để chạy. Trong thực tế, bạn cũng không muốn chương trình của mình bắt đầu từ dòng đầu và đơn giản là thực hiện từng dòng đến hết. Các câu lệnh điều khiển luồng có thể quyết định các lệnh Python nào sẽ thực hiện theo những điều kiện nào.
Trước khi bạn học về  câu lệnh điều khiển luồng, trước hết bạn cần học cách đại diện cho yesno và bạn cần hiểu cách để viết những điểm phân nhánh đó bằng Python. Để kết thúc, hãy tìm hiểu giá trị Boolean, toán tử so sánh, toán tử Boolean.

Boolean Values

Trong khi kiểu số nguyên, số thực, dữ liệu chuỗi không giới hạn con số có thể viết được, kiểu giá trị Boolean chỉ có hai giá trị True False (Boolean viết hoa bởi vì được đặt tên theo nhà toán học George Boole). Khi gõ Python code, giá trị Boolean True False không cần dấu ngoặc kép đặt xung quanh chuỗi, và nó luôn luôn bắt đầu bằng một chữ hoa TF và phần còn lại bằn chữ thường. Nhập theo mẫu vào cửa sổ tương tác (một số trong những hướng dẫn là không đúng có chủ ý, và chúng sẽ làm cho thông báo lỗi hiện lên).
Giống như bất kỳ giá trị khác, giá trị Boolean được sử dụng bằng cách diễn tả và có thể được lưu trữ trong các biến. Nếu bạn không sử dụng đúng trường hợp hoặc bạn cố sử dụng TrueFalse cho tên một biến , Python sẽ đưa ra cho bạn một thông báo lỗi.

Toán tử so sánh

Toán tử so sánh đánh giá hai giá trị và trả kết quả là một giá trị Boolean. Bảng 2-1 là danh sách các toán tử so sánh.
Table 2-1. Comparison Operators
Toán tử
Ý nghĩa
==
Bằng
!=
Không bằng
<
Nhỏ hơn
>
Lớn hơn
<=
Nhỏ hơn hoặc bằng
>=
Lớn hơn hoặc bằng

Một vài toán tử trả về giá trị True hoặc False phụ thuộc vào giá trị bạn nhập vào. Hãy thử một vài phép toán, bắt đầu với == và !=.

Giống như bạn mong đợi, == trả kết quả là True khi giá trị ở hai vế là giống nhau, và != trả kết quả là True khi khi giá trị khác nhau. Toán tử == và != thực sự có thể làm việc với bất kỳ loại dữ liệu nào.

Chú ý rằng một giá trị số nguyên hoặc số thực luôn luôn không bằng một giá trị chuỗi ký tự. Trình bày 42 == `42` trả về kết quả là False bởi vì Python xét thấy số nguyên 42 khác biệt với chuỗi '42'.
Mặt khác các toán tử <, >, =< và  >= chỉ hoạt động đúng với giá trị số nguyên và số thực.

>>> 'hello' == 'hello'
>>> 'hello' == 'Hello'
True
False
>>> 'dog' != 'cat'
True
>>> True == True
True
>>> True != False
True
>>> 42 == 42.0
True
>>> 42 == '42'
False
>>> 

Sự khác nhau giữa == và =
Bạn có để ý thấy rằng toán tử == ( so sánh bằng) có hai dấu bằng trong khi toán tử =(phép gán) chỉ có một dấu bằng . Nó dễ dàng bị nhầm lẫn hai toán tử này lẫn nhau. Phải ghi nhớ những điểm này:
  • Toán tử == (bằng) hỏi rằng liệu hai giá trị mỗi bên có bằng nhau không.
  • Toán tử = (phép gán) đặt một giá trị ở bên phải vào trong một biến số ở bên trái.
Bạn sẽ thường xuyên sử dụng toán tử so sánh để so sánh giá trị của biến với một vài giá trị khác ví dụ như eggCount <= 42 myAge >= 10 (nói cho cùng, thay cho việc gõ 'dog' != 'cat', bạn có thể chỉ cần gõ True). Về sau bạn sẽ thấy nhiều ví dụ về nó hơn khi bạn học về phân luồng điều khiển.

Ba toán tử Bloolean ( and, or and not) sử dụng để so sánh giá trị Boolean. Giống như toán tử so sánh, chúng đánh giá biểu thức trả về giá trị a Boolean. Cùng tìm hiểu chi tiết những toán tử này, bắt đầu với toán tử and. 
Toán tử and và or luôn luôn lấy hai giá trị Boolean (hoặc là biểu thức), sau đó xét các giá trị nhị phân. Toán tử and đánh giá một biểu thức là True nếu cả hai giá trị Boolean là True, trái lại thì là False. Nhập vào một vài biểu thức sử dụng and để thấy cách toán tử hoạt động.
Một bảng chân lý cho thấy mọi kết quả có thể có của toán tử Boolean dành cho toán tử and:
Expression
Evaluates to...
True and True
True
True and False
False
False and True
False
False and False
False

Mặt khác , toán tử or đánh một giá biểu thức là True nếu một trong hai giá trị Boolean là True. Nếu cả hai là Fals, biểu thức được đánh giá là False.
Bạn có thể xem từng kết quả có thể xảy  ra của toán tử or trong bảng hằng đẳng thức.

Expression
Evaluates to...
True or True
True
True or False
True
False or True
True
False or False
False
Không giống như and và or, toán tử not chỉ tính toán dựa trên một giá trị Boolean (hoặc biểu thức). Toán tử not đánh giá đối số của giá trị Boolean. 
Rất giống với việc sử dụng hai lần phủ định trong cách nói và viết, bạn có thể lồng các toán tử not với nhau, nghĩ rằng không có lý do gì để sử dụng trong các chương trình thật sự. Xem bảng hằng đẳng thức của toán tử not:
Expression Evaluates to...
not True
False
not False
True
Các toán tử Boolean có thứ tự hoạt động giống như phép tính toán học làm. Sau phép Toán và toán tử so sánh đánh giá, Python sẽ đánh giá toán tử not đầu tiên, rồi đến toán tử and, và sau đó là or.

Phân luồng điều khiển thường bắt đầu với một phần gọi là điều kiện, và tất cả theo sau bởi một khối lệnh gọi là mệnh đề.Trước khi bạn học về đặc trưng của phân luồng điều khiển trong Python, tôi sẽ đề cập đến cái gọi là điều kiện và khối.

Các biểu thức Boolean bạn thấy từ trước đến giờ có thể coi là điều kiện, bất cứ thứ gì tương tự như biểu thức. Điều kiện chỉ là tên đặc biệt hơn trong bối cảnh của phân luồng điều khiển. Điều kiện luôn luôn đánh giá xuống giá trị Boolean, True hoặc False. Một phân luồng điều khiển quyết định cài gì cần thực hiện dựa trên liệu điều kiện của nó là True hay False, và hầu như mọi phân luồng điều khiển sử dụng một điều kiện.

Các dòng lệnh Python có thể được nhóm lại với nhau trong những khối. Bạn có thể cho biết khi nào một khối được bắt đầu và kết thúc từ những thụt đầu dòng của các lệnh. Dưới đây là ba quy định cho khối.
  • Các khối bắt đầu khi thêm dấu thụt đầu dòng
  • Khối này có thể chứa khối khác
  • Khối kết thúc khi thụt đầu dòng giảm bằng không hoặc bằng thụt đầu dòng của khối chứa nó.
Khối để hiểu dễ dàng hơn bằng cách nhìn vào cách lệnh bị thụt lề, vậy hãy tìm các khối trong phần nhỏ của trò chơi, đưa ra dưới đây:
name = 'Mary'
password = 'swordfish'
if name == 'Marys':
    print('Hello Mary')
    if password == 'swordfish':
        print('Access granted.')
    else:
        print('Wrong password.')

 Cách hoạt động của chương trình

chương trình hello.py trong chương trước, Python bắt đầu xử lý lệnh tại trên cùng của chương trình xuống. Thực hiện chương trình là thuật ngữ cho việc dòng lệnh hiện tại được thực hiện. Nếu bạn in mã nguồn trên giấy và đặt ngón tay của bạn vào mỗi dòng khi nó được thực hiện, bạn có thể nghĩ ngón tay của bạn như là thực hiện chương trình.

Không phải tất cả các chương trình thực hiện bằng cách đơn giản đi thẳng xuống, tuy nhiên. Nếu bạn sử dụng ngón tay để theo dõi một chương trình với các câu lệnh kiểm soát luồng, bạn sẽ thấy mình nhảy quanh mã nguồn dựa trên các điều kiện và có thể bạn sẽ bỏ qua toàn bộ mệnh đề.


Phân luồng điều khiển

 Bây giờ, hãy tìm hiểu thành phần quan trọng nhất của lệnh phân luồng điều khiển. Câu lệnh thay mặt cho những hình thoi bạn nhìn thấy trong trong sơ đồ tượng trưng 2-1, và chúng thực sự quyết định chương trình của bạn sẽ tạo ra.

Câu lệnh if

Loại câu lệnh phân luồng điều khiển phổ biến nhất là câu lệnh if. Một mệnh đề của lệnh if (đó là khối lệnh theo sau lệnh if) sẽ thực hiện nếu điều kiện của lệnh là True. Mệnh đề sẽ bỏ qua nếu điều kiện đó là False.
Trong tiếng Anh thông thường, một lệnh if có thể được đọc như sau "Nếu điều kiện là True thì xử lý lệnh trong mệnh đề". Trong Python một lệnh if bao gồm như sau:
  • Từ if
  • Một điều kiện (đó là biểu thức được đánh giá True hoặc False)
  • Bắt đầu với dòng tiếp theo, một khối lệnh được thụt lề (được gọi là mệnh đề if)
Để ví dụ, giả sử bạn có một vài code kiểm tra xem có hay không một người có tên là Alice. (Giả sử name được gán một vài giá trị từ trước)

if name == 'Alice':
    print('Hi, Alice.')
Lệnh điều khiển luồng kết thúc bằng một dấu hai chấm và theo sau là khối lệnh mới (mệnh đề). Mệnh đề của lệnh if là khối lệnh với print ('Hi, Alice.'). Sơ đồ 2-3 cho thấy biểu đồ trình tự của mã lệnh:

Lệnh Else

Một mện đề if có thể tùy chọn theo sau bởi một lệnh else. Mệnh đề else sẽ được xử lý chỉ khi điều kiện của lệnh if là False. Trong tiếng Anh thông thường, một lệnh else có thể đọc giống như, "Nếu điều kiện này là đúng thì xử lý mã lệnh này, hoặc không thì xử lý mã lệnh kia". Một lệnh else không có điều kiện, trong mã lệnh, một lệnh else luôn luôn bao gồm: 
  • Từ khóa else
  • Một dấu hai chấm
  • Bắt đầu với dòng mã tiếp theo là một khối lệnh được thụt lề (được gọi là mệnh đề else).
Trở lại với ví dụ Alice, hãy xem xét một vài mã lệnh sử dụng lệnh else để đưa ra một lời chào hỏi khác nếu tên của cá nhân đó không phải là Alice.
name = 'Bob'
if name == 'Alice':
    print('Hi, Alice.')
else:
    print('Hello, stranger.')

ELIF STATEMENTS

Trong khi chỉ một mệnh đề if hoặc else sẽ xử lý, bạn có khi có trường hợp mà ở đó bạn muốn một trong một vài mệnh đề có thể xảy ra để xử lý. Lệnh else là một  lệnh "else if" lệnh đó luôn luôn theo sau một lệnh if hoặc một lệnh elif khác. Nó cung cấp một điều kiện khác điều kiện đó chỉ được kiểm tra nếu tất cả điều kiện trước là False. Trong lập trình, một lệnh elif luôn luôn bao gồm:
  • Từ elif
  • Một điều kiện (đó là một biểu thức được đánh giá là True hoặc False)
  • Một dấu hai chấm
  • Bắt đầu với dòng tiếp theo là khối lệnh được thụt lề (được gọi là mệnh đề elif).
Hãy thêm một elif để người kiểm tra tên thấy cách lệnh hoạt động.
name = 'Bob'
age = 5
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
Lần này, bạn kiểm tra tuổi của cá nhân, và chương trình sẽ nói với họ một vài điều khác nhau nếu tuổi của họ nhỏ hơn 12.
Mệnh đề elif sẽ xử lý nếu age < 12 là đúng và name = 'Alice' là False. Tuy nhiên nếu cả hai mệnh đề là False thì cả hai mệnh đề sẽ được bỏ qua. Nó không đảm bảo rằng tối thiểu một trong những mệnh đề sẽ được xử lý. Một khi một trong những điều kiện tìm thấy là True thì phần còn lại của mệnh đề elif tự động được bỏ qua. Để ví dụ, mở một cửa sổ chỉnh sửa tệp tin mới và nhập mã lệnh dưới đây, lưu nó như là vampire.py.
name = 'Dracula'
age = 4000
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
elif age > 2000:
    print('Unlike you, Alice is not an undead, immortal vampire.')
elif age > 100:
    print('You are not Alice, grannie.')
Ở đây tôi đã thêm hai lệnh elif đề khiến cho người kiểm tra tên chào hỏi một cá nhân với những câu trả lời khác nhau dựa trên tuổi.
Thứ tự của các lệnh elif có vấn đề. Hãy sắp xếp lại chúng đề giới thiệu một lỗi. Nhớ rằng những mệnh đề elif còn lại sẽ tự động bỏ qua mỗi khi một mệnh đề đúng được tìm thấ, vậy nếu bạn hoán đổi một vài mệnh đề trong vampire.py, bạn chạy mắc phải một vấn đề. Thay đổi mã lệnh sao cho giống như bên dưới và lưu lại là vampire2.py:
name = 'Dracula'
age = 4000
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
elif age > 100:
    print('You are not Alice, grannie.')
elif age > 2000:
    print('Unlike you, Alice is not an undead, immortal vampire.')
Nói rằng biến số age chưa giá trị 4000 trước khi thực hiện mã lệnh. Có thể bạn mong chờ mã lệnh in ra chuỗi 'Unlike you, Alice is not an undead, immortal vampire.' Tuy nhiên bởi vì điều kiện age >100 là đúng, the string 'You are not Alice, grannie.' is printed, and phần còn lại của lệnh elif sẽ tự động bỏ qua. Nhớ rằng tối đa chỉ một  mệnh đề sẽ được xử lý, và dành cho lệnh elif, vấn đề thứ tự.
Tùy ý, bạn có thể có một mệnh đề else đằng sau lệnh elif cuối. Trong trường hợp đó, nó đảm bảo rằng tối thiểu một (và chỉ một) mệnh đề sẽ được xử lý. Nếu mọi điều kiện của lệnh if và elif là False, khi đó mệnh đề else sẽ được thực hiện. Để minh họa, hãy tạo một một chương trình Alice để sử dụng if, elif và else:
name = 'Bob'
age = 30
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
else:
    print('You are neither Alice nor a little kid.')
Trong tiếng anh thông thường, kiểu cấu trúc điều khiển phân luồng có thể là "Nếu điều kiện đầu tiên là đúng thì thực hiện điều này. Còn không, nếu điều kiện thứ hai là đúng thì thực hiện cái kia. Trái lại làm những việc còn lại". Khi bạn sử dụng cả ba lệnh cùng nhau, ghi nhớ những quy tắc về cách sắp xếp thứ tự của chúng để tránh những lỗi giống như trong sơ đồ 2-7. Đầu tiên, đó là luôn luôn tồn tại một lệnh if. Các lệnh elif bất kỳ mà bạn cần nên đứng sau lệnh if. Thứ hai, nếu muốn chắc chắn rằng tối thiểu một mệnh đề được thực thi, đóng khối lệnh với một lệnh else.

while Loop Statements

Bạn có thể tạo ra một khối lệnh xử lý lặp đi lặp lại với một lệnh while. Trong Python một mệnh đề   sẽ được xử lý miễn là điều kiện của lệnh while là đúng. Trong lập trình, lệnh while bao gồm những thành phần dưới đây:
  • Từ khóa while
  • một điều kiện (đó là, biểu thức đánh giá True or False)
  • một dấu hai chấm
  • Bắt đầu với dòng dưới, một khối lệnh bị thụt đầu dòng (được gọi là mệnh đề while)
Bạn thấy rằng một mệnh đề while trông giống như một mệnh đề if. Điều khác nhau là cách lệnh thực thi. Tại điểm kết thúc của mệnh đề if, chương trình tiếp tục thực thi sau mệnh đề if.Nhưng sau khi kết thúc mệnh đề while, bộ xử lý của chương trình nhảy trở lại điểm bắt đầu của lệnh while. Mệnh đề while thường được gọi là while loop hay chỉ là loop.
Chúng ta hãy xem một lệnh if và một while loop dưới đây sử dụng điều kiện giống nhau thực hiện hành động giống nhau dựa trên điều kiện đó.
Hai lệnh if và while loop đơn giản là kiểm tra giá trị của spam, và nếu nó nhỏ hơn năm thì chúng sẽ in ra một lời nhắn. Nhưng khi bạn chạy hai đoạn mã này, một vài điều khác biệt xảy ra cho mỗi lệnh. Với lệnh if, đơn giản là xuất ra dòng chữ "Hello, World". Nhưng với lệnh while, dòng chữ "Hello, World" được lặp lại năm lần.
Lệnh if kiểm tra điều kiện, và nó in "Hello, World", chỉ khi điều kiện trên là đúng. Mặt khác, với vòng lặp while sẽ in ra năm lần. Nó dừng lại sau năm lần in bởi vì số nguyên trong biến spam được tăng lên tại cuối mỗi vòng lặp, có nghĩa là vòng lặp sẽ thực thi năm lần trước khi spam < 5False
Trong vòng lặp while, điều kiện luôn luôn được kiểm tra tại điểm bắt đầu của mỗi lần lặp lại. Nếu điều kiện là True, thì mệnh đề sẽ được thực hiện, và sau đó, điều kiện được kiểm tra lại. Lần đầu tiên điều kiện tìm thấy là False, mệnh đề while sẽ bị bỏ qua.

 Một vòng lặp while phiền phức


Đây là một chương trình nhỏ ví dụ rằng nó tiếp tục hỏi bạn nhập vào your name theo nghĩa đen.

name = ''                           # (1)
while name != 'your name':          # (2)
    print('Please type your name.')
    name = input()                  # (3)
print('Thank you!')                 # (4)
Đầu tiên, chương trình thiết lập biến name là một chuỗi rỗng. Điều này là để điều kiện name != 'your name' sẽ đánh giá là True chương trình xử lý sẽ truy cập vào mệnh đề của vòng lặp while .
Mã lệnh bên trong mệnh đề sẽ hỏi người dùng gõ vào tên của họ, chúng được gán cho biến name. Từ dòng cuối cùng của khối, bộ xử lý của chương trình sẽ di chuyển về điểm bắt đầu của vòng lặp while và đánh giá lại điều kiện. Nếu giá trị trong name không bằng chuối 'your name', khi đó điều kiện đánh giá là True, và bộ xử lý sẽ truy cập lại vào mệnh đề while.
Nhưng một khi người dùng gõ vào 'your name', điều kiện của mệnh đề while đánh giá là False. Điều kiện bây giờ là False và thay bằng bộ xử lý của chương trình tiếp tục truy cập lại vào mệnh đề của  vòng lặp while, nó bỏ qua và tiếp tục chạy phần còn lại của chương trình.

Nào bây giờ hãy xem yourName.py hoạt động. Ấn f5 để chạy nó, và nhập vào một vài điều gì đó khác 'your name' một vài lần trước khi bạn đưa cho chương trình thứ mà nó muốn.

Nếu bạn không bao giờ nhập your name, thì khi đó điều kiện của vòng lặp while sẽ không bao giờ False và chương trình sẽ tiếp tục hỏi không ngừng. Trong chương trình khác, hàm điều kiện có thể hầu như không bao giờ thay đổi, và điều đó có thể gây ra một rắc rối. Hãy xem làm thế nào bạn có thể phá vỡ một vòng lặp while.

Lệnh BREAK

Đây là lối tắt để bộ xử lý của chương trình thoát ra mệnh đề của vòng lặp while sớm hơn.






Practice Questions

Q:
1. What are the two values of the Boolean data type? How do you write them?
True and Flase. 
Q:
2. What are the three Boolean operators?
and - or - not.
Q:
3. Write out the truth tables of each Boolean operator (that is, every possible combination of Boolean values for the operator and what they evaluate to).
True and True = True
True and False = False
False and True = False
False and False = False
True or True = True
True or False = True
False or True = True
False or False = True
not True = False
not False = True
 
Q:
4. What do the following expressions evaluate to?

(5 > 4) and (3 == 5) => False
not (5 > 4) => False
(5 > 4) or (3 == 5) => True
not ((5 > 4) or (3 == 5)) => False
(True and True) and (True == False) => False
(not False) or (not True) => True
Q:
5. What are the six comparison operators?
==                       equal to
!=                    not equal to
<                   
>
<=
>=
 
Q:
6. What is the difference between the equal to operator and the assignment operator?
equal to : == (two '=')
assignment: = (one '=')
Q:
7. Explain what a condition is and where you would use one.
Q:
8. Identify the three blocks in this code:

spam = 0
if spam == 10:             #first block
    print('eggs')
    if spam > 5:           #second block
        print('bacon')
    else:                  #third block
        print('ham')
    print('spam')
print('spam')
 
 
Q:
9. Write code that prints Hello if 1 is stored in spam, prints Howdy if 2 is stored in spam, and prints Greetings! if anything else is stored in spam.
spam = ''
spam = int(input())
if spam == 1:
    print('Hello')
elif spam == 2:
    print('Howdy')
else:
    print('Greatings')
Q:
10. What can you press if your program is stuck in an infinite loop?
Ctrl + C
Q:
11. What is the difference between break and continue?
A: break: break out of loop's clause 
     continue: jump to start of the clause
Q:
12. What is the difference between range(10), range(0, 10), and range(0, 10, 1) in a for loop?
A: they are same
Q:
13. Write a short program that prints the numbers 1 to 10 using a for loop. Then write an equivalent program that prints the numbers 1 to 10 using a while loop.
 A: - use for loop
i = 0
for i in range(1, 11):
    print(i)

#use while loop
i =1
while i <= 10:
    print(i)
    i = i +1
 
Q:
14. If you had a function named bacon() inside a module named spam, how would you call it after importing spam?
Extra credit: Look up the round() and abs() functions on the Internet, and find out what they do. Experiment with them in the interactive shell.
spam.bacon()
 

Comments

Popular Posts