A Practical Introduction To Python Programming Heinold-43-52
A Practical Introduction To Python Programming Heinold-43-52
Chương 5
Chương này bao gồm một số kỹ thuật phổ biến và một số thông tin hữu ích khác.
5.1 Đếm
Chúng ta thường muốn các chương trình của mình đếm xem điều gì đó xảy ra bao nhiêu lần. Ví dụ: một
trò chơi điện tử có thể cần theo dõi xem người chơi đã sử dụng bao nhiêu lượt hoặc một chương trình
toán học có thể muốn đếm xem có bao nhiêu số có thuộc tính đặc biệt. Chìa khóa để đếm là sử dụng một
biến để giữ số đếm.
Ví dụ 1 Chương trình này lấy 10 số từ người dùng và đếm xem có bao nhiêu số lớn hơn 10.
đếm = 0
đếm=đếm+1
Hãy nghĩ về biến đếm như thể chúng ta đang kiểm đếm trên một tờ giấy. Mỗi khi chúng ta nhận được một
số lớn hơn 10, chúng ta sẽ thêm 1 vào tổng số của mình. Trong chương trình, điều này được thực hiện
bằng dòng count=count+1. Dòng đầu tiên của chương trình, count=0, rất quan trọng. Nếu không có nó,
trình thông dịch Python sẽ đến dòng count=count+1 và đưa ra một lỗi nói điều gì đó về việc không
biết count là gì. Điều này là do lần đầu tiên chương trình đến dòng này, nó sẽ cố gắng thực hiện
những gì nó nói: lấy giá trị cũ của số đếm, thêm 1 vào đó và lưu kết quả vào số đếm. Nhưng khi
chương trình đến đó lần đầu tiên, không có giá trị cũ nào được sử dụng, vì vậy trình thông dịch
Python không biết phải làm gì. Để tránh lỗi, chúng ta cần xác định số đếm và đó là điều đầu tiên
33
Machine Translated by Google
dòng nào. Chúng tôi đặt nó thành 0 để cho biết rằng khi bắt đầu chương trình, không tìm thấy số
nào lớn hơn 10.
Đếm là một điều cực kỳ phổ biến. Hai điều liên quan là:
Ví dụ 2 Bản sửa đổi này của ví dụ trước sẽ đếm xem có bao nhiêu số mà người dùng nhập lớn hơn 10
và bao nhiêu số bằng 0. Để đếm hai thứ, chúng ta sử dụng hai biến đếm.
đếm1 = 0
đếm2 = 0
đếm1=đếm1+1
nếu số==0:
đếm2=đếm2+1
print('Có ', count1, 'các số lớn hơn 10.') print('Có ', count2, 'số 0.')
Ví dụ 3 Tiếp theo chúng ta có một ví dụ phức tạp hơn một chút. Chương trình này đếm có bao nhiêu ô
2 đến 1002 có tận cùng là 4.
vuông từ 1
đếm = 0
Một số lưu ý ở đây: Đầu tiên, do điểm bất thường đã nói ở trên của hàm phạm vi , chúng ta cần sử
dụng phạm vi (1.101) để lặp qua các số từ 1 đến 100. Biến lặp i lấy các số đó đến 1002 được biểu
2
giá trị hay không, tức là thị bằng i**2 . Tiếp theo, để kiểm tra xem một số có kết thúc bằng
bình phương từ 1 trên 4, một thủ thuật toán học hay là kiểm tra xem nó có dư 4 khi chia cho 10 hay
không. Toán tử modulo, %, được sử dụng để lấy số dư.
Liên quan chặt chẽ đến việc đếm là tính tổng, nơi chúng ta muốn cộng một loạt các số.
Machine Translated by Google
Ví dụ 1 Chương trình này sẽ cộng các số từ 1 đến 100. Cách thức hoạt động của nó là mỗi lần chúng ta
gặp một số mới, chúng ta cộng nó vào tổng số hiện tại của mình, s.
s = 0
Ví dụ 2 Chương trình này sẽ yêu cầu người dùng nhập 10 số và sau đó tính trung bình cộng của chúng.
s = 0
Ví dụ 3 Một cách sử dụng phổ biến của tính tổng là tính điểm trong một trò chơi. Gần đầu trò chơi,
chúng ta sẽ đặt biến điểm bằng 0. Sau đó, khi muốn cộng điểm, chúng ta sẽ làm như sau:
điểm = điểm + 10
Thông thường chúng ta muốn hoán đổi giá trị của hai biến x và y. Sẽ rất hấp dẫn nếu bạn thử những
điều sau:
x = y
y = x
Nhưng điều này sẽ không hiệu quả. Giả sử x là 3 và y là 5. Dòng đầu tiên sẽ đặt x thành 5, điều này
là tốt, nhưng dòng thứ hai cũng sẽ đặt y thành 5 vì x bây giờ là 5. Mẹo là sử dụng biến thứ ba để
lưu giá trị của x:
giữ = x
x = yy
= giữ
Trong nhiều ngôn ngữ lập trình, đây là cách thông thường để hoán đổi các biến. Tuy nhiên, Python
cung cấp một lối tắt hay:
x,y = y,x
Sau này chúng ta sẽ tìm hiểu chính xác lý do tại sao điều này lại hiệu quả. Hiện tại, bạn có thể thoải mái sử dụng bất kỳ phương pháp nào bạn thích.
Tuy nhiên, phương pháp sau có ưu điểm là ngắn gọn và dễ hiểu hơn.
Machine Translated by Google
5.4 Cờ biến
Biến cờ có thể được sử dụng để cho một phần trong chương trình của bạn biết khi nào có điều gì đó xảy ra ở phần
khác của chương trình. Đây là một ví dụ xác định xem một số có phải là số nguyên tố hay không.
flag = 0
cho i trong phạm vi (2,num): if
num%i==0: flag =
1
if flag==1:
print('Không phải số nguyên
tố') else:
in('Prime')
Nhắc lại rằng một số là số nguyên tố nếu nó không có ước số nào khác ngoài 1 và chính nó. Cách hoạt động của
chương trình trên là cờ bắt đầu từ 0. Sau đó, chúng tôi lặp từ 2 đến num-1. Nếu một trong các giá trị đó trở
thành ước số thì cờ sẽ được đặt thành 1. Sau khi vòng lặp kết thúc, chúng tôi sẽ kiểm tra xem cờ đã được đặt hay
chưa. Nếu đúng như vậy thì chúng ta biết có một ước số và num không phải là số nguyên tố. Nếu không thì số đó
Nhiệm vụ lập trình phổ biến là tìm giá trị lớn nhất hoặc nhỏ nhất trong một chuỗi giá trị. Đây là một ví dụ trong
đó chúng tôi yêu cầu người dùng nhập mười số dương và sau đó chúng tôi in số lớn nhất.
Chìa khóa ở đây là biến lớn nhất theo dõi số lượng lớn nhất được tìm thấy cho đến nay. Chúng tôi bắt đầu bằng
cách đặt nó bằng số đầu tiên của người dùng. Sau đó, mỗi khi chúng tôi nhận được số mới từ người dùng, chúng tôi
sẽ kiểm tra xem số của người dùng có lớn hơn giá trị lớn nhất hiện tại hay không (được lưu trữ ở mức lớn nhất).
Nếu đúng như vậy thì chúng tôi đặt giá trị lớn nhất bằng số lượng của người dùng.
Thay vào đó, nếu chúng ta muốn giá trị nhỏ nhất thì thay đổi duy nhất cần thiết là > trở thành <, mặc dù cũng tốt
hơn nếu đổi tên biến lớn nhất thành nhỏ nhất.
Sau này, khi xem danh sách, chúng ta sẽ thấy một cách ngắn hơn để tìm các giá trị lớn nhất và nhỏ nhất, nhưng kỹ
thuật trên rất hữu ích để biết vì đôi khi bạn có thể gặp phải tình huống trong đó cách liệt kê không thực hiện
Một bình luận là một tin nhắn gửi đến ai đó đang đọc chương trình của bạn. Chú thích thường được sử dụng để mô tả
chức năng của một phần mã hoặc cách thức hoạt động của nó, đặc biệt với những phần mã phức tạp. Bình luận không có
Nhận xét một dòng Đối với nhận xét một dòng, hãy sử dụng ký tự # .
# một cách hơi lén lút để lấy hai giá trị cùng một lúc num1, num2 =
eval(input('Nhập hai số cách nhau bằng dấu phẩy: '))
Nhận xét nhiều dòng Đối với nhận xét trải dài trên nhiều dòng, bạn có thể sử dụng dấu ngoặc kép.
"""
Tên chương trình: Hello world
Tác giả: Brian Heinold
Một cách sử dụng hay cho dấu ngoặc kép là nhận xét các phần trong mã của bạn. Thường thì bạn sẽ muốn sửa đổi chương
trình của mình nhưng không muốn xóa mã cũ phòng trường hợp những thay đổi của bạn không hiệu quả. Bạn có thể nhận
xét mã cũ để nó vẫn ở đó nếu bạn cần và nó sẽ bị bỏ qua khi chương trình mới của bạn chạy. Đây là một ví dụ đơn giản:
"""
print(' Dòng này và dòng tiếp theo nằm trong một nhận xét.') print(' Những dòng
này sẽ không được thực thi.')
"""
print(' Dòng này không có trong bình luận và nó sẽ được thực thi.')
Dưới đây là hai kỹ thuật đơn giản để tìm ra lý do tại sao một chương trình không hoạt động:
1. Sử dụng trình bao Python. Sau khi chương trình của bạn chạy, bạn có thể nhập tên các biến của chương trình
để kiểm tra giá trị của chúng và xem biến nào có giá trị mà bạn mong đợi và biến nào không. Bạn cũng có thể
sử dụng Shell để nhập các phần nhỏ của chương trình và xem chúng có hoạt động không.
2. Thêm câu lệnh in vào chương trình của bạn. Bạn có thể thêm chúng vào bất kỳ thời điểm nào trong chương trình
của mình để xem giá trị của các biến là gì. Bạn cũng có thể thêm câu lệnh in để xem liệu có đạt đến một điểm
trong mã của bạn hay không. Ví dụ: nếu bạn cho rằng mình có thể mắc lỗi trong
Machine Translated by Google
một điều kiện của câu lệnh if, bạn có thể đặt câu lệnh in vào khối if để xem điều kiện có được kích
hoạt hay không.
Đây là một ví dụ từ một phần của chương trình số nguyên tố ở đầu chương này. Chúng ta đặt câu lệnh
print vào vòng lặp for để biết chính xác khi nào biến cờ được đặt:
flag = 0
num = eval(input('Nhập số: ')) for i in range(2,num):
if num%i==0:
cờ = 1 bản
in(i, cờ)
3. Một câu lệnh đầu vào trống, như bên dưới, có thể được sử dụng để tạm dừng chương trình của bạn tại một điểm cụ thể:
đầu vào()
Đó là một kỹ năng có giá trị là có thể đọc được mã. Trong phần này chúng ta sẽ xem xét kỹ hơn một số chương
trình đơn giản và cố gắng hiểu cách chúng hoạt động.
Ví dụ 1 Chương trình sau in ra Hello một số lần ngẫu nhiên trong khoảng từ 5 đến 25.
Dòng đầu tiên trong chương trình là câu lệnh nhập. Điều này chỉ cần xuất hiện một lần, thường là ở gần đầu
chương trình của bạn. Dòng tiếp theo tạo ra một số ngẫu nhiên trong khoảng từ 5 đến 25. Sau đó, hãy nhớ
rằng để lặp lại điều gì đó với số lần xác định, chúng ta sử dụng vòng lặp for. Để lặp lại điều gì đó 50
lần, chúng ta sẽ sử dụng range(50) trong vòng lặp for. Để lặp lại điều gì đó 100 lần, chúng ta sẽ sử dụng
phạm vi (100). Để lặp lại một số lần ngẫu nhiên, chúng ta có thể sử dụng phạm vi (Rand_num), trong đó
Rand_num là một biến chứa một số ngẫu nhiên. Mặc dù nếu muốn, chúng ta có thể bỏ qua biến và đặt câu lệnh
randint trực tiếp vào hàm phạm vi , như hiển thị bên dưới.
từ randint nhập khẩu ngẫu nhiên từ randint nhập khẩu ngẫu nhiên
Sự khác biệt duy nhất giữa các chương trình là ở vị trí của câu lệnh rand_num . TRONG
chương trình đầu tiên, nó nằm bên ngoài vòng lặp for và điều này có nghĩa là rand_num được đặt một lần
vào lúc bắt đầu chương trình và giữ nguyên giá trị đó trong suốt vòng đời của chương trình. Như vậy
mọi câu lệnh in sẽ in Xin chào với số lần giống nhau. Trong chương trình thứ hai,
câu lệnh rand_num nằm trong vòng lặp. Ngay trước mỗi câu lệnh in, rand_num được gán một
số ngẫu nhiên mới, do đó số lần Hello được in sẽ khác nhau tùy theo dòng.
Ví dụ 3 Chúng ta hãy viết một chương trình tạo ra 10000 số ngẫu nhiên trong khoảng từ 1 đến 100 và
đếm xem có bao nhiêu trong số chúng là bội số của 12. Dưới đây là những thứ chúng ta cần:
• Vì chúng ta đang sử dụng số ngẫu nhiên nên dòng đầu tiên của chương trình sẽ nhập
mô- đun ngẫu nhiên
• Bên trong vòng lặp, chúng ta cần tạo một số ngẫu nhiên, kiểm tra xem nó có chia hết cho không
12, nếu vậy thì cộng thêm 1 vào số đếm.
• Vì chúng ta đang đếm nên chúng ta cũng cần đặt số đếm bằng 0 trước khi bắt đầu đếm.
• Để kiểm tra khả năng chia hết cho 12, chúng ta sử dụng toán tử modulo, %,.
Khi chúng ta kết hợp tất cả những thứ này lại với nhau, chúng ta sẽ nhận được những điều sau:
đếm = 0
Một lỗi phổ biến là thụt lề không chính xác. Giả sử chúng ta lấy phần trên và thụt dòng cuối cùng.
Chương trình vẫn chạy nhưng không chạy như mong đợi.
count = 0 cho
Khi chúng tôi chạy nó, nó sẽ xuất ra cả đống số. Lý do cho điều này là bằng cách thụt lề câu lệnh in,
chúng ta đã biến nó thành một phần của vòng lặp for, do đó câu lệnh in sẽ được thực thi 10.000 lần.
Giả sử chúng ta thụt lề câu lệnh in thêm một bước nữa, như bên dưới.
đếm = 0
Bây giờ, nó không chỉ là một phần của vòng lặp for mà còn là một phần của câu lệnh if. Điều sẽ xảy ra là
mỗi khi chúng tôi tìm thấy bội số mới của 12, chúng tôi sẽ in số đếm. Cả ví dụ này lẫn ví dụ trước đều
không phải là điều chúng ta mong muốn. Chúng tôi chỉ muốn in số đếm một lần vào cuối chương trình, vì vậy
chúng tôi không muốn câu lệnh in bị thụt lề chút nào.
1. Viết chương trình đếm xem có bao nhiêu bình phương của các số từ 1 đến 100 tận cùng bằng một
1.
2. Viết chương trình đếm xem có bao nhiêu số bình phương từ 1 đến 100 tận cùng bằng số 4 và bao nhiêu
số tận cùng bằng số 9.
1
+···+ N )
1 1 + 2 3
3. Viết chương trình yêu cầu người dùng nhập giá trị n rồi tính (1+ ln(n). Hàm ln
đăng nhập vào module toán học .
5. Viết chương trình yêu cầu người dùng nhập một số và in tổng các ước của số đó. Tổng các ước của một số là
6. Một số được gọi là số hoàn hảo nếu nó bằng tổng các ước của nó, không kể chính số đó. Ví dụ: 6 là số hoàn
hảo vì các ước của 6 là 1, 2, 3, 6 và 6 = 1 + 2 + 3. Một ví dụ khác, 28 là số hoàn hảo vì các ước của nó
là 1, 2, 4, 7 , 14, 28 và 28 = 1 + 2 + 4 + 7 + 14. Tuy nhiên, 15 không phải là số hoàn hảo vì các ước của
nó là 1, 3, 5, 15 và 15 = 1 + 3 + 5. Viết chương trình tìm cả bốn số hoàn hảo nhỏ hơn 10000.
7. Một số nguyên được gọi là số nguyên nếu nó không chia hết cho bất kỳ số chính phương nào ngoài 1. Ví dụ:
là một hình vuông hoàn hảo. Mặt khác, 45 không phải là số chính phương vì nó chia hết cho 9, đây là một số
chính phương. Viết chương trình yêu cầu người dùng nhập một số nguyên và cho họ biết nó có phải là số
8. Viết chương trình hoán đổi giá trị của ba biến x, y, z sao cho x nhận giá trị
9. Viết chương trình đếm xem có bao nhiêu số nguyên từ 1 đến 1000 không phải là số chính phương, số lập phương
10. Yêu cầu người dùng nhập 10 điểm thi. Viết chương trình thực hiện các công việc sau:
kỳ điểm nào lớn hơn 100 thì sau khi nhập tất cả các điểm, in
một thông báo cảnh báo người dùng rằng giá trị trên 100 đã được nhập.
(e) Bỏ hai điểm thấp nhất và in ra điểm trung bình của các điểm còn lại.
11. Viết chương trình tính giai thừa của một số. Giai thừa, n!, của một số n là tích của tất cả các số nguyên
[Gợi ý: Hãy thử sử dụng phép nhân tương đương với kỹ thuật tính tổng.]
12. Viết chương trình yêu cầu người dùng đoán một số ngẫu nhiên trong khoảng từ 1 đến 10. Nếu đoán đúng, họ
được cộng 10 điểm vào điểm và trừ 1 điểm nếu đoán sai. Cung cấp cho người dùng năm số để đoán và in điểm
13. Ở chương trước có một bài tập yêu cầu bạn tạo một trò chơi nhân cho trẻ em. Cải thiện chương trình của bạn
từ bài tập đó để theo dõi số lượng câu trả lời đúng và sai. Khi kết thúc chương trình, hãy in một thông
báo khác nhau tùy thuộc vào số lượng câu hỏi mà người chơi trả lời đúng.
14. Bài tập này nói về bài toán Monty Hall nổi tiếng. Trong bài toán này, bạn là người tham gia một game show.
Người dẫn chương trình, Monty Hall, sẽ chỉ cho bạn ba cánh cửa. Đằng sau một trong những cánh cửa đó là
giải thưởng, và đằng sau hai cánh cửa còn lại là những con dê. Bạn chọn một cánh cửa. Monty Hall, người
Machine Translated by Google
biết giải thưởng nằm ở cánh cửa nào, sau đó mở một trong những cánh cửa không chứa giải
thưởng. Bây giờ chỉ còn hai cánh cửa và Monty cho bạn cơ hội để thay đổi lựa chọn của mình.
Nên giữ nguyên cửa, đổi cửa hay không?
(a) Viết chương trình mô phỏng việc chơi trò chơi này 10000 lần và tính toán bao nhiêu
phần trăm thời gian bạn sẽ thắng nếu bạn chuyển đổi và bao nhiêu phần trăm thời gian
bạn sẽ thắng nếu không chuyển đổi.
(b) Hãy thử cách trên nhưng với bốn cửa thay vì ba. Vẫn chỉ có một giải thưởng duy nhất và
Monty vẫn mở ra một cánh cửa rồi cho bạn cơ hội chuyển đổi.