Download as pdf or txt
Download as pdf or txt
You are on page 1of 66

Machine Translated by Google

Ben Stephenson

con trăn
Sách bài tập

Giới thiệu ngắn gọn với các bài tập

Phiên bản thứ hai


Machine Translated by Google

Ben Stephenson

Sách bài tập Python


Giới thiệu ngắn gọn với các bài tập

Phiên bản thứ hai

123
Machine Translated by Google

Giới thiệu về lập trình


1

Máy tính giúp chúng ta thực hiện nhiều công việc khác nhau. Chúng cho phép chúng ta đọc tin

tức, xem video, chơi trò chơi, viết sách, mua hàng hóa và dịch vụ, thực hiện các phân tích

toán học phức tạp, giao tiếp với bạn bè và gia đình, v.v. Tất cả các tác vụ này đều yêu cầu

người dùng cung cấp thông tin đầu vào, chẳng hạn như nhấp vào video để xem hoặc nhập các câu

nên có trong sách. Đáp lại, máy tính tạo đầu ra, chẳng hạn như in sách, phát âm thanh hoặc

hiển thị văn bản và hình ảnh trên màn hình.

Hãy xem xét các ví dụ trong đoạn trước. Làm thế nào mà máy tính biết đầu vào để yêu cầu?

Làm thế nào mà nó biết những hành động cần thực hiện để đáp ứng với đầu vào?

Làm thế nào nó biết đầu ra nào sẽ tạo ra và nó sẽ được trình bày ở dạng nào?

Câu trả lời cho tất cả những câu hỏi này là “một người đưa ra hướng dẫn cho máy tính và máy

tính thực hiện chúng”.

Một thuật toán là một chuỗi hữu hạn các bước hiệu quả để giải quyết một vấn đề. Một bước

có hiệu quả nếu nó rõ ràng và có thể thực hiện được. Số bước phải là hữu hạn (chứ không phải

vô hạn) để có thể hoàn thành tất cả các bước. Công thức nấu ăn, hướng dẫn lắp ráp đồ nội thất

hoặc đồ chơi và các bước cần thiết để mở khóa tổ hợp là những ví dụ về thuật toán mà chúng ta

gặp phải trong cuộc sống hàng ngày.

Hình thức trình bày thuật toán là linh hoạt và có thể được điều chỉnh cho phù hợp với vấn

đề mà thuật toán giải quyết. Tất cả các từ, số, đường thẳng, mũi tên, hình ảnh và các biểu

tượng khác đều có thể được sử dụng để truyền đạt các bước phải được thực hiện. Mặc dù các dạng

thuật toán sử dụng khác nhau, nhưng tất cả các thuật toán đều mô tả các bước có thể thực hiện

để hoàn thành một nhiệm vụ thành công.

Chương trình máy tính là một chuỗi các hướng dẫn điều khiển hành vi của máy tính. Các hướng

dẫn cho máy tính biết thời điểm thực hiện các tác vụ như đọc đầu vào và hiển thị kết quả cũng

như cách chuyển đổi và thao tác các giá trị để đạt được kết quả mong muốn. Một thuật toán phải

được dịch thành chương trình máy tính trước khi máy tính có thể được sử dụng để giải quyết vấn

đề. Quá trình dịch được gọi là lập trình và người thực hiện dịch được gọi là lập trình viên.
Machine Translated by Google

1 Giới thiệu về lập trình

Chương trình máy tính được viết bằng ngôn ngữ lập trình máy tính. Ngôn ngữ kết hợp chương

trình có các quy tắc cú pháp chính xác phải được tuân thủ cẩn thận. Nếu không làm như vậy sẽ

khiến máy tính báo lỗi thay vì thực hiện hướng dẫn của người lập trình. Một loạt các ngôn ngữ

khác nhau đã được tạo ra, mỗi ngôn ngữ đều có điểm mạnh và điểm yếu riêng. Các ngôn ngữ lập

trình phổ biến hiện nay bao gồm Java, C++, JavaScript, PHP, C# và Python, trong số những ngôn

ngữ khác. Mặc dù có sự khác biệt đáng kể giữa các ngôn ngữ này nhưng tất cả chúng đều cho

phép lập trình viên kiểm soát hành vi của máy tính.

Cuốn sách này sử dụng ngôn ngữ lập trình Python vì nó tương đối dễ học đối với các lập

trình viên mới và nó có thể được sử dụng để giải quyết nhiều vấn đề khác nhau.

Các câu lệnh Python đọc đầu vào bàn phím từ người dùng, thực hiện các phép tính và tạo đầu ra

văn bản được mô tả trong các phần tiếp theo. Các chương sau mô tả các cấu trúc ngôn ngữ lập

trình bổ sung có thể được sử dụng để giải quyết các vấn đề lớn hơn và phức tạp hơn.

1.1 Lưu trữ và Thao tác Giá trị

Biến là một vị trí được đặt tên trong bộ nhớ của máy tính chứa một giá trị. Trong Python, tên

biến phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới, theo sau là bất kỳ quốc gia kết hợp

nào của chữ cái, dấu gạch dưới và số.1 Biến được tạo bằng câu lệnh gán. Tên của biến mà chúng

ta muốn tạo xuất hiện ở bên trái của toán tử gán, được ký hiệu là =, và giá trị sẽ được lưu

trong biến xuất hiện ở bên phải của toán tử gán. Ví dụ: câu lệnh sau tạo một biến có tên x và

lưu 5 trong đó:

x=5

Phía bên phải của câu lệnh gán có thể là phép tính phức tạp tùy ý bao gồm dấu ngoặc đơn,

toán tử toán học, số và biến được tạo bởi câu lệnh gán trước đó (trong số những thứ khác).

Các toán tử toán học quen thuộc mà Python cung cấp bao gồm phép cộng (+), phép trừ (-), phép

nhân (*), phép chia (/) và phép lũy thừa (**). Các toán tử cũng được cung cấp để chia tầng

(//) và modulo (%). Toán tử chia sàn tính toán sàn của thương số có kết quả khi một số được

chia cho một số khác trong khi toán tử modulo tính toán phần còn lại khi một số được chia cho

một số khác.

Câu lệnh gán sau đây tính giá trị của một cộng x bình phương
và lưu trữ nó trong một biến mới có tên là y.

y=1+x ** 2

1Tên biến có phân biệt chữ hoa chữ thường. Do đó, đếm, Đếm và COUNT là các tên biến riêng
biệt, mặc dù chúng giống nhau.
Machine Translated by Google

1.1 Lưu trữ và Thao tác Giá trị

Python tôn trọng thứ tự thông thường của các quy tắc hoạt động cho các toán tử. Vì x là
5 (từ câu lệnh gán trước đó) và phép lũy thừa có quyền ưu tiên cao hơn phép cộng, nên
biểu thức ở bên phải của toán tử gán có giá trị là 26. Sau đó, giá trị này được lưu trữ
trong y.

Cùng một biến có thể xuất hiện ở cả hai phía của toán tử gán. Ví dụ:

y=y-6

Mặc dù phản ứng ban đầu của bạn có thể là một câu lệnh như vậy là không hợp lý, nhưng
trên thực tế, đó là một câu lệnh Python hợp lệ được đánh giá giống như các câu lệnh gán
mà chúng ta đã kiểm tra trước đây. Cụ thể, biểu thức ở bên phải của toán tử gán được đánh
giá và sau đó kết quả được lưu vào biến ở bên trái của toán tử gán. Trong trường hợp cụ
thể này, y là 26 khi câu lệnh bắt đầu thực thi, vì vậy 6 bị trừ khỏi y, kết quả là 20.
Sau đó, 20 được lưu vào y, thay thế cho 26 đã được lưu ở đó trước đó. Các lần sử dụng
tiếp theo của y sẽ đánh giá giá trị mới được lưu trữ là 20 (cho đến khi nó được thay đổi
bằng một câu lệnh gán khác).

1.2 Các hàm gọi

Có một số tác vụ mà nhiều chương trình phải thực hiện chẳng hạn như đọc các giá trị đầu
vào từ bàn phím, sắp xếp danh sách và tính căn bậc hai của một số.
Python cung cấp các hàm thực hiện các tác vụ phổ biến này, cũng như nhiều tác vụ khác.
Các chương trình mà chúng tôi tạo sẽ gọi các chức năng này để chúng tôi không phải tự
mình giải quyết các vấn đề này.
Một hàm được gọi bằng cách sử dụng tên của nó, theo sau là dấu ngoặc đơn. Nhiều hàm
yêu cầu các giá trị khi chúng được gọi, chẳng hạn như danh sách tên để sắp xếp hoặc số
mà căn bậc hai sẽ được tính. Các giá trị này, được gọi là đối số, được đặt bên trong dấu
ngoặc đơn khi hàm được gọi. Khi một lệnh gọi hàm có nhiều đối số, chúng được phân tách
bằng dấu phẩy.
Nhiều chức năng tính toán một kết quả. Kết quả này có thể được lưu trữ trong một biến
bằng cách sử dụng câu lệnh gán. Tên của biến xuất hiện ở bên trái toán tử gán và lệnh
gọi hàm xuất hiện ở bên phải toán tử gán. Ví dụ, câu lệnh gán sau đây gọi hàmround, làm
tròn một số thành số nguyên gần nhất.

r = vòng(q)

Biến q (đã được gán giá trị trước đó) được truyền dưới dạng đối số cho hàm round. Khi hàm
round thực thi, nó xác định số nguyên gần q nhất và trả về nó. Sau đó, số nguyên trả về
được lưu trữ trong r.
Machine Translated by Google

1 Giới thiệu về lập trình

1.2.1 Đầu vào đọc

Các chương trình Python có thể đọc đầu vào từ bàn phím bằng cách gọi hàm nhập liệu.
Chức năng này làm cho chương trình dừng lại và đợi người dùng nhập nội dung nào đó.
Khi người dùng nhấn phím enter, các ký tự do người dùng nhập sẽ được hàm nhập trả
về. Sau đó chương trình tiếp tục thực thi. Các giá trị đầu vào thường được lưu trữ
trong một biến bằng cách sử dụng câu lệnh gán để chúng có thể được sử dụng sau này
trong chương trình. Ví dụ, câu lệnh sau đọc một giá trị do người dùng nhập vào và
lưu trữ nó trong một biến có tên là a.

một = đầu vào()

Hàm đầu vào luôn trả về một chuỗi, đó là thuật ngữ khoa học máy tính cho một
chuỗi ký tự. Nếu giá trị đang được đọc là tên người, tên sách hoặc tên đường thì
việc lưu trữ giá trị dưới dạng chuỗi là phù hợp.
Nhưng nếu giá trị là số, chẳng hạn như tuổi, nhiệt độ hoặc chi phí bữa ăn tại nhà
hàng, thì chuỗi do người dùng nhập thường được chuyển đổi thành số. Lập trình viên
phải quyết định xem kết quả của việc chuyển đổi phải là số nguyên hay số dấu phẩy
động (một số có thể bao gồm các chữ số ở bên phải dấu thập phân). Chuyển đổi thành
một số nguyên được thực hiện bằng cách gọi hàm int trong khi chuyển đổi thành số
dấu phẩy động được thực hiện bằng cách gọi hàm float.
Người ta thường gọi các hàm int và float trong cùng một trạng thái gán để đọc
một giá trị đầu vào từ người dùng. Ví dụ: các câu lệnh sau đọc tên của khách hàng,
số lượng mặt hàng mà họ muốn mua và giá của mặt hàng đó. Mỗi giá trị này được lưu
trữ trong biến riêng của nó với một câu lệnh gán. Tên được lưu dưới dạng chuỗi, số
lượng được lưu dưới dạng số nguyên và giá được lưu dưới dạng số dấu phẩy động.

name = input("Nhập tên của bạn: ") số lượng =


int(input("Có bao nhiêu mặt hàng?")) giá = float(input("Chi phí
mỗi mặt hàng?"))

Lưu ý rằng một đối số được cung cấp cho hàm đầu vào mỗi khi nó được gọi. Đối số
này, là tùy chọn, là lời nhắc cho người dùng biết nội dung cần nhập.
Dấu nhắc phải là chuỗi. Nó được đặt trong dấu ngoặc kép để Python biết coi các ký
tự là một chuỗi thay vì hiểu chúng là tên của hàm hoặc biến.

Các phép tính toán học có thể được thực hiện trên cả số nguyên và số dấu phẩy
động. Ví dụ: có thể tạo một biến khác chứa tổng chi phí của các mặt hàng bằng câu
lệnh gán sau:

tổng = số lượng * giá

Câu lệnh này sẽ chỉ thực hiện thành công nếu số lượng và giá đã được chuyển đổi
thành số bằng cách sử dụng các hàm int và float được mô tả trước đó.
Cố gắng nhân các giá trị này mà không chuyển đổi chúng thành số sẽ khiến chương
trình Python của bạn gặp sự cố.
Machine Translated by Google

1.2 Các hàm gọi

1.2.2 Hiển thị đầu ra

Đầu ra văn bản được tạo bằng chức năng in. Nó có thể được gọi với một đối số,
đó là giá trị sẽ được hiển thị. Ví dụ: các câu lệnh sau in số 1, chuỗi Hello!,
và bất kỳ thứ gì hiện được lưu trữ trong biến x. Giá trị trong x có thể là một
số nguyên, một số dấu phẩy động, một chuỗi hoặc một giá trị thuộc một số loại
khác mà chúng ta chưa thảo luận. Mỗi mục được hiển thị trên dòng riêng của mình.

print(1)
print("Xin chào!")
print(x)

Nhiều giá trị có thể được in với một lệnh gọi hàm bằng cách cung cấp một số
đối số cho hàm in. Các đối số bổ sung được phân tách bằng dấu phẩy.
Ví dụ:

print("Khi x là", x, "giá trị của y là", y)

Tất cả các giá trị này được in trên cùng một dòng. Các đối số được đặt trong dấu
ngoặc kép là các chuỗi được hiển thị chính xác như đã nhập. Các đối số khác là
các biến. Khi một biến được in, Python sẽ hiển thị giá trị hiện được lưu trữ
trong đó. Một khoảng trắng sẽ tự động được bao gồm giữa mỗi mục khi nhiều mục
được in.
Các đối số cho lệnh gọi hàm có thể là các giá trị và biến, như đã trình bày trước đó.
Chúng cũng có thể là các biểu thức phức tạp tùy ý liên quan đến dấu ngoặc đơn,
toán tử toán học và các lời gọi hàm khác. Hãy xem xét tuyên bố sau:

print("Tích của", x, "và", y, "là", x * y)

Khi nó thực thi, sản phẩm, x*y, được tính toán và sau đó được hiển thị cùng với
tất cả các đối số khác của hàm in.

1.2.3 Nhập chức năng bổ sung

Một số chức năng, như đầu vào và in được sử dụng trong nhiều chương trình trong khi
những chức năng khác không được sử dụng rộng rãi. Các chức năng được sử dụng phổ biến
nhất có sẵn trong tất cả các chương trình, trong khi các chức năng khác ít được sử
dụng hơn được lưu trữ trong các mô-đun mà người lập trình có thể nhập khi cần. Ví dụ,
các chức năng toán học bổ sung nằm trong mô-đun toán học. Nó có thể được nhập bằng
cách thêm câu lệnh sau vào đầu chương trình của bạn:

nhập toán

Các hàm trong mô-đun toán học bao gồm sqrt, ceil và sin, trong số nhiều hàm
khác. Hàm được nhập từ mô-đun được gọi bằng cách sử dụng tên mô-đun,
Machine Translated by Google

1 Giới thiệu về lập trình

theo sau là dấu chấm, theo sau là tên của hàm và các đối số của nó. Ví dụ: câu lệnh sau đây tính căn bậc

hai của y (phải được khởi tạo trước đó) và lưu kết quả vào z bằng cách gọi hàm sqrt của mô-đun toán học.

z = math.sqrt(y)

Các mô-đun Python thường được sử dụng khác bao gồm ngẫu nhiên, thời gian và sys, trong số những mô-đun
khác. Thông tin thêm về tất cả các mô-đun này có thể được tìm thấy trực tuyến.

1.3 Nhận xét

Chú thích cho người lập trình cơ hội để giải thích cái gì, như thế nào hoặc tại sao họ đang làm điều gì

đó trong chương trình của họ. Thông tin này có thể rất hữu ích khi quay lại một dự án sau khi rời xa nó

trong một khoảng thời gian hoặc khi làm việc trên một chương trình do người khác tạo ban đầu. Máy tính

bỏ qua tất cả các chú thích trong chương trình. Chúng chỉ được đưa vào để mang lại lợi ích cho mọi người.

Trong Python, phần đầu của một bình luận được biểu thị bằng ký tự #. Nhận xét tiếp tục từ ký tự # đến

cuối dòng. Một nhận xét có thể chiếm toàn bộ một dòng hoặc chỉ một phần của nó, với nhận xét xuất hiện ở

bên phải của câu lệnh Python.

Các tệp Python thường bắt đầu bằng một nhận xét mô tả ngắn gọn mục đích của chương trình. Điều này

cho phép bất kỳ ai đang xem tệp có thể nhanh chóng xác định chức năng của chương trình mà không cần kiểm

tra kỹ mã của nó. Nhận xét mã của bạn cũng giúp dễ dàng xác định dòng nào thực hiện từng tác vụ cần

thiết để tính toán kết quả của chương trình. Bạn được khuyến khích viết các nhận xét kỹ lưỡng khi hoàn

thành tất cả các bài tập trong cuốn sách này.

1.4 Giá trị định dạng

Đôi khi kết quả của một phép tính toán học sẽ là một số dấu phẩy động có nhiều chữ số ở bên phải dấu

thập phân. Mặc dù người ta có thể muốn hiển thị tất cả các chữ số trong một số chương trình, nhưng có

những trường hợp khác mà giá trị phải được làm tròn đến một số vị trí thập phân cụ thể. Một chương trình

không liên quan khác có thể xuất ra một số lượng lớn các số nguyên cần được xếp thành hàng trong các cột.

Các cấu trúc định dạng của Python cho phép chúng ta hoàn thành những nhiệm vụ này và nhiều nhiệm vụ khác.

Một lập trình viên cho Python biết cách định dạng một giá trị bằng cách sử dụng bộ xác định định

dạng. Trình xác định là một chuỗi các ký tự mô tả nhiều chi tiết định dạng.

Nó sử dụng một ký tự để cho biết loại định dạng nào sẽ được thực hiện. Ví dụ: ký tự f cho biết giá trị

phải được định dạng dưới dạng số dấu phẩy động trong khi quảng cáo hoặc ký tự i cho biết giá trị phải

được định dạng dưới dạng số nguyên thập phân (cơ số 10) và ký tự s cho biết giá trị phải được định dạng

là một chuỗi. Nhân vật


Machine Translated by Google

1.4 Giá trị định dạng

có thể đứng trước f, d, i hoặc s để kiểm soát các chi tiết định dạng bổ sung. Chúng
ta sẽ chỉ xem xét các vấn đề về định dạng một số dấu phẩy động sao cho nó bao gồm
một số chữ số cụ thể ở bên phải dấu thập phân và định dạng các giá trị sao cho chúng
chiếm một số ký tự tối thiểu (cho phép in các giá trị trong cột). xếp hàng đẹp mắt).
Nhiều tác vụ định dạng bổ sung có thể được thực hiện bằng cách sử dụng các công cụ
xác định định dạng, nhưng những tác vụ này nằm ngoài phạm vi của cuốn sách này.
Một số dấu phẩy động có thể được định dạng để bao gồm một số vị trí thập phân cụ
thể bằng cách bao gồm dấu thập phân và số chữ số mong muốn ngay phía trước f trong
định dạng định dạng. Ví dụ: .2f được sử dụng để chỉ ra rằng một giá trị phải được
định dạng dưới dạng số dấu phẩy động có hai chữ số ở bên phải dấu thập phân trong
khi .7f chỉ ra rằng 7 chữ số sẽ xuất hiện ở bên phải dấu thập phân. Làm tròn được
thực hiện khi số chữ số ở bên phải dấu thập phân bị giảm. Số 0 được thêm vào nếu số
chữ số được tăng lên. Không thể chỉ định số chữ số ở bên phải dấu thập phân khi định
dạng số nguyên và chuỗi.

Tất cả các số nguyên, số dấu phẩy động và chuỗi đều có thể được định dạng sao cho
chúng chiếm ít nhất một số chiều rộng tối thiểu. Việc chỉ định chiều rộng tối thiểu
sẽ hữu ích khi tạo đầu ra bao gồm các cột giá trị cần được xếp thành hàng. Số lượng
ký tự tối thiểu để sử dụng được đặt trước d, i, f hoặc s và trước dấu thập phân và
số chữ số ở bên phải dấu thập phân (nếu có).
Ví dụ: 8d chỉ ra rằng một giá trị phải được định dạng dưới dạng số nguyên thập phân
chiếm tối thiểu 8 ký tự trong khi 6.2f chỉ ra rằng một giá trị phải được định dạng
dưới dạng số dấu phẩy động sử dụng tối thiểu 6 ký tự, bao gồm dấu thập phân và dấu
phẩy động. hai chữ số bên phải nó. Khoảng trắng ở đầu được thêm vào giá trị được
định dạng, khi cần, để đạt được số lượng ký tự tối thiểu.
Cuối cùng, khi các ký tự định dạng chính xác đã được xác định, dấu phần trăm (%)
sẽ được thêm vào trước chúng. Một định dạng định dạng thường xuất hiện trong một
chuỗi. Nó có thể là các ký tự duy nhất trong chuỗi hoặc nó có thể là một phần của
tin nhắn dài hơn. Ví dụ về các chuỗi xác định định dạng hoàn chỉnh bao gồm "%8d",
"Số tiền nợ là %.2f" và "Xin chào %s! Chào mừng bạn lên tàu!".

Khi bộ định dạng định dạng đã được tạo, toán tử định dạng, ký hiệu là %, được sử
dụng để định dạng một giá trị.2 Chuỗi chứa bộ định dạng xuất hiện ở bên trái của
toán tử định dạng. Giá trị được định dạng xuất hiện ở bên phải của nó. Khi toán tử
định dạng được đánh giá, giá trị bên phải được chèn vào chuỗi bên trái (tại vị trí
của định dạng định dạng sử dụng định dạng được chỉ định) để tính toán kết quả của
toán tử. Bất kỳ ký tự nào trong chuỗi không phải là một phần của bộ xác định định
dạng sẽ được giữ lại mà không sửa đổi. Nhiều giá trị có thể được định dạng đồng thời
bằng cách bao gồm nhiều chỉ định định dạng trong chuỗi ở bên trái của toán tử định
dạng và bằng dấu phẩy phân tách tất cả các giá trị sẽ được định dạng bên trong dấu
ngoặc đơn ở bên phải của toán tử định dạng.

2Python cung cấp một số cơ chế khác nhau để định dạng chuỗi bao gồm toán tử định dạng, hàm định dạng và
phương thức định dạng, chuỗi mẫu và gần đây nhất là chuỗi f.
Chúng ta sẽ sử dụng toán tử định dạng cho tất cả các ví dụ và bài tập trong cuốn sách này nhưng cũng có
thể sử dụng các kỹ thuật khác để đạt được kết quả tương tự.
Machine Translated by Google

1 Giới thiệu về lập trình

Định dạng chuỗi thường được thực hiện như một phần của câu lệnh in. Câu lệnh
in đầu tiên trong đoạn mã sau hiển thị giá trị của biến x, với đúng hai chữ số ở
bên phải dấu thập phân. Câu lệnh in thứ hai định dạng hai giá trị trước khi hiển
thị chúng như một phần của thông báo đầu ra lớn hơn.

print("%.2f" % x)
print("%s đã ăn %d cookie!" % (tên, numCookies))

Một số ví dụ định dạng bổ sung được hiển thị trong bảng sau. Các biến x, y và
z trước đó đã được gán lần lượt là 12, -2,75 và "Andrew".

Đoạn mã: "%d" %x


Kết quả: "12"

Giải trình: Giá trị được lưu trữ trong x được định dạng dưới dạng số nguyên thập phân

Đoạn mã: (cơ số 10). "%f" %y "-2,75"


Kết quả:

Giải trình: Giá trị được lưu trữ trong y được định dạng dưới dạng số
Đoạn mã: dấu phẩy động. "%d và %f" % (x, y) "12 và -2,75"
Kết quả:

Giải trình: Giá trị được lưu trữ trong inxis được định dạng dưới dạng số nguyên thập phân (cơ

số 10) và giá trị được lưu trữ trong y được định dạng dưới dạng số dấu phẩy động.

Các ký tự khác trong chuỗi được giữ lại mà không sửa đổi. "%.4f" % x

Đoạn mã:
Kết quả: "12.0000"

Giải trình: Giá trị được lưu trữ trong x được định dạng dưới dạng số dấu phẩy động
có 4 chữ số ở bên phải dấu thập phân. "%.1f" % y "-2,8"
Đoạn mã:
Kết quả:

Giải trình: Giá trị được lưu trữ trong y được định dạng dưới dạng số dấu phẩy động
có 1 chữ số ở bên phải dấu thập phân. Giá trị được làm tròn khi định
dạng vì số chữ số ở bên phải dấu thập phân đã giảm. "%10s" %z
Đoạn mã:
Kết quả:
" Andrew"

Giải trình: Giá trị được lưu trữ trong z được định dạng dưới dạng chuỗi sao cho nó
chiếm ít nhất 10 khoảng trắng. Vì z chỉ dài 6 ký tự nên bao gồm 4 dấu cách ở đầu
Trong kết quả.

Đoạn mã: "%4s" %z


Kết quả: "Andrew"

Giải trình: Giá trị được lưu trữ trong z được định dạng dưới dạng chuỗi sao cho nó
chiếm ít nhất 4 khoảng trắng. Vì z dài hơn độ dài tối thiểu đã chỉ định
nên chuỗi kết quả bằng z. "%8i%8i" % (x, y) 12 -2"
Đoạn mã:
Kết quả:
"

Giải trình: Cả x và y đều được định dạng dưới dạng số nguyên thập phân (cơ số 10) chiếm
tối thiểu 8 khoảng trắng. Không gian hàng đầu được thêm vào khi cần thiết.
Các chữ số ở bên phải dấu thập phân bị cắt bớt (không làm tròn) khi y (số dấu
phẩy động) được định dạng dưới dạng số nguyên.
Machine Translated by Google

1.5 Làm việc với chuỗi

1.5 Làm việc với chuỗi

Giống như các số, các chuỗi có thể được thao tác bằng các toán tử và được chuyển đến các hàm.

Các thao tác thường được thực hiện trên chuỗi bao gồm nối hai chuỗi, tính toán độ dài của

chuỗi và trích xuất các ký tự riêng lẻ từ một chuỗi. Các hoạt động phổ biến này được mô tả

trong phần còn lại của phần này.

Thông tin về các hoạt động chuỗi khác có thể được tìm thấy trực tuyến.

Các chuỗi có thể được nối bằng toán tử +. Chuỗi bên phải của toán tử được nối với chuỗi

bên trái của toán tử để tạo thành chuỗi mới.

Ví dụ: chương trình sau đọc hai chuỗi từ người dùng là họ và tên của một người. Sau đó, nó

sử dụng phép nối chuỗi để tạo một chuỗi mới là họ của người đó, theo sau là dấu phẩy và

khoảng trắng, tiếp theo là tên của người đó. Sau đó, kết quả của phép nối được hiển thị.

# Đọc tên từ người dùng


first = input("Nhập họ: ") last = input("Nhập họ:")

# Nối cả hai chuỗi =


last + ", " + đầu tiên

# Hiển thị bản in


kết quả (cả hai)

Số ký tự trong một chuỗi được gọi là độ dài của chuỗi. Giá trị này, luôn là một số nguyên

không âm, được tính bằng cách gọi hàm len. Một chuỗi được truyền cho hàm dưới dạng đối số

duy nhất của nó và độ dài của chuỗi đó được trả về dưới dạng kết quả duy nhất của nó. Ví dụ

sau minh họa hàm len bằng cách tính toán độ dài tên của một người.

# Đọc tên người dùng trước =


input("Nhập tên của bạn:")

# Tính độ dài của nó


num_chars = len(first)

# Hiển thị kết quả


print("Tên bạn chứa", num_chars, "characters")

Đôi khi cần phải truy cập các ký tự riêng lẻ trong một chuỗi. Ví dụ: một người có thể

muốn trích xuất ký tự đầu tiên từ mỗi chuỗi trong số ba chuỗi chứa tên, tên đệm và họ để hiển

thị tên viết tắt của một người.

Mỗi ký tự trong một chuỗi có một chỉ số nguyên duy nhất. Ký tự đầu tiên trong chuỗi có

chỉ số 0 trong khi ký tự cuối cùng trong chuỗi có chỉ số bằng độ dài của chuỗi, trừ đi một.

Một ký tự đơn trong chuỗi được truy cập bằng cách đặt chỉ mục của nó bên trong dấu ngoặc

vuông sau tên của biến chứa chuỗi. Chương trình sau đây chứng minh điều này bằng cách hiển

thị tên viết tắt của một người.


Machine Translated by Google

1 Giới thiệu về lập trình

# Đọc tên người dùng


trước = input("Nhập tên của bạn: ") middle = input("Nhập
tên đệm của bạn:") last = input("Nhập họ của bạn:")

# Trích xuất ký tự đầu tiên từ mỗi chuỗi và nối chúng lại ký


tự đầu tiên = first[0] + middle[0] + last[0]

# Hiển thị bản in


tắt ("Tên viết tắt của bạn là", viết tắt)

Một số ký tự liên tiếp trong một chuỗi có thể được truy cập bằng cách bao gồm hai chỉ số,

được phân tách bằng dấu hai chấm, bên trong dấu ngoặc vuông. Điều này được gọi là cắt một chuỗi.

Cắt chuỗi có thể được sử dụng để truy cập nhiều ký tự trong một chuỗi một cách hiệu quả.
thái độ.

1.6 Bài tập

Các bài tập trong chương này sẽ cho phép bạn áp dụng các khái niệm đã thảo luận trước đây vào

thực tế. Mặc dù các nhiệm vụ mà chúng yêu cầu bạn hoàn thành nói chung là nhỏ, nhưng việc giải

các bài tập này là một bước quan trọng để tạo ra các chương trình lớn hơn nhằm giải các bài

toán thú vị hơn.

Bài tập 1: Địa chỉ gửi thư

Tạo một chương trình hiển thị tên của bạn và địa chỉ gửi thư đầy đủ. Địa chỉ phải được in ở

định dạng thường được sử dụng ở khu vực bạn sinh sống. Chương trình của bạn không cần đọc bất

kỳ đầu vào nào từ người dùng.

Bài tập 2: Xin chào

Viết chương trình yêu cầu người dùng nhập tên của mình. Chương trình sẽ phản
hồi bằng một thông báo chào người dùng, sử dụng tên của họ.

Bài tập 3: Diện tích căn phòng

Viết chương trình yêu cầu người dùng nhập chiều rộng và chiều dài của một căn phòng. Khi các

giá trị này đã được đọc, chương trình của bạn sẽ tính toán và hiển thị diện tích của căn phòng.

Chiều dài và chiều rộng sẽ được nhập dưới dạng số dấu phẩy động. Bao gồm các đơn vị trong lời

nhắc và thông báo đầu ra của bạn; feet hoặc mét, tùy thuộc vào đơn vị mà bạn cảm thấy thoải

mái hơn khi làm việc.


Machine Translated by Google

1.6 Bài tập

Bài tập 4: Diện tích của một lĩnh vực

Tạo một chương trình đọc chiều dài và chiều rộng của cánh đồng của một nông dân từ người dùng tính bằng

feet. Hiển thị diện tích của cánh đồng tính bằng mẫu Anh.

Gợi ý: Có 43.560 feet vuông trong một mẫu Anh.

Bài tập 5: Đóng chai

Ở nhiều khu vực pháp lý, một khoản tiền gửi nhỏ được thêm vào các hộp đựng đồ uống để khuyến

khích mọi người tái chế chúng. Tại một khu vực pháp lý cụ thể, các hộp đựng đồ uống chứa một

lít trở xuống phải đặt cọc 0,1 đô la và các hộp đựng đồ uống chứa nhiều hơn một lít phải đặt

cọc 0,25 đô la.

Viết chương trình đọc số lượng container của mỗi kích thước từ người dùng.

Chương trình của bạn sẽ tiếp tục bằng cách tính toán và hiển thị số tiền hoàn lại sẽ nhận

được khi trả lại các thùng chứa đó. Định dạng đầu ra sao cho bao gồm ký hiệu đô la và hai

chữ số ở bên phải dấu thập phân.

Bài tập 6: Thuế và tiền tip

Chương trình mà bạn tạo cho bài tập này sẽ bắt đầu bằng cách đọc chi phí của một bữa ăn được

đặt tại một nhà hàng từ người dùng. Sau đó, chương trình của bạn sẽ tính thuế và tiền boa

cho bữa ăn. Sử dụng thuế suất địa phương của bạn khi tính toán số tiền thuế nợ.

Tính tiền boa bằng 18 phần trăm số tiền bữa ăn (không có thuế). Đầu ra từ chương trình của

bạn phải bao gồm số tiền thuế, số tiền boa và tổng số tiền lớn cho bữa ăn bao gồm cả thuế và

tiền boa. Định dạng đầu ra để tất cả các giá trị được hiển thị bằng hai chữ số thập phân.

Bài tập 7: Tổng n số nguyên dương đầu tiên

Viết chương trình đọc một số nguyên dương n từ người dùng và sau đó hiển thị tổng của tất cả

các số nguyên từ 1 đến n. Tổng của n số nguyên dương đầu tiên có thể được tính bằng công

thức:

(n)(n + 1) 2
tổng =
Machine Translated by Google

1 Giới thiệu về lập trình

Bài tập 8: Widget và Gizmos

Một nhà bán lẻ trực tuyến bán hai sản phẩm: widget và gizmos. Mỗi widget nặng 75
gram. Mỗi gizmo nặng 112 gram. Viết chương trình đọc số widget và số gizmos từ
người dùng. Sau đó, chương trình của bạn sẽ tính toán và hiển thị tổng trọng
lượng của các bộ phận.

Bài tập 9: Lãi kép

Giả sử rằng bạn vừa mở một tài khoản tiết kiệm mới với lãi suất 4%/năm. Tiền lãi
mà bạn kiếm được sẽ được trả vào cuối năm và được cộng vào số dư của tài khoản
tiết kiệm. Viết chương trình bắt đầu bằng cách đọc số tiền được gửi vào tài khoản
từ người dùng. Sau đó, chương trình của bạn sẽ tính toán và hiển thị số tiền
trong tài khoản tiết kiệm sau 1, 2 và 3 năm. Hiển thị từng số tiền sao cho nó
được làm tròn đến 2 chữ số thập phân.

Bài tập 10: Cấp số cộng

Tạo chương trình đọc hai số nguyên a và b từ người dùng. Chương trình của bạn sẽ
tính toán và hiển thị:

• Tổng của a và b •
Hiệu khi b trừ a • Tích của a và b • Thương

khi a chia cho b • Số dư khi a chia cho b


Machine Translated by Google

Quyết định
2

Các chương trình mà bạn đã làm việc trong Chap. 1 tuần tự nghiêm ngặt. Mỗi câu lệnh của
chương trình được thực hiện theo thứ tự, bắt đầu từ phần đầu của chương trình và tiếp
tục, không bị gián đoạn, cho đến khi kết thúc chương trình. Mặc dù việc thực hiện tuần
tự mọi câu lệnh trong một chương trình có thể được sử dụng để giải một số bài tập nhỏ,
nhưng nó không đủ để giải hầu hết các bài toán thú vị.
Các cấu trúc ra quyết định cho phép các chương trình chứa các câu lệnh có thể hoặc
không thể được thực thi khi chương trình chạy. Quá trình thực thi vẫn bắt đầu ở đầu
chương trình và tiến dần về phía dưới, nhưng một số câu lệnh có trong chương trình có
thể bị bỏ qua. Điều này cho phép các chương trình thực hiện các tác vụ khác nhau cho các
giá trị đầu vào khác nhau và làm tăng đáng kể số lượng bài toán mà chương trình Python
có thể giải quyết.

2.1 Câu lệnh If

Các chương trình Python đưa ra quyết định bằng cách sử dụng câu lệnh if. Câu lệnh if bao
gồm một điều kiện và một hoặc nhiều câu lệnh tạo thành phần thân của câu lệnh if. Khi
một câu lệnh if được thực thi, điều kiện của nó được đánh giá để xác định xem các câu

lệnh trong phần thân của nó có thực thi hay không. Nếu điều kiện đánh giá là True thì
phần thân của câu lệnh if sẽ thực thi, tiếp theo là phần còn lại của các câu lệnh trong
chương trình. Nếu điều kiện của câu lệnh if được đánh giá là Sai thì phần thân của câu
lệnh if sẽ bị bỏ qua và việc thực thi tiếp tục ở dòng đầu tiên sau phần thân của câu
lệnh if.

Điều kiện trên câu lệnh if có thể là một biểu thức phức tạp tùy ý đánh giá là Đúng
hoặc Sai. Biểu thức như vậy được gọi là biểu thức Boolean, được đặt theo tên của George
Boole (1815–1864), người tiên phong trong logic hình thức.
Điều kiện của câu lệnh if thường bao gồm một toán tử quan hệ so sánh hai

© Springer Nature Thụy Sĩ AG 2019 B.


Stephenson, Sách bài tập Python, Văn bản trong Khoa học Máy
tính, https://doi.org/10.1007/978-3-030-18873-3_2
Machine Translated by Google

2 Ra quyết định

giá trị, biến hoặc biểu thức phức tạp. Các toán tử quan hệ của Python được liệt kê
bên dưới.

Ý nghĩa quan hệ

Nhà điều hành

< Ít hơn

<= Ít hơn hoặc bằng


> Lớn hơn

>= Lớn hơn hoặc bằng


==
Tương đương với

!= không bằng

Phần thân của câu lệnh if bao gồm một hoặc nhiều câu lệnh phải được thụt vào nhiều
hơn từ khóa if. Nó kết thúc trước dòng tiếp theo được thụt lề bằng (hoặc nhỏ hơn) từ
khóa if. Bạn có thể chọn số lượng khoảng trắng để sử dụng khi thụt lề phần nội dung
của câu lệnh if. Tất cả các chương trình được trình bày trong cuốn sách này đều sử
dụng hai khoảng trắng để thụt lề, nhưng bạn có thể sử dụng một hoặc nhiều khoảng
trắng, nếu bạn thích.1 Chương trình sau đọc một số từ người dùng, sử dụng hai câu
lệnh if để lưu một thông báo mô tả số vào biến kết quả, rồi hiển thị thông báo.
Mỗi điều kiện của câu lệnh if sử dụng một toán tử quan hệ để xác định xem phần thân
của nó, được thụt lề, sẽ thực thi hay không. Dấu hai chấm ngay sau mỗi điều kiện để
tách điều kiện của câu lệnh if ra khỏi phần thân của nó.

# Đọc một số từ người dùng

num = float(input("Nhập một số:"))

# Lưu trữ thông báo thích hợp trong kết


quả nếu num == 0:
result = "Số là 0"
nếu số != 0:
result = "Số không phải là số 0"

# Hiển thị bản in


thông báo (kết quả)

2.2 Câu lệnh If-Else

Ví dụ trước đã lưu một thông báo thành kết quả khi số do người dùng nhập bằng 0 và
nó lưu một thông báo khác thành kết quả khi số được nhập

1Hầu hết các lập trình viên chọn sử dụng cùng một số khoảng trắng mỗi khi họ thụt lề phần thân
của câu lệnh if, mặc dù Python không yêu cầu tính nhất quán này.
Machine Translated by Google

2.2 Câu lệnh If-Else

số khác không. Tổng quát hơn, các điều kiện trên câu lệnh if được xây dựng sao cho chính xác

một trong hai phần thân câu lệnh if sẽ thực thi. Không có cách nào để cả hai cơ thể thực thi

và không có cách nào để cả hai cơ thể thực thi.


Những điều kiện như vậy được cho là loại trừ lẫn nhau.

Câu lệnh if-else bao gồm phần if có điều kiện và phần thân, và phần other chứa phần thân

(nhưng không có điều kiện). Khi câu lệnh thực thi, điều kiện của nó được đánh giá. Nếu điều

kiện đánh giá là True thì phần thân của phần if sẽ thực thi và phần thân của phần khác sẽ bị

bỏ qua. Khi điều kiện đánh giá là Sai, phần thân của phần if bị bỏ qua và phần thân của phần

khác sẽ thực thi. Cả hai cơ thể đều không thể thực hiện và không thể bỏ qua cả hai cơ thể.

Kết quả là, một câu lệnh if-else có thể được sử dụng thay vì hai câu lệnh if khi câu lệnh if
này ngay sau câu lệnh kia và các điều kiện trên câu lệnh if là loại trừ lẫn nhau. Sử dụng

câu lệnh if-else là thích hợp hơn vì chỉ cần viết một điều kiện, chỉ cần đánh giá một điều

kiện khi chương trình thực thi và chỉ cần sửa một điều kiện nếu một lỗi được phát hiện vào

một thời điểm nào đó trong tương lai. Chương trình báo cáo liệu một giá trị có bằng 0 hay

không, được viết lại để nó sử dụng câu lệnh if-else, được hiển thị bên dưới.

# Đọc một số từ người dùng

num = float(input("Nhập một số:"))

# Lưu trữ thông báo thích hợp trong kết


quả nếu num == 0:
result = "Số là 0"

khác:

result = "Số không phải là số 0"

# Hiển thị bản in


thông báo (kết quả)

Khi số do người dùng nhập bằng 0, điều kiện trên câu lệnh if-else sẽ đánh giá là True, do

đó, phần thân của phần if của câu lệnh sẽ thực thi và thông báo thích hợp được lưu vào kết

quả. Sau đó, phần thân của phần khác của câu lệnh sẽ bị bỏ qua. Khi số khác không, điều kiện

trong câu lệnh if-else sẽ đánh giá là Sai, do đó, phần thân của câu lệnh if bị bỏ qua. Vì

phần thân của phần if bị bỏ qua nên phần thân của phần khác được thực thi, lưu trữ một thông

báo khác vào kết quả. Trong cả hai trường hợp, Python tiếp tục và chạy phần còn lại của

chương trình, hiển thị thông báo.

2.3 Câu lệnh If-Elif-Else

Câu lệnh if-elif-else được sử dụng để thực hiện chính xác một trong số các lựa chọn thay thế.

Câu lệnh bắt đầu bằng phần if, theo sau là một hoặc nhiều phần elif, tiếp theo là phần other.

Tất cả các bộ phận này phải bao gồm một cơ thể được thụt vào. Mỗi phần if và elif cũng phải

bao gồm một điều kiện đánh giá là Đúng hoặc Sai.
Machine Translated by Google

2 Ra quyết định

Khi một câu lệnh if-elif-else được thực thi, điều kiện trên phần if được đánh
giá trước. Nếu nó đánh giá là True thì phần thân của phần if được thực thi và
tất cả phần elif và phần khác sẽ bị bỏ qua. Nhưng nếu điều kiện của phần if đánh
giá là Sai thì phần thân của nó bị bỏ qua và Python tiếp tục và đánh giá điều
kiện trên phần elif đầu tiên. Nếu điều kiện này được đánh giá là True thì phần
thân của phần elif đầu tiên sẽ thực thi và tất cả các điều kiện và phần thân còn
lại sẽ bị bỏ qua. Mặt khác, Python tiếp tục bằng cách đánh giá điều kiện trên
từng phần elif theo trình tự. Điều này tiếp tục cho đến khi một điều kiện được
tìm thấy đánh giá là Đúng. Sau đó, phần thân được liên kết với điều kiện đó được
thực thi và phần elif và các phần khác bị bỏ qua. Nếu Python đến phần khác của
câu lệnh (vì tất cả các điều kiện trên phần if và elif được đánh giá là Sai) thì
nó sẽ thực thi phần thân của phần khác.
Hãy mở rộng ví dụ trước để một thông báo được hiển thị cho các số dương, một
thông báo khác được hiển thị cho các số âm và một thông báo khác nữa được hiển
thị nếu số đó bằng không. Mặc dù chúng ta có thể giải quyết vấn đề này bằng cách
sử dụng kết hợp các câu lệnh if và/hoặc if-else, nhưng vấn đề này rất phù hợp với
câu lệnh if-elif-else vì phải thực hiện chính xác một trong ba lựa chọn thay thế.

# Đọc một số từ người dùng num =

float(input("Nhập số: "))

# Lưu trữ thông báo thích hợp trong kết quả


nếu số > 0:

result = "Đó là một số dương"


số Elif < 0:

result = "Đó là số âm"


khác:
kết quả = "Đó là số không"

# Hiển thị bản in


thông báo (kết quả)

Khi người dùng nhập một số dương, điều kiện trên phần if của câu lệnh đánh
giá là True để phần thân của phần if thực thi. Khi phần thân của phần if đã được
thực thi, chương trình sẽ tiếp tục bằng cách thực hiện câu lệnh in trên dòng
cuối cùng của nó. Phần thân của cả phần elif và phần khác đều bị bỏ qua mà không
đánh giá điều kiện trên phần elif của câu lệnh.
Khi người dùng nhập một số âm, điều kiện trên phần if của câu lệnh sẽ đánh
giá là Sai. Python bỏ qua phần thân của phần if và tiếp tục đánh giá điều kiện ở
phần elif của câu lệnh. Điều kiện này đánh giá là True, vì vậy phần thân của
phần elif được thực thi. Sau đó, phần khác được bỏ qua và chương trình tiếp tục
bằng cách thực hiện lệnh in.
Cuối cùng, khi người dùng nhập số không, điều kiện trên phần if của câu lệnh
sẽ đánh giá là Sai, do đó, phần thân của phần if bị bỏ qua và Python tiếp tục và
đánh giá điều kiện trên phần elif. Điều kiện của nó cũng đánh giá là Sai, vì vậy
Python tiếp tục và thực thi phần thân của phần khác. Sau đó, câu lệnh in cuối
cùng được thực thi.
Machine Translated by Google

2.3 Câu lệnh If-Elif-Else

Chính xác một trong số lượng lớn các tùy chọn tùy ý được thực thi bởi câu lệnh if-
elif-else. Câu lệnh bắt đầu bằng phần if, tiếp theo là nhiều phần elif nếu cần. Phần
khác luôn xuất hiện cuối cùng và phần thân của nó chỉ thực thi khi tất cả các điều kiện
trên phần if và elif đánh giá là Sai.

2.4 Câu lệnh If-Elif

Phần khác xuất hiện ở cuối câu lệnh if-elif-else là tùy chọn. Khi có phần khác, câu lệnh
sẽ chọn chính xác một trong số các tùy chọn. Bỏ qua cái khác chọn tối đa một trong số
các tùy chọn. Khi một câu lệnh if-elif được sử dụng, không có phần thân nào thực thi khi
tất cả các điều kiện đánh giá là Sai. Cho dù một trong các phần có thực thi hay không,

chương trình sẽ tiếp tục thực thi ở câu lệnh đầu tiên sau phần thân của phần elif cuối
cùng.

2.5 Câu lệnh If lồng nhau

Phần thân của bất kỳ phần if, phần elif hoặc phần khác của bất kỳ loại câu lệnh if nào
có thể chứa (gần như) bất kỳ câu lệnh Python nào, kể cả câu lệnh if, if-else, if-elif
hoặc if-elif-else khác. Khi một câu lệnh if (thuộc bất kỳ loại nào) xuất hiện trong phần
thân của câu lệnh if khác (thuộc bất kỳ loại nào) thì các câu lệnh if được cho là lồng nhau.
Chương trình sau đây bao gồm một câu lệnh if lồng nhau.

# Đọc một số từ người dùng num

= float(input("Nhập số: "))

# Lưu trữ thông báo thích hợp trong kết


quả nếu num > 0:

# Xác định tính từ nào nên được sử dụng để mô tả tính từ số = if


""
num >= 1000000:

tính từ = elif " thực sự lớn "


num >= 1000:
tính từ = " to lớn "

# Lưu trữ thông báo cho các số dương bao gồm kết quả tính từ thích hợp =
"Đó là a" + tính từ + "số dương"
số Elif < 0:

result = "Đó là số âm" other: result = "Đó là số 0"

# Hiển thị bản in


thông báo (kết quả)
Machine Translated by Google

2 Ra quyết định

Chương trình này bắt đầu bằng cách đọc một số từ người dùng. Nếu số được nhập bởi
người dùng lớn hơn 0 thì phần thân của câu lệnh if bên ngoài được thực thi.
Nó bắt đầu bằng cách gán một chuỗi chứa một khoảng trắng cho tính từ. Sau đó, câu lệnh
if-elif bên trong, được lồng bên trong câu lệnh if-elif-else bên ngoài, được thực thi.
Câu lệnh bên trong cập nhật tính từ thành thực sự lớn nếu số đã nhập ít nhất là
1.000.000 và nó cập nhật tính từ thành lớn nếu số đã nhập nằm trong khoảng từ 1.000
đến 999.999. Dòng cuối cùng trong phần thân của phần if bên ngoài lưu trữ thông báo
hoàn chỉnh trong kết quả và sau đó phần thân của phần elif bên ngoài và phần other bên
ngoài bị bỏ qua vì phần thân của phần if bên ngoài đã được thực thi.
Cuối cùng, chương trình hoàn thành bằng cách thực hiện câu lệnh in.
Bây giờ hãy xem điều gì sẽ xảy ra nếu số do người dùng nhập vào nhỏ hơn hoặc bằng
0. Khi điều này xảy ra, phần thân của câu lệnh if bên ngoài bị bỏ qua và phần thân của
phần elif bên ngoài hoặc phần thân của phần khác được thực thi. Cả hai trường hợp này
đều lưu trữ một thông báo thích hợp trong kết quả. Sau đó, việc thực thi tiếp tục với
câu lệnh in ở cuối chương trình.

2.6 Logic Boolean

Một biểu thức Boolean là một biểu thức đánh giá là Đúng hoặc Sai.
Biểu thức có thể bao gồm nhiều phần tử khác nhau, chẳng hạn như các giá trị Boolean
Đúng và Sai, các biến chứa giá trị Boolean, toán tử quan hệ và lệnh gọi các hàm trả
về kết quả Boolean. Các biểu thức Boolean cũng có thể bao gồm các toán tử Boolean kết
hợp và thao tác các giá trị Boolean. Python bao gồm ba toán tử Boolean: không, và, và
hoặc.
Toán tử not đảo ngược giá trị của một biểu thức Boolean. Nếu biểu thức, x, xuất
hiện ở bên phải của toán tử not, đánh giá là True thì not x đánh giá là Sai. Nếu x
đánh giá là Sai thì không phải x đánh giá là Đúng.

Hành vi của bất kỳ biểu thức Boolean nào có thể được mô tả bằng bảng chân lý. Một
bảng chân lý có một cột cho mỗi biến riêng biệt trong biểu thức Boolean, cũng như một
cột cho chính biểu thức đó. Mỗi hàng trong bảng chân lý đại diện cho một tổ hợp giá
trị Đúng và Sai cho các biến trong biểu thức. Một bảng chân lý cho một biểu thức có n
biến riêng biệt có 2n hàng, mỗi hàng hiển thị kết quả được tính toán bởi biểu thức cho
một tổ hợp giá trị khác nhau. Bảng chân lý cho toán tử not, được áp dụng cho một biến
duy nhất, x, có 21 = 2 hàng, như minh họa bên dưới.

x không x

Sai đúng

Đúng sai

Toán tử và và hoặc kết hợp hai giá trị Boolean để tính kết quả Boolean. Biểu thức
Boolean x và y đánh giá là True nếu x là True và y cũng là True. Nếu x là Sai, hoặc y
là Sai, hoặc cả x và y đều Sai thì x và
Machine Translated by Google

2.6 Logic Boolean

y đánh giá là Sai. Bảng chân lý cho toán tử and được hiển thị bên dưới. Nó có 22 =
4 hàng vì toán tử và được áp dụng cho hai biến.

x yx và y

Sai Sai Sai

Sai Đúng Sai

Đúng Sai Sai

Đúng Đúng Đúng

Biểu thức Boolean x hoặc y đánh giá là True nếu x là True hoặc nếu y là True hoặc
nếu cả x và y đều là True. Nó chỉ đánh giá là Sai nếu cả x và y là Sai.
Bảng chân trị cho toán tử or được hiển thị bên dưới:

x yx hoặc y

Sai Sai Sai

Sai Đúng Đúng

Đúng Sai Đúng

Đúng Đúng Đúng

Chương trình Python sau đây sử dụng toán tử hoặc để xác định xem giá trị do người
dùng nhập vào có phải là một trong 5 số nguyên tố đầu tiên hay không. Các toán tử
and và not có thể được sử dụng theo cách tương tự khi xây dựng một điều kiện phức tạp.

# Đọc một số nguyên từ người


dùng x = int(input("Nhập số nguyên: "))

# Xác định xem đó có phải là một trong 5 số nguyên tố đầu tiên hay
không và báo cáo kết quả nếu x == 2 hoặc x == 3 hoặc x == 5 hoặc x == 7 hoặc x == 11:

print("Đó không phải là một trong 5 số nguyên tố đầu tiên.")


else: print("Đó không phải là một trong 5 số nguyên tố đầu tiên.")

2.7 Bài tập

Các bài tập sau đây cần được hoàn thành bằng cách sử dụng các câu lệnh if, if-else,
if-elif và if-elif-else cùng với các khái niệm đã được giới thiệu trong Chương. 1.
Bạn cũng có thể thấy hữu ích khi lồng câu lệnh if bên trong phần thân của câu lệnh
if khác trong một số giải pháp của mình.

Bài tập 1: Chẵn hay Lẻ?

Viết chương trình đọc một số nguyên từ người dùng. Sau đó, chương trình của bạn
sẽ hiển thị thông báo cho biết số nguyên là chẵn hay lẻ.
Machine Translated by Google

2 Ra quyết định

Bài tập 2: Năm con chó

Người ta thường nói rằng một năm của con người tương đương với 7 năm của con chó. Tuy
nhiên, chuyển đổi đơn giản này không nhận ra rằng chó đến tuổi trưởng thành trong khoảng
hai năm. Do đó, một số người tin rằng tốt hơn nên tính mỗi năm trong hai năm đầu tiên của
con người là 10,5 năm tuổi chó, sau đó tính mỗi năm tiếp theo của con người là 4 năm tuổi chó
năm.
Viết chương trình thực hiện việc chuyển đổi từ năm con người sang năm con chó được mô
tả trong đoạn trước. Đảm bảo rằng chương trình của bạn hoạt động chính xác cho các chuyển
đổi dưới hai năm tuổi người và cho các chuyển đổi từ hai năm tuổi người trở lên. Chương
trình của bạn sẽ hiển thị thông báo lỗi thích hợp nếu người dùng nhập số âm.

Bài tập 3: Nguyên âm hoặc Phụ âm

Trong bài tập này, bạn sẽ tạo một chương trình đọc một chữ cái trong bảng chữ cái từ
người dùng. Nếu người dùng nhập a, e, i, o hoặc u thì chương trình của bạn sẽ hiển thị
thông báo cho biết chữ cái đã nhập là một nguyên âm. Nếu người dùng nhập y thì chương
trình của bạn sẽ hiển thị thông báo cho biết đôi khi y là nguyên âm và đôi khi y là phụ
âm. Nếu không, chương trình của bạn sẽ hiển thị thông báo cho biết chữ cái đó là phụ âm.

Bài tập 4: Đặt tên cho hình dạng đó

Viết chương trình xác định tên của một hình từ số cạnh của nó. Đọc số lượng từ người dùng
và sau đó báo cáo tên thích hợp như một phần của thông báo có ý nghĩa. Chương trình của
bạn phải hỗ trợ các hình có từ 3 đến (và bao gồm) 10 cạnh. Nếu một số cạnh bên ngoài phạm
vi này được nhập vào thì chương trình của bạn sẽ hiển thị một thông báo lỗi thích hợp.

Bài tập 5: Tên Tháng Số Ngày

Độ dài của một tháng thay đổi từ 28 đến 31 ngày. Trong bài tập này, bạn sẽ tạo một chương
trình đọc tên của một tháng từ người dùng dưới dạng một chuỗi. Sau đó, chương trình của
bạn sẽ hiển thị số ngày trong tháng đó. Hiển thị “28 hoặc 29 ngày” cho tháng 2 để giải
quyết các năm nhuận.
Machine Translated by Google

2.7 Bài tập

Bài tập 6: Mức độ âm thanh

Bảng sau đây liệt kê mức âm thanh tính bằng decibel đối với một số tiếng ồn phổ biến.

Tiếng ồn Mức Decibel

búa khoan 130 dB


máy cắt cỏ khí 106 dB
Đồng hồ báo thức 70 dB

Căn phòng im ắng 40 dB

Viết chương trình đọc mức âm thanh tính bằng decibel từ người dùng. Nếu người dùng
nhập mức decibel phù hợp với một trong các tiếng ồn trong bảng thì chương trình của bạn
sẽ hiển thị thông báo chỉ chứa tiếng ồn đó. Nếu người dùng nhập một số decibel giữa các
tiếng ồn được liệt kê thì chương trình của bạn sẽ hiển thị một thông báo cho biết giá
trị nằm giữa các tiếng ồn nào. Đảm bảo rằng chương trình của bạn cũng tạo ra đầu ra hợp
lý cho giá trị nhỏ hơn tiếng ồn nhỏ nhất trong bảng và cho giá trị lớn hơn tiếng ồn lớn
nhất trong bảng.

Bài tập 7: Phân loại hình tam giác

Một tam giác có thể được phân loại dựa trên độ dài của các cạnh của nó là bằng nhau, cân
hoặc tỷ lệ. Ba cạnh của một tam giác đều có cùng độ dài. Một tam giác cân có hai cạnh có
cùng độ dài và cạnh thứ ba có độ dài khác nhau. Nếu tất cả các cạnh có độ dài khác nhau
thì tam giác đó là tam giác cân.
Viết chương trình đọc độ dài ba cạnh của một tam giác từ người dùng. Sau đó hiển thị
một thông báo cho biết loại hình tam giác.
Machine Translated by Google

sự lặp lại
3

Bạn sẽ viết một chương trình lặp đi lặp lại cùng một tác vụ nhiều lần như thế nào? Bạn
có thể sao chép và dán mã nhiều lần, nhưng giải pháp như vậy là không phù hợp. Nó chỉ
cho phép tác vụ được thực hiện trong một số lần cố định và mọi cải tiến hoặc chỉnh sửa
cần được thực hiện đối với mọi bản sao của mã.
Python cung cấp hai cấu trúc vòng lặp khắc phục những hạn chế này. Cả hai loại vòng
lặp đều cho phép các câu lệnh chỉ xảy ra một lần trong chương trình của bạn được thực
thi nhiều lần khi chương trình của bạn chạy. Khi được sử dụng hiệu quả, các vòng lặp
có thể thực hiện một số lượng lớn phép tính với một câu lệnh số nhỏ.

3.1 Vòng lặp While

Một vòng lặp while làm cho một hoặc nhiều câu lệnh thực thi miễn là, hoặc trong khi,
một điều kiện đánh giá là True. Giống như câu lệnh if, vòng lặp while có một điều kiện
theo sau là phần thân được thụt vào. Nếu điều kiện của vòng lặp while đánh giá là True
thì phần thân của vòng lặp được thực thi. Khi chạm đến đáy của thân vòng lặp, quá
trình thực thi sẽ quay trở lại đỉnh của vòng lặp và điều kiện vòng lặp được đánh giá
lại. Nếu điều kiện vẫn đánh giá là True thì phần thân của vòng lặp sẽ thực hiện lần
thứ hai. Khi chạm đến đáy của thân vòng lặp lần thứ hai, việc thực thi một lần nữa
quay trở lại đỉnh của vòng lặp. Phần thân của vòng lặp tiếp tục thực thi cho đến khi
điều kiện của vòng lặp while đánh giá là Sai. Khi điều này xảy ra, phần thân của vòng
lặp sẽ bị bỏ qua và việc thực thi tiếp tục ở câu lệnh đầu tiên sau phần thân của vòng
lặp while.
Nhiều điều kiện của vòng lặp while so sánh một biến đang giữ giá trị được đọc từ
người dùng với một số giá trị khác. Khi giá trị được đọc trong phần thân của vòng lặp,
người dùng có thể khiến vòng lặp kết thúc bằng cách nhập một giá trị thích hợp. Đặc biệt,
Machine Translated by Google

3 Sự lặp lại

giá trị do người dùng nhập phải khiến điều kiện của vòng lặp while đánh giá là Sai. Ví dụ:

đoạn mã sau đọc các giá trị từ người dùng và báo cáo xem mỗi giá trị là dương hay âm. Vòng

lặp kết thúc khi người dùng nhập 0. Không có thông báo nào được hiển thị trong trường hợp này.

# Đọc giá trị đầu tiên từ người dùng

x = int(input("Nhập một số nguyên (0 để thoát):"))

# Tiếp tục lặp khi người dùng nhập một số khác 0


trong khi x != 0:
# Báo cáo bản chất của số
nếu x > 0:

print("Đó là một số dương.") other:

print("Đó là số âm.")

# Đọc giá trị tiếp theo từ người dùng

x = int(input("Nhập một số nguyên (0 để thoát): "))

Chương trình này bắt đầu bằng cách đọc một số nguyên từ người dùng. Nếu số nguyên là 0

thì điều kiện trong vòng lặp while đánh giá là Sai. Khi điều này xảy ra, thân vòng lặp bị bỏ

qua và chương trình kết thúc mà không hiển thị bất kỳ đầu ra nào (ngoài lời nhắc nhập liệu).

Nếu điều kiện trên vòng lặp while đánh giá là True thì phần thân của vòng lặp sẽ thực thi.

Khi thân vòng lặp thực thi, giá trị do người dùng nhập vào được so sánh với 0 bằng cách

sử dụng câu lệnh if và thông báo thích hợp được hiển thị. Sau đó, giá trị đầu vào tiếp theo

được đọc từ người dùng ở cuối vòng lặp. Vì đã đạt đến đáy của vòng lặp, điều khiển quay trở

lại đỉnh của vòng lặp và điều kiện của nó được đánh giá lại. Nếu giá trị gần đây nhất được

nhập bởi người dùng là 0 thì điều kiện sẽ đánh giá là Sai. Khi điều này xảy ra, phần thân của

vòng lặp bị bỏ qua và chương trình kết thúc.

Nếu không, phần thân của vòng lặp sẽ thực hiện lại. Phần thân của nó tiếp tục thực thi cho

đến khi người dùng khiến điều kiện của vòng lặp đánh giá là Sai bằng cách nhập 0.

3.2 Đối với vòng lặp

Giống như vòng lặp while, vòng lặp for khiến các câu lệnh chỉ xuất hiện trong chương trình

một lần nhưng lại được thực thi nhiều lần khi chương trình chạy. Tuy nhiên, cơ chế được sử

dụng để xác định số lần các câu lệnh đó sẽ thực thi lại khá khác đối với vòng lặp for.

Vòng lặp for thực hiện một lần cho mỗi mục trong bộ sưu tập. Tập hợp có thể là một dãy các

số nguyên, các chữ cái trong một chuỗi hoặc như chúng ta sẽ thấy trong các chương sau, các

giá trị được lưu trữ trong một cấu trúc dữ liệu, chẳng hạn như một danh sách. Cấu trúc cú

pháp của vòng lặp for được hiển thị bên dưới, trong đó <biến>, <bộ sưu tập> và <body> là các

trình giữ chỗ phải được điền vào một cách thích hợp.

cho <biến> trong <bộ sưu tập>:

<body>
Machine Translated by Google

3.2 Đối với vòng lặp

Phần thân của vòng lặp bao gồm một hoặc nhiều câu lệnh Python có thể được thực thi nhiều
lần. Cụ thể, các câu lệnh này sẽ thực hiện một lần cho mỗi mục trong bộ sưu tập. Giống như
phần thân của vòng lặp while, phần thân của vòng lặp for được thụt vào trong.
Mỗi mục trong bộ sưu tập được sao chép vào <biến> trước khi thân vòng lặp thực thi cho
mục đó. Biến này được tạo bởi vòng lặp for khi nó thực thi. Không cần thiết phải tạo nó
bằng một câu lệnh gán và bất kỳ giá trị nào có thể đã được gán cho biến này trước đó sẽ
được ghi đè vào đầu mỗi lần lặp lại vòng lặp. Biến có thể được sử dụng trong phần thân của
vòng lặp giống như cách mà bất kỳ biến Python nào khác có thể được sử dụng.

Một tập hợp các số nguyên có thể được xây dựng bằng cách gọi hàm phạm vi của Python.
Gọi phạm vi với một đối số trả về một phạm vi bắt đầu bằng 0 và tăng lên đến, nhưng không
bao gồm, giá trị của đối số. Ví dụ: phạm vi (4) trả về một phạm vi bao gồm 0, 1, 2 và 3.

Khi hai đối số được cung cấp cho phạm vi, tập hợp các giá trị được trả về sẽ tăng từ
đối số thứ nhất lên, nhưng không bao gồm, đối số thứ hai.
Ví dụ: phạm vi(4, 7) trả về một phạm vi bao gồm 4, 5 và 6. Một phạm vi trống được trả về
khi phạm vi được gọi với hai đối số và đối số thứ nhất lớn hơn hoặc bằng đối số thứ hai.
Phần thân của vòng lặp for bị bỏ qua bất cứ khi nào vòng lặp for được áp dụng cho một phạm
vi trống. Việc thực thi tiếp tục với câu lệnh đầu tiên sau phần thân của vòng lặp for.

Hàm phạm vi cũng có thể được gọi với đối số thứ ba, là giá trị bước được sử dụng để di
chuyển từ giá trị ban đầu trong phạm vi sang giá trị cuối cùng của nó. Việc sử dụng giá
trị bước lớn hơn 0 sẽ dẫn đến một phạm vi bắt đầu bằng đối số thứ nhất và tăng dần nhưng
không bao gồm đối số thứ hai, tăng dần theo giá trị bước mỗi lần. Sử dụng giá trị bước âm
cho phép xây dựng tập hợp các giá trị giảm dần. Ví dụ: trong khi gọi phạm vi (0, -4) trả
về một phạm vi trống, gọi phạm vi (0, -4, -1) trả về một phạm vi bao gồm 0, 1, 2 và
3. Lưu ý rằng giá trị bước được chuyển đến phạm vi làm đối số thứ ba của nó phải là số
nguyên. Các vấn đề yêu cầu giá trị bước không nguyên thường được giải quyết bằng vòng lặp
while thay vì vòng lặp for vì hạn chế này.

Chương trình sau sử dụng vòng lặp for và hàm range để hiển thị tất cả
của các bội số dương của 3 lên đến (và bao gồm) một giá trị do người dùng nhập vào.

# Đọc giới hạn từ người dùng

giới hạn = int(input("Nhập số nguyên:"))

# Hiển thị bội số dương của 3 cho đến giới hạn


print("Các bội số của 3 cho đến và bao gồm", giới hạn, "là:") for i in range(3, limit + 1, 3):
print(i)

Khi chương trình này thực thi, nó bắt đầu bằng cách đọc một số nguyên từ người dùng.
Chúng tôi sẽ giả định rằng người dùng đã nhập 11 khi chúng tôi mô tả việc thực hiện phần

còn lại của chương trình này. Sau khi giá trị đầu vào được đọc, quá trình thực thi tiếp
tục với câu lệnh in mô tả đầu ra của chương trình. Sau đó, vòng lặp for bắt đầu thực thi.
Một dãy các số nguyên được tạo bắt đầu bằng 3 và tăng dần lên, nhưng không bao gồm, 11
+ 1 = 12, mỗi lần tăng thêm 3. Vậy dãy bao gồm 3, 6 và
Machine Translated by Google

3 Sự lặp lại

9. Khi vòng lặp thực hiện lần đầu tiên, số nguyên đầu tiên trong phạm vi được gán cho i, phần thân

của vòng lặp được thực thi và 3 được hiển thị.

Sau khi phần thân của vòng lặp thực hiện xong lần đầu tiên, điều khiển sẽ quay trở lại đầu

vòng lặp và giá trị tiếp theo trong phạm vi, là 6, được gán cho i. Phần thân của vòng lặp thực

hiện lại và hiển thị 6. Sau đó, điều khiển quay trở lại đầu vòng lặp lần thứ hai.

Giá trị tiếp theo được gán cho i là 9. Giá trị này được hiển thị vào lần tiếp theo khi thân

vòng lặp thực thi. Sau đó, vòng lặp kết thúc vì không còn giá trị nào trong phạm vi.

Thông thường, việc thực thi sẽ tiếp tục với câu lệnh đầu tiên sau phần thân của vòng lặp for. Tuy

nhiên, không có tuyên bố như vậy trong chương trình này, vì vậy chương trình kết thúc.

3.3 Vòng lặp lồng nhau

Các câu lệnh bên trong phần thân của vòng lặp có thể bao gồm một vòng lặp khác. Khi điều này xảy

ra, vòng lặp bên trong được gọi là lồng bên trong vòng lặp bên ngoài. Bất kỳ loại vòng lặp nào

cũng có thể được lồng vào bên trong bất kỳ loại vòng lặp nào khác. Ví dụ: chương trình sau sử dụng

vòng lặp for được lồng bên trong vòng lặp while để lặp lại các thông báo do người dùng nhập cho

đến khi người dùng nhập một thông báo trống.

# Đọc tin nhắn đầu tiên từ tin nhắn


người dùng = input("Nhập tin nhắn (để trống để thoát):")

# Lặp lại cho đến khi tin nhắn là một dòng


trống trong khi tin nhắn != "":
# Đọc số lần thông báo sẽ được hiển thị n = int(input("
Thông báo sẽ được lặp lại bao nhiêu lần?"))

# Hiển thị thông báo số lần được yêu cầu cho i


trong phạm vi (n): print(tin nhắn)

# Đọc tin nhắn tiếp theo từ tin nhắn


người dùng = input("Nhập tin nhắn (để trống để thoát):")

Khi chương trình này thực thi, nó bắt đầu bằng việc đọc tin nhắn đầu tiên từ người dùng. Nếu

thông báo đó không trống thì phần thân của vòng lặp while sẽ thực thi và chương trình đọc số lần

lặp lại thông báo, n, từ người dùng. Một dãy số nguyên được tạo từ 0 đến nhưng không bao gồm n.

Sau đó, phần thân của vòng lặp in thông báo n lần vì thông báo được hiển thị một lần cho mỗi số

nguyên trong phạm vi.

Thông báo tiếp theo được đọc từ người dùng sau khi vòng lặp for đã thực hiện n lần.

Sau đó, quá trình thực thi quay trở lại đầu vòng lặp while và điều kiện của nó được đánh giá.

Nếu điều kiện đánh giá là True thì phần thân của vòng lặp while sẽ chạy lại.

Một số nguyên khác được đọc từ người dùng, ghi đè lên giá trị trước đó của n, sau đó vòng lặp for

in thông báo n lần. Điều này tiếp tục cho đến khi điều kiện trên vòng lặp while đánh giá là Sai.

Khi điều đó xảy ra, phần thân của vòng lặp while bị bỏ qua và chương trình kết thúc vì không có

câu lệnh nào để thực hiện sau phần thân của vòng lặp while.
Machine Translated by Google

3.4 Bài tập

3.4 Bài tập

Tất cả các bài tập sau đây nên được hoàn thành với các vòng lặp. Trong một số trường hợp,
bài tập chỉ định loại vòng lặp nào sẽ được sử dụng. Trong các trường hợp khác, bạn phải tự
đưa ra quyết định này. Một số bài tập có thể được hoàn thành dễ dàng với cả vòng lặp for và
while. Các bài tập khác phù hợp hơn với một loại vòng lặp so với loại kia. Ngoài ra, một số
bài tập yêu cầu nhiều vòng lặp. Khi có nhiều vòng lặp, một vòng lặp có thể cần được lồng
vào bên trong vòng lặp kia. Cân nhắc cẩn thận lựa chọn vòng lặp khi bạn thiết kế giải pháp
cho từng vấn đề.

Bài tập 1: Trung bình

Trong bài tập này, bạn sẽ tạo một chương trình tính giá trị trung bình của tập hợp các giá
trị do người dùng nhập vào. Người dùng sẽ nhập 0 làm giá trị trọng điểm để cho biết rằng sẽ
không có giá trị nào khác được cung cấp. Chương trình của bạn sẽ hiển thị một thông báo lỗi
thích hợp nếu giá trị đầu tiên được nhập bởi người dùng là 0.

Gợi ý: Bởi vì 0 đánh dấu kết thúc của đầu vào nên nó không được đưa vào giá trị trung
bình.

Bài tập 2: Bảng chiết khấu

Một nhà bán lẻ cụ thể đang giảm giá 60% cho nhiều loại sản phẩm đã ngừng sản xuất. Nhà bán
lẻ muốn giúp khách hàng của mình xác định giá đã giảm của hàng hóa bằng cách in bảng giảm
giá trên kệ hiển thị giá gốc và giá sau khi giảm giá đã được áp dụng. Viết chương trình sử
dụng vòng lặp để tạo bảng này, hiển thị giá ban đầu, số tiền giảm giá và giá mới cho các
giao dịch mua $4,95, $9,95, $14,95, $19,95 và $24,95. Đảm bảo rằng số tiền giảm giá và giá
mới được làm tròn đến 2 chữ số thập phân khi chúng được hiển thị.

Bài tập 3:Bảng chuyển đổi nhiệt độ

Viết chương trình hiển thị bảng chuyển đổi nhiệt độ của độ C và độ F. Bảng phải bao gồm các
hàng cho tất cả nhiệt độ từ 0 đến 100 độ C là bội số của 10 độ C. Bao gồm các tiêu đề thích
hợp trên các cột của bạn. Công thức chuyển đổi giữa độ C và độ F có thể tìm thấy trên
Internet.
Machine Translated by Google

3 Sự lặp lại

Bài tập 4:Không còn xu

Ngày 4 tháng 2 năm 2013 là ngày cuối cùng mà các đồng xu được phân phối bởi Đúc tiền Hoàng gia

Canada. Giờ đây, đồng xu đã bị loại bỏ dần, các nhà bán lẻ phải điều chỉnh tổng số tiền sao cho

chúng là bội số của 5 xu khi chúng được thanh toán bằng tiền mặt (các giao dịch bằng thẻ tín dụng

và thẻ ghi nợ tiếp tục được tính vào đồng xu). Mặc dù các nhà bán lẻ có một số quyền tự do trong

cách họ thực hiện việc này, nhưng hầu hết đều chọn cách làm tròn đến đồng xu gần nhất.

Viết chương trình đọc giá từ người dùng cho đến khi nhập một dòng trống.
Hiển thị tổng chi phí của tất cả các mục đã nhập trên một dòng, theo sau là số tiền
đến hạn nếu khách hàng thanh toán bằng tiền mặt trên dòng thứ hai. Số tiền đến hạn
thanh toán bằng tiền mặt phải được làm tròn đến niken gần nhất. Một cách để tính toán
số tiền thanh toán bằng tiền mặt là bắt đầu bằng cách xác định cần bao nhiêu đồng xu
để thanh toán tổng số. Sau đó tính phần còn lại khi số đồng xu này được chia cho 5.
Cuối cùng, điều chỉnh tổng số xuống nếu phần còn lại nhỏ hơn 2,5. Nếu không thì điều
chỉnh tổng lên.

Bài tập 5: Tính chu vi của một đa giác

Viết chương trình tính chu vi của một đa giác. Bắt đầu bằng cách đọc tọa độ x và y
cho điểm đầu tiên trên chu vi của đa giác từ người dùng. Sau đó, tiếp tục đọc các cặp
giá trị cho đến khi người dùng nhập một dòng trống cho tọa độ x. Mỗi lần bạn đọc một
tọa độ bổ sung, bạn nên tính toán khoảng cách đến điểm trước đó và thêm nó vào chu
vi. Khi một dòng trống được nhập cho tọa độ x, chương trình của bạn sẽ thêm khoảng
cách từ điểm cuối cùng trở lại điểm đầu tiên vào chu vi. Sau đó, chu vi sẽ được hiển
thị. Các giá trị đầu vào và đầu ra mẫu được hiển thị bên dưới. Các giá trị đầu vào do
người dùng nhập được in đậm.

Nhập tọa độ x đầu tiên: 0 Nhập tọa độ y đầu

tiên: 0 Nhập tọa độ x tiếp theo (trống để


thoát): 1 Nhập tọa độ y tiếp theo: 0 Nhập tọa độ x tiếp theo (trống để
thoát): 0 Nhập tọa độ y tiếp theo: 1 Nhập tọa độ x tiếp theo (để trống
để thoát): Chu vi của đa giác đó là 3,414213562373095
Machine Translated by Google

3.4 Bài tập

Bài tập 6: Giá nhập học

Một sở thú cụ thể xác định giá nhập học dựa trên độ tuổi của khách.
Khách từ 2 tuổi trở xuống được vào miễn phí. Trẻ em từ 3 đến 12 tuổi có giá $14,00.
Người cao niên từ 65 tuổi trở lên có giá $18,00. Nhập học cho tất cả các khách khác là
$23,00.

Tạo một chương trình bắt đầu bằng cách đọc tuổi của tất cả khách trong một nhóm từ
người dùng, với một tuổi được nhập trên mỗi dòng. Người dùng sẽ nhập một dòng trống để
cho biết rằng không còn khách nào trong nhóm. Sau đó, chương trình của bạn sẽ hiển thị
chi phí nhập học cho nhóm với một thông báo thích hợp. Chi phí phải được hiển thị bằng
cách sử dụng hai chữ số thập phân.

Bài tập 7: Bit chẵn lẻ

Bit chẵn lẻ là một cơ chế đơn giản để phát hiện lỗi trong dữ liệu được truyền qua kết
nối không đáng tin cậy, chẳng hạn như đường dây điện thoại. Ý tưởng cơ bản là một bit
bổ sung được truyền sau mỗi nhóm 8 bit để có thể phát hiện ra một lỗi bit đơn lẻ trong
quá trình truyền.

Các bit chẵn lẻ có thể được tính cho chẵn lẻ hoặc chẵn lẻ. Nếu chẵn lẻ được chọn
thì bit chẵn lẻ được truyền sẽ được chọn sao cho tổng số bit một được truyền (8 bit dữ
liệu cộng với bit chẵn lẻ) là số chẵn. Khi bit chẵn lẻ được chọn, bit chẵn lẻ được chọn
sao cho tổng số bit một được truyền là số lẻ.

Viết chương trình tính bit chẵn lẻ cho các nhóm 8 bit được nhập bởi người dùng bằng
cách sử dụng tính chẵn lẻ. Chương trình của bạn sẽ đọc các chuỗi chứa 8 bit cho đến khi
người dùng nhập một dòng trống. Sau khi người dùng nhập vào mỗi chuỗi, chương trình của
bạn sẽ hiển thị một thông báo rõ ràng cho biết liệu bit chẵn lẻ phải là 0 hay 1. Hiển
thị thông báo lỗi thích hợp nếu người dùng nhập thứ gì đó không phải là 8 bit.

Gợi ý: Bạn nên đọc đầu vào từ người dùng dưới dạng một chuỗi. Sau đó, bạn có thể
sử dụng phương pháp đếm để giúp bạn xác định số lượng số 0 và số 1 trong chuỗi.
Thông tin về phương pháp đếm có sẵn trực tuyến.
Machine Translated by Google

Chức năng
4

Khi các chương trình mà chúng tôi viết phát triển, chúng tôi cần thực hiện các bước để làm cho

chúng dễ phát triển và gỡ lỗi hơn. Một cách mà chúng ta có thể làm điều này là chia mã chương

trình thành các phần gọi là hàm.

Các hàm phục vụ một số mục đích quan trọng: Chúng cho phép chúng tôi viết mã một lần và sau

đó gọi nó từ nhiều vị trí, chúng cho phép chúng tôi kiểm tra từng phần khác nhau của giải pháp và

chúng cho phép chúng tôi ẩn (hoặc ít nhất là đặt sang một bên) các chi tiết sau khi chúng tôi có

hoàn thành một phần của chương trình của chúng tôi. Các hàm đạt được những mục tiêu này bằng cách

cho phép lập trình viên đặt tên và dành riêng một tập hợp các câu lệnh Python để sử dụng sau này.

Sau đó, chương trình của chúng tôi có thể khiến các câu lệnh đó thực thi bất cứ khi nào cần thiết.

Các câu lệnh được đặt tên bằng cách xác định một chức năng. Các câu lệnh được thực thi bằng cách

gọi một hàm. Khi các câu lệnh trong một hàm thực thi xong, điều khiển sẽ quay trở lại vị trí mà

hàm được gọi và chương trình tiếp tục thực thi từ vị trí đó.

Các chương trình mà bạn đã viết trước đó được gọi là các hàm như print, input, int và float.

Tất cả các chức năng này đã được xác định bởi những người đã tạo ra ngôn ngữ lập trình Python và

các chức năng này có thể được gọi trong bất kỳ chương trình Python nào. Trong chương này, bạn sẽ

học cách định nghĩa và gọi các hàm của riêng mình, ngoài việc gọi các hàm đã được định nghĩa

trước đó.

Định nghĩa hàm bắt đầu bằng một dòng bao gồm def, theo sau là tên của hàm đang được định

nghĩa, tiếp theo là dấu ngoặc đơn mở, dấu ngoặc đơn đóng và dấu hai chấm. Tiếp theo dòng này là

phần thân của hàm, là tập hợp các câu lệnh sẽ thực thi khi hàm được gọi. Cũng như phần thân của
các câu lệnh và vòng lặp if, phần thân của các hàm được thụt vào. Phần thân của hàm kết thúc

trước dòng tiếp theo được thụt lề bằng (hoặc ít hơn) dòng bắt đầu bằng def. Ví dụ: các dòng mã

sau xác định một hàm vẽ hộp được tạo từ các ký tự dấu hoa thị.
Machine Translated by Google

4 chức năng

def drawBox():
print("**********") print
( "* *") print ("* *")
print("**********")

Về bản thân, những dòng mã này không tạo ra bất kỳ đầu ra nào bởi vì, trong khi chức
năng drawBox đã được xác định, nó không bao giờ được gọi. Việc xác định hàm đặt các câu
lệnh này sang một bên để sử dụng trong tương lai và liên kết tên drawBox với chúng, nhưng

nó không thực thi chúng. Một chương trình Python chỉ bao gồm những dòng này là một chương
trình hợp lệ, nhưng nó sẽ không tạo ra bất kỳ đầu ra nào khi nó được thực thi.
Hàm drawBox được gọi bằng cách sử dụng tên của nó, theo sau là một luận điểm mở ngoặc
đơn và một dấu ngoặc đơn đóng. Việc thêm dòng sau vào cuối chương trình trước đó (không
thụt lề) sẽ gọi hàm và khiến hộp được vẽ.

drawBox()

Thêm một bản sao thứ hai của dòng này sẽ khiến hộp thứ hai được vẽ và thêm một bản sao
thứ ba của nó sẽ khiến hộp thứ ba được vẽ. Tổng quát hơn, một hàm có thể được gọi bao
nhiêu lần tùy ý khi giải quyết một vấn đề và những lời gọi đó có thể được thực hiện từ
nhiều vị trí khác nhau trong chương trình. Các câu lệnh trong phần thân của hàm thực thi
mỗi khi hàm được gọi. Khi hàm trả về, việc thực thi tiếp tục với câu lệnh ngay sau lời
gọi hàm.

4.1 Hàm với tham số

Chức năng drawBox hoạt động chính xác. Nó vẽ hộp cụ thể mà nó dự định vẽ, nhưng nó không
linh hoạt và kết quả là nó không hữu ích như nó có thể.

Đặc biệt, chức năng của chúng tôi sẽ linh hoạt và hữu ích hơn nếu nó có thể vẽ các hộp có
nhiều kích cỡ khác nhau.
Nhiều hàm lấy đối số là các giá trị được cung cấp bên trong dấu ngoặc đơn khi hàm được
gọi. Hàm nhận các giá trị đối số này trong các biến tham số được bao gồm bên trong dấu
ngoặc đơn khi hàm được xác định. Số lượng biến tham số trong định nghĩa của hàm cho biết
số lượng đối số phải được cung cấp khi hàm được gọi.

Chúng ta có thể làm cho hàm drawBox hữu ích hơn bằng cách thêm hai tham số vào định
nghĩa của nó. Các tham số này, được phân tách bằng dấu phẩy, sẽ giữ chiều rộng của hộp và
chiều cao của hộp tương ứng. Phần thân của hàm sử dụng các giá trị trong các biến tham số
để vẽ hộp, như minh họa bên dưới. Câu lệnh if và hàm thoát được sử dụng để kết thúc chương
trình ngay lập tức nếu các đối số được cung cấp cho hàm không hợp lệ.
Machine Translated by Google

4.1 Hàm với tham số

## Vẽ một hộp có dấu hoa thị và điền vào khoảng trống. #


@param width chiều rộng của hộp # @param height chiều cao của
hộp def drawBox(chiều rộng, chiều cao): # Không thể vẽ hộp nhỏ
hơn 2x2 bằng hàm này nếu chiều rộng < 2 hoặc chiều cao < 2: in
("Lỗi: Chiều rộng hoặc chiều cao quá nhỏ.") bỏ()

# Vẽ mặt trên của hộp


print("*" * width)

# Vẽ các cạnh của hình hộp

cho i trong phạm vi(chiều cao - 2):


print("*"+"" * (chiều rộng - 2) + "*")

# Vẽ đáy hộp

in ("*" * chiều rộng)

Hai đối số phải được cung cấp khi hàm drawBox được gọi vì định nghĩa của nó
bao gồm hai biến tham số. Khi hàm thực thi, giá trị của đối số thứ nhất sẽ được
đặt trong biến tham số thứ nhất và tương tự, giá trị của đối số thứ hai sẽ được
đặt trong biến tham số thứ hai. Ví dụ: lệnh gọi hàm sau vẽ một hộp có chiều rộng
15 ký tự và chiều cao 4 ký tự. Các hộp bổ sung có thể được vẽ với các kích thước
khác nhau bằng cách gọi lại hàm với các đối số khác nhau.

drawBox(15, 4)

Ở dạng hiện tại, hàm drawBox luôn vẽ đường viền của hộp bằng các ký tự dấu
hoa thị và nó luôn lấp đầy hộp bằng khoảng trắng. Mặc dù điều này có thể hoạt
động tốt trong nhiều trường hợp, nhưng cũng có những lúc người lập trình cần một
hộp được vẽ hoặc điền các ký tự khác nhau. Để phù hợp với điều này, chúng tôi sẽ
cập nhật drawBox để nó nhận thêm hai tham số chỉ định đường viền và ký tự điền
tương ứng. Phần thân của hàm cũng phải được cập nhật để sử dụng các biến tham số
bổ sung này, như minh họa bên dưới. Một cuộc gọi đến hàm drawBox phác thảo hộp
bằng ký hiệu at và điền vào hộp bằng dấu chấm được bao gồm ở cuối chương trình.

## Vẽ một hộp.

# @param width chiều rộng của hộp #


@param height chiều cao của hộp #
@param phác thảo ký tự được sử dụng cho đường viền của hộp #
@param điền vào ký tự được sử dụng để điền vào hộp def
drawBox(chiều rộng, chiều cao, đường viền , đổ đầy):
# Không thể vẽ hộp nhỏ hơn 2x2 bằng hàm này nếu chiều rộng < 2 hoặc
chiều cao < 2: print("Lỗi: Chiều rộng hoặc chiều cao quá nhỏ.") bỏ()

# Vẽ phần trên cùng của


hộp in (đường viền * chiều rộng)

# Vẽ các cạnh của hình hộp

cho i trong phạm vi(chiều cao - 2):


print(outline + fill * (width - 2) + outline)
Machine Translated by Google

4 chức năng

# Vẽ đáy hộp

in (đường viền * chiều rộng)

# Minh họa hàm drawBox drawBox(14, 5,

"@", ".")

Lập trình viên sẽ phải bao gồm các giá trị phác thảo và điền (ngoài chiều rộng
và chiều cao) mỗi khi phiên bản drawBox này được gọi. Mặc dù cần phải làm như vậy
trong một số trường hợp, nhưng sẽ gây khó chịu khi dấu hoa thị và dấu cách được
sử dụng thường xuyên hơn nhiều so với các tổ hợp ký tự khác vì các đối số này sẽ
phải được lặp lại mỗi khi hàm được gọi. Để khắc phục điều này, chúng ta sẽ thêm
các giá trị mặc định cho các tham số đường viền và điền vào định nghĩa của hàm.
Giá trị mặc định cho một tham số được phân tách khỏi tên của nó bằng một dấu
bằng, như minh họa bên dưới.

def drawBox(chiều rộng, chiều cao, đường viền="*", điền=" "):

Khi thay đổi này được thực hiện, drawBox có thể được gọi với hai, ba hoặc bốn
đối số. Nếu drawBox được gọi với hai đối số, thì đối số đầu tiên sẽ được đặt
trong biến tham số chiều rộng và đối số thứ hai sẽ được đặt trong biến tham số
chiều cao. Các biến tham số phác thảo và điền sẽ giữ các giá trị mặc định của dấu
hoa thị và dấu cách tương ứng. Các giá trị mặc định này được sử dụng vì không có
đối số nào được cung cấp cho các tham số này khi hàm được gọi.

Bây giờ hãy xem xét lệnh gọi drawBox sau:

drawBox(14, 5, "@", ".")

Cuộc gọi chức năng này bao gồm bốn đối số. Hai đối số đầu tiên là chiều rộng và
chiều cao và chúng được đặt vào các biến tham số đó. Đối số thứ ba là ký tự phác
thảo. Bởi vì nó đã được cung cấp, giá trị phác thảo mặc định (dấu hoa thị) được
thay thế bằng giá trị được cung cấp, là ký hiệu at. Tương tự, vì cuộc gọi bao gồm
đối số thứ tư, giá trị điền mặc định được thay thế bằng dấu chấm. Hộp kết quả từ
lệnh gọi drawBox trước đó được hiển thị bên dưới.

@@@@@@@@@@@@@@
@...........@
@............@
@....... .....@
@@@@@@@@@@@@@@

4.2 Các biến trong Hàm

Khi một biến được tạo bên trong một hàm, biến đó là cục bộ của hàm đó. Điều này

có nghĩa là biến chỉ tồn tại khi hàm đang thực thi và nó chỉ có thể được truy cập
trong phần thân của hàm đó. Biến không còn tồn tại khi hàm trả về và do đó, nó
không thể được truy cập sau thời gian đó. hộp vẽ
Machine Translated by Google

4.2 Các biến trong Hàm

chức năng sử dụng một số biến để thực hiện nhiệm vụ của mình. Chúng bao gồm các biến tham số
chẳng hạn như chiều rộng và điền được tạo khi hàm được gọi, cũng như biến điều khiển vòng lặp

for, i, được tạo khi vòng lặp bắt đầu thực thi.

Tất cả đều là các biến cục bộ chỉ có thể được truy cập trong chức năng này. Các biến được tạo

bằng các câu lệnh gán trong phần thân của hàm cũng là các biến cục bộ.

4.3 Giá trị trả về

Chức năng vẽ hộp của chúng tôi in các ký tự trên màn hình. Trong khi nó nhận các đối số xác định

cách hộp sẽ được vẽ, thì hàm này không tính toán kết quả cần được lưu trữ trong một biến và được

sử dụng sau này trong chương trình. Nhưng nhiều chức năng tính toán một giá trị như vậy. Ví dụ:

hàm sqrt trong mô-đun toán học tính căn bậc hai của đối số của nó và trả về giá trị này để có thể

sử dụng giá trị này trong các phép tính tiếp theo. Tương tự, hàm đầu vào đọc một giá trị do người

dùng nhập và sau đó trả về giá trị đó để có thể sử dụng sau này trong chương trình. Một số hàm

bạn viết cũng sẽ cần trả về các giá trị.

Một hàm trả về một giá trị bằng cách sử dụng từ khóa return, theo sau là giá trị sẽ được trả

về. Khi trả về thực thi, hàm kết thúc ngay lập tức và điều khiển quay trở lại vị trí mà hàm được

gọi. Ví dụ: câu lệnh sau ngay lập tức kết thúc quá trình thực thi của hàm và trả về 5 cho vị trí

mà nó được gọi.

trả lại 5

Các hàm trả về giá trị thường được gọi ở phía bên phải của câu lệnh gán, nhưng chúng cũng có

thể được gọi trong các ngữ cảnh khác khi cần có giá trị. Các ví dụ như vậy bao gồm một câu lệnh

if hoặc điều kiện vòng lặp while, hoặc như một đối số cho một hàm khác, chẳng hạn như in hoặc

phạm vi.

Hàm không trả về kết quả thì không cần sử dụng từ khóa return vì hàm sẽ tự động trả về sau khi

câu lệnh cuối cùng trong thân hàm thực thi. Tuy nhiên, một lập trình viên có thể sử dụng từ khóa

return, không có giá trị ở cuối, để buộc hàm trả về một điểm trước đó trong phần thân của nó. Bất

kỳ hàm nào, dù có trả về giá trị hay không, đều có thể bao gồm nhiều câu lệnh trả về.

Một hàm như vậy sẽ trả về ngay sau khi bất kỳ câu lệnh trả về nào được thực thi.

Hãy xem xét ví dụ sau. Dãy hình học là dãy các số hạng bắt đầu bằng một giá trị nào đó, a,

theo sau là vô số số hạng bổ sung. Mỗi số hạng trong dãy, ngoài số hạng đầu tiên, được tính bằng

cách nhân số hạng liền trước của nó với r, được gọi là tỉ số chung. Kết quả là các số hạng trong

dãy là a, ar, ar 2, ar 3, …. Khi r bằng 1, tổng của n số hạng đầu tiên của một dãy hình học là a

× n. Khi r không bằng 1, tổng của n số hạng đầu tiên của một dãy hình học có thể được tính bằng

công thức sau.

a(1 r n)
tổng =
1 r
Machine Translated by Google

4 chức năng

Có thể viết một hàm tính tổng n số hạng đầu tiên của bất kỳ dãy hình học nào.
Nó sẽ yêu cầu 3 tham số: a, r và n, và nó sẽ cần trả về một kết quả, là tổng của
n số hạng đầu tiên. Mã cho chức năng được hiển thị bên dưới.

## Tính tổng n số hạng đầu tiên của một dãy hình học. # @param a số hạng

đầu tiên của dãy # @param r tỷ số chung của dãy # @param n số lượng số hạng

cần tính vào tổng # @return tổng của n số hạng đầu tiên của dãy def

sumGeometric ( a , r, n):

# Tính và trả về tổng khi công bội bằng 1 nếu r == 1:

trả lại một * n

# Tính và trả về tổng khi công bội không bằng 1 s=a * (1 - r ** n) / (1


- r)

trả lại s

Hàm bắt đầu bằng cách sử dụng câu lệnh if để xác định xem r có phải là một
hay không. Nếu đúng như vậy, tổng được tính là a*n và hàm ngay lập tức trả về
giá trị này mà không thực hiện các dòng còn lại trong phần thân của hàm. Khi r
không bằng 1, phần thân của câu lệnh if bị bỏ qua và tổng của n số hạng đầu tiên
được tính và lưu trữ trong s. Sau đó, giá trị được lưu trữ trong s được trả về
vị trí mà hàm được gọi.

Chương trình sau minh họa hàm sumGeometric bằng cách tính tổng cho đến khi
người dùng nhập số 0 cho a. Mỗi tổng được tính bên trong hàm và sau đó được trả
về vị trí mà hàm được gọi. Sau đó, giá trị trả về được lưu trữ trong biến tổng

bằng cách sử dụng câu lệnh gán. Một câu lệnh tiếp theo hiển thị tổng số trước
khi chương trình tiếp tục và đọc các giá trị cho một chuỗi khác từ người dùng.

chắc chắn chính():

# Đọc giá trị ban đầu cho dãy đầu tiên init =

float(input("Nhập giá trị của a (0 để thoát): "))

# Trong khi giá trị ban đầu khác không

trong khi init != 0:

# Đọc tỷ lệ và số lượng các số hạng ratio

= float(input("Nhập tỷ lệ, r: ")) num = int(input("Nhập số lượng các số

hạng, n:"))

# Tính và hiển thị tổng =


sumGeometric(init, ratio, num) print("Tổng của số hạng đầu tiên",

num, "số hạng là", tổng)

# Đọc giá trị ban đầu cho dãy tiếp theo init =

float(input("Nhập giá trị của a (0 để thoát): "))

# Gọi hàm chính

chủ yếu()
Machine Translated by Google

4.4 Nhập hàm vào các chương trình khác

4.4 Nhập hàm vào các chương trình khác

Một trong những lợi ích của việc sử dụng hàm là khả năng viết hàm một lần và sau đó gọi hàm đó

nhiều lần từ các vị trí khác nhau. Điều này được thực hiện dễ dàng khi định nghĩa hàm và vị trí
cuộc gọi đều nằm trong cùng một tệp. chức năng là

được định nghĩa và sau đó nó được gọi bằng cách sử dụng tên của nó, theo sau là dấu ngoặc đơn chứa

bất kỳ đối số nào.

Tại một thời điểm nào đó, bạn sẽ rơi vào tình huống muốn gọi một hàm mà bạn đã viết cho chương

trình trước đó trong khi giải một bài toán mới. Các lập trình viên mới (và thậm chí một số lập

trình viên có kinh nghiệm) thường muốn sao chép chức năng từ tệp chứa chương trình cũ sang tệp chứa

chương trình mới, nhưng đây là một cách tiếp cận không mong muốn. Sao chép chức năng dẫn đến cùng

một mã cư trú ở hai nơi. Do đó, khi một lỗi được xác định, nó sẽ cần phải sửa hai lần. Một cách

tiếp cận tốt hơn là nhập hàm từ chương trình cũ vào chương trình mới, tương tự như cách các hàm

được nhập từ các mô-đun tích hợp sẵn của Python.

Các hàm từ một chương trình Python cũ có thể được nhập vào một chương trình mới bằng cách sử

dụng từ khóa nhập, theo sau là tên của tệp Python chứa các hàm quan tâm (không có phần mở rộng .py).

Điều này cho phép chương trình mới gọi tất cả các chức năng trong tệp cũ, nhưng nó cũng khiến

chương trình trong tệp cũ thực thi. Mặc dù điều này có thể được mong muốn trong một số trường hợp,

nhưng chúng ta thường muốn truy cập vào các chức năng của chương trình cũ mà không thực sự chạy

chương trình. Điều này thường không được thực hiện bằng cách tạo một hàm có tên chính chứa các câu

lệnh cần thiết để giải quyết vấn đề. Sau đó, một dòng mã ở cuối tệp gọi hàm chính. Cuối cùng, một

câu lệnh if được thêm vào để đảm bảo rằng chức năng chính không thực thi khi tệp đã được nhập vào

một chương trình khác, như minh họa bên dưới:

nếu __name__ == "__main__": main()

Cấu trúc này nên được sử dụng bất cứ khi nào bạn tạo một chương trình bao gồm các chức năng mà bạn

có thể muốn nhập vào một chương trình khác trong tương lai.

4.5 Bài tập

Các hàm cho phép chúng ta đặt tên cho các chuỗi câu lệnh Python và gọi chúng từ nhiều vị trí trong

chương trình của chúng ta. Điều này mang lại một số lợi thế so với các chương trình không xác định

bất kỳ chức năng nào, bao gồm khả năng viết mã một lần và gọi nó từ một số vị trí cũng như cơ hội

thử nghiệm các phần khác nhau trong giải pháp của chúng tôi một cách riêng lẻ. Các chức năng cũng

cho phép lập trình viên bỏ qua một số chi tiết của chương trình trong khi tập trung vào các khía

cạnh khác của giải pháp. Sử dụng các hàm một cách hiệu quả sẽ giúp bạn viết các chương trình tốt

hơn, đặc biệt là khi bạn giải các bài toán lớn hơn. Các chức năng nên được sử dụng khi hoàn thành

tất cả các bài tập trong chương này.


Machine Translated by Google

4 chức năng

Bài tập 1: Tính cạnh huyền

Viết một hàm lấy độ dài của hai cạnh ngắn hơn của một tam giác vuông làm tham số của
nó. Trả về cạnh huyền của tam giác, được tính bằng định lý Pythagore, làm kết quả của
hàm. Bao gồm một chương trình chính đọc độ dài của các cạnh ngắn hơn của một tam giác
vuông từ người dùng, sử dụng hàm của bạn để tính độ dài của cạnh huyền và hiển thị
kết quả.

Bài tập 2: Giá cước taxi

Trong một khu vực tài phán cụ thể, giá vé taxi bao gồm giá vé cơ bản là 4 đô la, cộng
thêm 0,25 đô la cho mỗi 140 mét di chuyển. Viết một hàm lấy quãng đường đã đi (tính
bằng km) làm tham số duy nhất và trả về tổng giá vé làm kết quả duy nhất. Viết chương
trình chính minh họa chức năng.

Gợi ý: Giá cước taxi thay đổi theo thời gian. Sử dụng các hằng số để biểu thị
giá vé cơ sở và phần giá vé thay đổi để chương trình có thể được cập nhật dễ
dàng khi giá tăng.

Bài tập 3: Máy tính vận chuyển

Một nhà bán lẻ trực tuyến cung cấp dịch vụ vận chuyển nhanh cho nhiều mặt hàng của mình với mức phí là 10,95 đô

la cho mặt hàng đầu tiên trong một đơn đặt hàng và 2,95 đô la cho mỗi mặt hàng tiếp theo trong cùng một đơn đặt hàng.

Viết một hàm lấy số mục theo thứ tự làm tham số duy nhất của nó.
Trả lại phí vận chuyển cho đơn hàng là kết quả của hàm. Bao gồm một chương trình
chính đọc số lượng mặt hàng đã mua từ người dùng và hiển thị phí vận chuyển.

Bài tập 4: Trung vị của ba giá trị

Viết hàm nhận ba số làm tham số và trả về giá trị trung bình của các tham số đó làm
kết quả. Bao gồm một chương trình chính đọc ba giá trị từ người dùng và hiển thị giá
trị trung bình của chúng.

Gợi ý: Giá trị trung bình nằm ở giữa ba giá trị khi chúng được sắp xếp theo
thứ tự tăng dần. Nó có thể được tìm thấy bằng cách sử dụng câu lệnh if hoặc với
một chút sáng tạo toán học.
Machine Translated by Google

danh sách

Cho đến thời điểm này, mọi biến mà chúng tôi đã tạo đều có một giá trị. Giá trị có thể là một

số nguyên, Boolean, một chuỗi hoặc một giá trị thuộc một số loại khác. Mặc dù sử dụng một biến

cho mỗi giá trị là thực tế đối với các vấn đề nhỏ nhưng nó nhanh chóng trở nên không thể kiểm

soát được khi làm việc với lượng dữ liệu lớn hơn. Danh sách giúp chúng ta khắc phục vấn đề này

bằng cách cho phép một số, thậm chí nhiều giá trị được lưu trữ trong một biến.

Một biến chứa danh sách được tạo bằng một câu lệnh gán, giống như các biến mà chúng ta đã

tạo trước đó. Các danh sách được đặt trong dấu ngoặc vuông và dấu phẩy được sử dụng để phân

tách các giá trị liền kề trong danh sách. Ví dụ: câu lệnh gán sau đây tạo một danh sách chứa 4

số dấu phẩy động và lưu nó trong một biến có tên là data. Sau đó, các giá trị được hiển thị

bằng cách gọi chức năng in. Tất cả 4 giá trị được hiển thị khi chức năng in thực thi vì dữ liệu

là toàn bộ danh sách các giá trị.

dữ liệu = [2,71, 3,14, 1,41, 1,62]


in (dữ liệu)

Một danh sách có thể chứa 0 hoặc nhiều giá trị. Danh sách trống, không có giá trị nào trong

đó, được ký hiệu là [] (dấu ngoặc vuông mở ngay sau dấu ngoặc vuông đóng). Giống như một số

nguyên có thể được khởi tạo thành 0 và sau đó có giá trị được thêm vào nó ở điểm sau trong

chương trình, một danh sách có thể được khởi tạo thành danh sách trống và sau đó có các mục

được thêm vào khi chương trình thực thi.

5.1 Truy cập các phần tử riêng lẻ

Mỗi giá trị trong danh sách được gọi là một phần tử. Các phần tử trong danh sách được đánh số

liên tục bằng các số nguyên, bắt đầu từ 0. Mỗi số nguyên xác định một phần tử cụ thể trong danh

sách và được gọi là chỉ số cho phần tử đó. Trong đoạn mã trước, phần tử ở chỉ mục 0 trong dữ
liệu là 2,71 trong khi phần tử ở chỉ mục 3 là 1,62.
Machine Translated by Google

5 danh sách

Một phần tử danh sách riêng lẻ được truy cập bằng cách sử dụng tên của danh sách, ngay sau

đó là chỉ mục của phần tử được đặt trong dấu ngoặc vuông. Ví dụ: các câu lệnh dưới đây sử dụng

ký hiệu này để hiển thị 3.14. Lưu ý rằng việc in phần tử tại chỉ mục 1 sẽ hiển thị phần tử thứ

hai trong danh sách vì phần tử đầu tiên trong danh sách có chỉ mục 0.

dữ liệu = [2,71, 3,14, 1,41, 1,62] in (dữ liệu [1])

Một phần tử danh sách riêng lẻ có thể được cập nhật bằng cách sử dụng câu lệnh gán. Tên của

danh sách, theo sau là chỉ mục của phần tử được đặt trong dấu ngoặc vuông, xuất hiện ở bên

trái của toán tử gán. Giá trị mới sẽ được lưu trữ tại chỉ mục đó xuất hiện ở bên phải của toán

tử gán. Khi câu lệnh gán thực thi, phần tử được lưu trữ trước đó tại chỉ mục được chỉ định sẽ

được ghi đè bằng giá trị mới.

Các yếu tố khác trong danh sách không bị ảnh hưởng bởi sự thay đổi này.

Hãy xem xét ví dụ sau. Nó tạo một danh sách chứa bốn phần tử, sau đó nó thay thế phần tử ở

chỉ mục 2 bằng 2,30. Khi câu lệnh in thực thi, nó sẽ hiển thị tất cả các giá trị trong danh

sách. Các giá trị đó là 2,71, 3,14, 2,30 và 1,62.

dữ liệu = [2,71, 3,14, 1,41, 1,62] dữ liệu[2] = 2,30


in(dữ liệu)

5.2 Vòng lặp và Danh sách

Vòng lặp for thực hiện một lần cho mỗi mục trong bộ sưu tập. Tập hợp có thể là một dãy các số

nguyên được xây dựng bằng cách gọi hàm dãy. Nó cũng có thể là một danh sách.

Ví dụ sau sử dụng vòng lặp for để tính tổng các giá trị trong dữ liệu.

# Khởi tạo dữ liệu và tổng

dữ liệu = [2,71, 3,14, 1,41, 1,62] tổng = 0

# Tổng các giá trị trong dữ

liệu cho giá trị trong dữ liệu:

tổng = tổng + giá trị

# Hiển thị tổng số


in("The total is", total)

Chương trình này bắt đầu bằng cách khởi tạo dữ liệu và tổng các giá trị được hiển thị. Sau

đó, vòng lặp for bắt đầu thực thi. Giá trị đầu tiên trong dữ liệu được sao chép vào giá trị và

sau đó phần thân của vòng lặp sẽ chạy. Nó thêm giá trị vào tổng số.

Khi phần thân của vòng lặp đã được thực thi lần đầu tiên, điều khiển sẽ quay trở lại đầu

vòng lặp. Phần tử thứ hai trong dữ liệu được sao chép vào giá trị và phần thân vòng lặp thực

thi lại để thêm giá trị mới này vào tổng. Quá trình này tiếp tục cho đến khi
Machine Translated by Google

5.2 Vòng lặp và Danh sách

vòng lặp đã thực hiện một lần cho mỗi phần tử trong danh sách và tổng của tất cả các phần
tử đã được tính toán. Sau đó, kết quả được hiển thị và chương trình kết thúc.
Đôi khi các vòng lặp được xây dựng để lặp lại các chỉ mục của danh sách thay vì các giá
trị của nó. Để xây dựng một vòng lặp như vậy, chúng ta cần có khả năng xác định có bao
nhiêu phần tử trong một danh sách. Điều này có thể được thực hiện bằng hàm len. Nó nhận
một đối số là một danh sách và nó trả về số lượng phần tử trong danh sách.1 Hàm len có thể
được sử dụng với hàm phạm vi để xây dựng một tập hợp các số nguyên bao gồm tất cả các

chỉ số của một danh sách. Điều này được thực hiện bằng cách chuyển độ dài của danh sách
làm đối số duy nhất cho phạm vi. Một tập hợp con của các chỉ số có thể được xây dựng bằng
cách cung cấp đối số thứ hai cho phạm vi. Chương trình sau đây chứng minh điều này bằng
cách sử dụng vòng lặp for để lặp qua tất cả các chỉ mục của dữ liệu, ngoại trừ chỉ mục đầu
tiên, để xác định vị trí của phần tử lớn nhất trong dữ liệu.

# Khởi tạo dữ liệu và dữ liệu


pos lớn nhất = [1.62, 1.41, 3.14, 2.71]
large_pos = 0

# Tìm vị trí của phần tử lớn nhất cho i


trong dãy(1, len(data)):
nếu dữ liệu[i] > dữ liệu[large_pos]:
lớn nhất_pos = tôi

# Hiển thị kết quả


print("Giá trị lớn nhất là", data[large_pos], \
"tại chỉ mục", lớn nhất_pos)

Chương trình này bắt đầu bằng cách khởi tạo dữ liệu và biến large_pos.
Sau đó, tập hợp các giá trị sẽ được sử dụng bởi vòng lặp for được xây dựng bằng cách sử
dụng hàm phạm vi. Đối số đầu tiên của nó là 1 và đối số thứ hai là độ dài của dữ liệu, là
4. Kết quả là, phạm vi trả về một tập hợp các số nguyên tuần tự từ 1 đến và bao gồm cả 3,
đây cũng là chỉ số cho tất cả các phần tử trong dữ liệu, ngoại trừ dữ liệu đầu tiên.

Vòng lặp for bắt đầu thực hiện bằng cách lưu 1 vào i. Sau đó, thân vòng lặp chạy lần
đầu tiên. Nó so sánh giá trị trong dữ liệu tại chỉ mục i với giá trị trong dữ liệu tại chỉ
mục BIG_POS. Vì phần tử tại chỉ mục i nhỏ hơn nên điều kiện của câu lệnh if được đánh giá

là Sai và phần thân của câu lệnh if bị bỏ qua.


Bây giờ điều khiển quay trở lại đầu vòng lặp. Giá trị tiếp theo trong phạm vi, là 2,
được lưu vào i và phần thân của vòng lặp thực thi lần thứ hai. Giá trị tại chỉ mục i được
so sánh với giá trị tại chỉ mục large_pos. Vì giá trị tại chỉ mục i lớn hơn nên phần thân
của câu lệnh if sẽ thực thi và large_pos được đặt bằng i, tức là 2.

Vòng lặp chạy thêm một lần nữa với i bằng 3. Phần tử tại chỉ mục i nhỏ hơn phần tử tại
chỉ mục BIG_POS nên phần thân của câu lệnh if bị bỏ qua. Sau đó, vòng lặp kết thúc và
chương trình báo cáo rằng giá trị lớn nhất là 3,14, nằm ở chỉ số 2.

1Hàm len trả về 0 nếu danh sách được chuyển đến nó trống.
Machine Translated by Google

5 danh sách

Vòng lặp While cũng có thể được sử dụng khi làm việc với danh sách. Ví dụ: đoạn mã
sau sử dụng vòng lặp while để xác định chỉ mục của giá trị dương đầu tiên trong danh
sách. Vòng lặp sử dụng một biến i, giữ chỉ số của các phần tử trong danh sách, bắt đầu
từ 0. Giá trị trong i tăng lên khi chương trình chạy cho đến khi chạm đến cuối danh
sách hoặc tìm thấy phần tử dương.

# Khởi tạo dữ liệu

dữ liệu = [0, -1, 4, 1, 0]

# Lặp trong khi i là chỉ mục hợp lệ và giá trị tại chỉ mục i không phải là giá trị
dương i=0

trong khi i < len(data) và data[i] <= 0:


tôi=tôi+1

# Nếu i nhỏ hơn độ dài của dữ liệu thì vòng lặp kết thúc vì # tìm thấy số dương. Nếu không
thì i sẽ bằng với độ dài của dữ liệu, cho biết rằng không tìm thấy số dương #. nếu tôi <
len(dữ liệu):

print("Số dương đầu tiên nằm ở chỉ mục", i) else: print("Danh sách không
chứa số dương")

Khi chương trình này thực thi, nó bắt đầu bằng việc khởi tạo dữ liệu và i. Sau đó,
điều kiện của vòng lặp while được đánh giá. Giá trị của i, bằng 0, nhỏ hơn độ dài của
dữ liệu và phần tử ở vị trí i bằng 0, nhỏ hơn hoặc bằng 0. Kết quả là điều kiện được
đánh giá là True, phần thân của vòng lặp thực thi và giá trị của i tăng từ 0 lên 1.

Điều khiển quay trở lại đầu vòng lặp while và điều kiện của nó được đánh giá lại.
Giá trị được lưu trữ trong i vẫn nhỏ hơn độ dài của dữ liệu và giá trị tại vị trí i
trong danh sách vẫn nhỏ hơn hoặc bằng 0. Do đó, điều kiện vòng lặp vẫn cho kết quả là
True. Điều này làm cho phần thân của vòng lặp thực thi lại, làm tăng giá trị của i từ
1 lên 2.

Khi i là 2, điều kiện vòng lặp đánh giá là Sai vì phần tử ở vị trí i lớn hơn hoặc
bằng 0. Phần thân vòng lặp bị bỏ qua và tiếp tục thực thi với câu lệnh if. Điều kiện
của nó được đánh giá là True vì i nhỏ hơn độ dài của dữ liệu. Kết quả là, phần thân

của phần if thực thi và chỉ số của số dương đầu tiên trong dữ liệu, là 2, được hiển thị.

5.3 Hoạt động danh sách bổ sung

Danh sách có thể tăng và giảm khi chương trình chạy. Một phần tử mới có thể được chèn
vào bất kỳ vị trí nào trong danh sách và một phần tử có thể bị xóa dựa trên giá trị
hoặc chỉ mục của nó. Python cũng cung cấp các cơ chế để xác định xem một phần tử có
trong danh sách hay không, tìm chỉ mục xuất hiện đầu tiên của một phần tử trong danh
sách, sắp xếp lại các phần tử trong danh sách và nhiều tác vụ hữu ích khác.
Machine Translated by Google

5.3 Hoạt động danh sách bổ sung

Các tác vụ như chèn một phần tử mới vào danh sách và xóa phần tử khỏi danh sách được thực

hiện bằng cách áp dụng một phương thức cho danh sách. Giống như một hàm, một phương thức là

một tập hợp các câu lệnh có thể được gọi để thực hiện một tác vụ. Tuy nhiên, cú pháp được sử

dụng để áp dụng một phương thức cho một danh sách hơi khác so với cú pháp được sử dụng để gọi
một hàm.

Một phương pháp được áp dụng cho một danh sách bằng cách sử dụng một câu lệnh bao gồm một

biến chứa danh sách,2 theo sau là dấu chấm, theo sau là tên của phương thức. Giống như một

lệnh gọi hàm, tên của phương thức được theo sau bởi dấu ngoặc đơn bao quanh một tập hợp các

đối số được phân tách bằng dấu phẩy. Một số phương thức trả về một kết quả. Kết quả này có thể

được lưu trữ trong một biến bằng cách sử dụng câu lệnh gán, được truyền dưới dạng đối số cho

một phương thức hoặc lệnh gọi hàm khác hoặc được sử dụng như một phần của phép tính, giống như

kết quả được trả về bởi một hàm.

5.3.1 Thêm phần tử vào danh sách

Các phần tử có thể được thêm vào cuối danh sách hiện có bằng cách gọi phương thức append. Nó

nhận một đối số, đó là phần tử sẽ được thêm vào danh sách. Ví dụ, hãy xem xét chương trình sau:

data = [2.71, 3.14, 1.41, 1.62]


data.append(2.30) print(data)

Dòng đầu tiên tạo một danh sách mới gồm 4 phần tử và lưu trữ nó trong dữ liệu. Sau đó,

phương pháp chắp thêm được áp dụng cho dữ liệu làm tăng độ dài của nó từ 4 lên 5 bằng cách

thêm 2,30 vào cuối danh sách. Cuối cùng, danh sách hiện chứa 2,71, 3,14, 1,41, 1,62 và 2,30

được in ra.

Các phần tử có thể được chèn vào bất kỳ vị trí nào trong danh sách bằng phương thức chèn.

Nó yêu cầu hai đối số, đó là chỉ mục mà phần tử sẽ được chèn vào và giá trị của nó. Khi một

phần tử được chèn vào, bất kỳ phần tử nào ở bên phải của điểm chèn sẽ tăng chỉ số của chúng

lên 1 để có sẵn chỉ mục cho phần tử mới. Ví dụ: đoạn mã sau chèn 2,30 vào giữa dữ liệu thay

vì nối nó vào cuối danh sách. Khi đoạn mã này thực thi nó sẽ hiển thị [2.71, 3.14, 2.30, 1.41,

1.62].

data = [2,71, 3,14, 1,41, 1,62] data.insert(2,


2,30) print(data)

2Methods cũng có thể được áp dụng cho một danh sách theo nghĩa đen được đặt trong dấu ngoặc vuông bằng cách sử dụng cùng một cú

pháp, nhưng hiếm khi cần phải làm như vậy.


Machine Translated by Google

5 danh sách

5.3.2 Xóa phần tử khỏi danh sách

Phương thức pop được sử dụng để xóa một phần tử tại một chỉ mục cụ thể khỏi danh sách.
Chỉ mục của phần tử cần xóa được cung cấp dưới dạng đối số tùy chọn để bật lên. Nếu đối số
bị bỏ qua thì pop sẽ xóa phần tử cuối cùng khỏi danh sách. Phương thức pop trả về giá trị
đã bị xóa khỏi danh sách dưới dạng kết quả duy nhất của nó. Khi cần giá trị này cho phép
tính tiếp theo, giá trị này có thể được lưu vào một biến bằng cách gọi pop ở bên phải của
câu lệnh gán. Áp dụng cửa sổ bật lên cho một danh sách trống là một lỗi, cũng như cố xóa
một phần tử khỏi chỉ mục nằm ngoài phần cuối của danh sách.

Một giá trị cũng có thể được xóa khỏi danh sách bằng cách gọi phương thức xóa. Đối số
duy nhất của nó là giá trị cần xóa (chứ không phải chỉ mục của giá trị cần xóa). Khi phương
thức remove thực thi, nó sẽ loại bỏ lần xuất hiện đầu tiên của đối số khỏi danh sách. Một
lỗi sẽ được báo cáo nếu giá trị được chuyển để loại bỏ không có trong danh sách.

Hãy xem xét ví dụ sau. Nó tạo một danh sách và sau đó xóa hai phần tử khỏi danh sách
đó. Khi câu lệnh in đầu tiên được thực thi, nó sẽ hiển thị [2.71, 3.14] vì 1.62 và 1.41 đã
bị xóa khỏi danh sách. Câu lệnh in thứ hai hiển thị 1,41 vì 1,41 là phần tử cuối cùng
trong danh sách khi phương thức pop được áp dụng cho nó.

dữ liệu = [2,71, 3,14, 1,41, 1,62]

data.remove(1.62) # Xóa 1.62 khỏi danh sách last = data.pop() #

Xóa phần tử cuối cùng khỏi danh sách

in (dữ liệu) in
(cuối cùng)

5.3.3 Sắp xếp lại các phần tử trong danh sách

Đôi khi một danh sách có tất cả các yếu tố chính xác trong đó, nhưng chúng không theo thứ
tự cần thiết để giải quyết một vấn đề cụ thể. Hai phần tử trong một danh sách có thể được
hoán đổi bằng cách sử dụng một loạt các câu lệnh gán để đọc và ghi vào các phần tử riêng
lẻ trong danh sách, như được minh họa trong đoạn mã sau.

# Tạo một danh sách

dữ liệu = [2,71, 3,14, 1,41, 1,62]

# Hoán đổi phần tử ở chỉ số 1 với phần tử ở chỉ số 3 temp =


data[1] data[1] = data[3] data[3] = temp

# Hiển thị bản in danh sách


đã sửa đổi (dữ liệu)

Khi các câu lệnh này thực thi, dữ liệu được khởi tạo thành [2.71, 3.14, 1.41, 1.62].

Sau đó, giá trị tại chỉ mục 1, là 3,14, được sao chép vào temp. Đây là
Machine Translated by Google

5.3 Hoạt động danh sách bổ sung

theo sau là một dòng sao chép giá trị tại chỉ mục 3 sang chỉ mục 1. Cuối cùng, giá trị trong

tạm thời được sao chép vào danh sách tại chỉ mục 3. Khi câu lệnh in thực thi, nó sẽ hiển thị
[2.71, 1.62, 1.41, 3.14].

Có hai phương pháp sắp xếp lại các phần tử trong danh sách. Phương thức đảo ngược đảo ngược
thứ tự của các phần tử trong danh sách và phương thức sắp xếp sắp xếp các phần tử theo thứ tự

tăng dần. Cả đảo ngược và sắp xếp đều có thể được áp dụng cho danh sách mà không cần cung cấp

bất kỳ đối số nào.3

Ví dụ sau đọc một tập hợp các số từ người dùng và lưu trữ chúng trong một danh sách. Sau

đó, nó sẽ hiển thị tất cả các giá trị theo thứ tự được sắp xếp.

# Tạo một giá trị danh


sách trống mới = []

# Đọc các giá trị từ người dùng và lưu trữ chúng trong danh sách cho đến khi nhập một dòng trống

line = input("Nhập một số (dòng trống để thoát):") while line != "":

num = float(line) giá

trị.append(num)

line = input("Nhập một số (dòng trống để thoát):")

# Sắp xếp các giá trị theo thứ tự giá


trị tăng dần.sort()

# Hiển thị các giá


trị cho v trong các giá trị:

in(v)

5.3.4 Tìm kiếm Danh sách

Đôi khi chúng ta cần xác định xem một giá trị cụ thể có xuất hiện trong danh sách hay không.

Trong các tình huống khác, chúng tôi có thể muốn xác định chỉ mục của một giá trị đã được

biết là có mặt trong danh sách. Phương thức chỉ mục và toán tử in của Python cho phép chúng

ta thực hiện các tác vụ này.

Toán tử in được sử dụng để xác định xem một giá trị có xuất hiện trong danh sách hay không.

Giá trị đang được tìm kiếm được đặt ở bên trái của toán tử. Danh sách đang được tìm kiếm được

đặt ở bên phải của nhà điều hành. Một biểu thức như vậy đánh giá là True nếu giá trị có trong

danh sách. Nếu không, nó đánh giá là Sai.

Phương thức chỉ mục được sử dụng để xác định vị trí của một giá trị cụ thể trong danh sách.

Giá trị này được chuyển đến chỉ mục làm đối số duy nhất của nó. Chỉ số của lần xuất hiện đầu
tiên của giá trị trong danh sách được trả về dưới dạng kết quả của phương thức. Có lỗi khi

gọi phương thức chỉ mục với một đối số không có trong danh sách. Kết quả là,

3Một danh sách chỉ có thể được sắp xếp nếu tất cả các phần tử trong đó có thể được so sánh với nhau bằng

toán tử nhỏ hơn. Toán tử nhỏ hơn được xác định cho nhiều loại Python bao gồm số nguyên, số dấu phẩy động,
chuỗi và danh sách, trong số những loại khác.
Machine Translated by Google

5 danh sách

các lập trình viên đôi khi sử dụng toán tử in để xác định xem một giá trị có trong danh
sách hay không và sau đó sử dụng phương thức chỉ mục để xác định vị trí của nó.
Ví dụ sau minh họa một số phương thức và toán tử được giới thiệu trong phần này. Nó
bắt đầu bằng cách đọc các số nguyên từ người dùng và lưu trữ chúng trong một danh sách.
Sau đó, một số nguyên bổ sung được đọc từ người dùng. Vị trí xuất hiện đầu tiên của số
nguyên bổ sung này trong danh sách các giá trị được báo cáo (nếu có).
Một thông báo thích hợp được hiển thị nếu số nguyên bổ sung không có trong danh sách các
giá trị do người dùng nhập.

# Đọc số nguyên từ người dùng cho đến khi một dòng trống được nhập vào và lưu trữ tất cả
trong dữ liệu data = [] line = input("Nhập số nguyên (dòng trống để kết thúc): ") while

line !="":

n = int(dòng)

data.append(n)

line = input("Nhập số nguyên (dòng trống để kết thúc):")

# Đọc một số nguyên bổ sung từ người dùng x


= int(input("Nhập thêm một số nguyên: "))

# Hiển thị chỉ số của lần xuất hiện đầu tiên của x (nếu nó có trong danh sách)
nếu x trong dữ liệu:

print("The first", x, "is at index", data.index(x)) other: print(x, "không có


trong danh sách")

5.4 Liệt kê dưới dạng Giá trị Trả về và Đối số

Danh sách có thể được trả về từ các chức năng. Giống như các giá trị của các loại khác,
một danh sách được trả về từ một hàm bằng cách sử dụng từ khóa return. Khi câu lệnh return
thực thi, hàm kết thúc và danh sách được trả về vị trí mà hàm được gọi. Sau đó, danh sách
có thể được lưu trữ trong một biến hoặc được sử dụng trong phép tính.

Danh sách cũng có thể được truyền dưới dạng đối số cho hàm. Giống như các giá trị của
các loại khác, bất kỳ danh sách nào được chuyển đến một hàm đều được bao gồm bên trong
dấu ngoặc đơn theo sau tên của hàm khi nó được gọi. Mỗi đối số, cho dù đó là một danh sách
hoặc một giá trị thuộc loại khác, đều xuất hiện trong biến tham số tương ứng bên trong hàm.
Biến tham số chứa danh sách có thể được sử dụng trong phần thân của hàm giống như biến
tham số chứa giá trị của các loại khác. Tuy nhiên, không giống như số nguyên, số dấu phẩy
động, chuỗi hoặc giá trị Boolean, những thay đổi được thực hiện đối với biến tham số danh
sách có thể ảnh hưởng đến đối số được truyền cho hàm, ngoài giá trị được lưu trữ trong
biến tham số. Cụ thể, một thay đổi được thực hiện đối với danh sách bằng một phương thức
(chẳng hạn như nối thêm, bật hoặc sắp xếp) sẽ thay đổi giá trị của cả biến tham số và đối
số được cung cấp khi hàm được gọi.
Machine Translated by Google

5.4 Liệt kê dưới dạng Giá trị Trả về và Đối số

Các cập nhật được thực hiện trên các phần tử danh sách riêng lẻ (trong đó tên của
danh sách, theo sau là chỉ mục được đặt trong dấu ngoặc vuông, xuất hiện ở phía bên trái
của toán tử gán) cũng sửa đổi cả biến tham số và đối số được cung cấp khi hàm được gọi
là. Tuy nhiên, phép gán cho toàn bộ danh sách (trong đó chỉ tên của danh sách xuất hiện
ở bên trái của toán tử gán) chỉ tác động đến biến tham số. Các phép gán như vậy không
ảnh hưởng đến đối số được cung cấp khi hàm được gọi.

Sự khác biệt về hành vi giữa tham số danh sách và tham số của các loại khác có vẻ tùy
ý, vì có thể lựa chọn áp dụng một số thay đổi cho cả biến tham số và đối số trong khi
những thay đổi khác chỉ thay đổi biến tham số. Tuy nhiên, đây không phải là trường hợp.
Có những lý do kỹ thuật quan trọng cho những khác biệt này, nhưng những chi tiết đó nằm
ngoài phạm vi giới thiệu ngắn gọn về Python.

5.5 Bài tập

Tất cả các bài tập trong chương này nên được giải quyết bằng cách sử dụng danh sách. Các
chương trình mà bạn viết sẽ cần tạo danh sách, sửa đổi chúng và định vị các giá trị trong
đó. Một số bài tập cũng yêu cầu bạn viết các hàm trả về danh sách hoặc lấy chúng làm đối
số.

Bài tập 1: Sắp xếp thứ tự

Viết chương trình đọc số nguyên từ người dùng và lưu chúng vào danh sách. Chương trình
của bạn sẽ tiếp tục đọc các giá trị cho đến khi người dùng nhập 0. Sau đó, chương trình
sẽ hiển thị tất cả các giá trị do người dùng nhập (ngoại trừ 0) theo thứ tự tăng dần,
với một giá trị xuất hiện trên mỗi dòng. Sử dụng phương thức sắp xếp hoặc hàm đã sắp xếp
để sắp xếp danh sách.

Bài tập 2: Đảo ngược thứ tự

Viết chương trình đọc số nguyên từ người dùng và lưu chúng vào danh sách. Sử dụng 0 làm
giá trị trọng điểm để đánh dấu kết thúc đầu vào. Khi tất cả các giá trị đã được đọc,
chương trình của bạn sẽ hiển thị chúng (ngoại trừ số 0) theo thứ tự ngược lại, với một
giá trị xuất hiện trên mỗi dòng.
Machine Translated by Google

5 danh sách

Bài tập 3: Loại bỏ các giá trị ngoại lai

Khi phân tích dữ liệu được thu thập như một phần của thí nghiệm khoa học, có thể nên loại bỏ

các giá trị cực đoan nhất trước khi thực hiện các phép tính khác. Viết một hàm nhận một danh

sách các giá trị và một số nguyên không âm, n, làm tham số của nó.

Hàm sẽ tạo một bản sao mới của danh sách với n phần tử lớn nhất và n phần tử nhỏ nhất đã bị

xóa. Sau đó, nó sẽ trả về bản sao mới của danh sách dưới dạng kết quả duy nhất của hàm. Thứ

tự của các phần tử trong danh sách trả về không nhất thiết phải khớp với thứ tự của các phần

tử trong danh sách ban đầu.

Viết một chương trình chính thể hiện chức năng của bạn. Nó sẽ đọc danh sách các số từ

người dùng và loại bỏ hai giá trị lớn nhất và hai giá trị nhỏ nhất khỏi danh sách đó bằng

cách gọi hàm được mô tả trước đó. Hiển thị danh sách đã loại bỏ các giá trị ngoại lệ, theo

sau là danh sách ban đầu. Chương trình của bạn sẽ tạo ra một thông báo lỗi thích hợp nếu

người dùng nhập ít hơn 4 giá trị.

Bài tập 4: Tránh trùng lặp

Trong bài tập này, bạn sẽ tạo một chương trình đọc các từ từ người dùng cho đến khi người

dùng nhập một dòng trống. Sau khi người dùng nhập một dòng trống, chương trình của bạn sẽ

hiển thị từng từ do người dùng nhập chính xác một lần. Các từ sẽ được hiển thị theo cùng thứ

tự mà chúng được nhập lần đầu tiên. Ví dụ: nếu người dùng nhập:

giây đầu

tiên thứ

ba thứ hai

thì chương trình của bạn sẽ hiển thị:

Đầu tiên

thứ hai

ngày thứ ba

Bài tập 5: Số âm, số không và số dương

Tạo một chương trình đọc các số nguyên từ người dùng cho đến khi một dòng trống được nhập

vào. Khi tất cả các số nguyên đã được đọc, chương trình của bạn sẽ hiển thị tất cả các số

âm, tiếp theo là tất cả các số 0, tiếp theo là tất cả các số dương. Trong mỗi nhóm, các số

sẽ được hiển thị theo cùng thứ tự mà chúng được người dùng nhập vào. Ví dụ: nếu người dùng

nhập các giá trị 3, -4, 1, 0, -1, 0 và -2 thì


Machine Translated by Google

5.5 Bài tập

chương trình của bạn sẽ xuất ra các giá trị -4, -1, -2, 0, 0, 3 và 1. Chương trình của bạn
sẽ hiển thị từng giá trị trên một dòng riêng.

Bài tập 6: Danh sách các ước số thích hợp

Ước số thực của một số nguyên dương, n, là một số nguyên dương nhỏ hơn n chia hết cho n.
Viết hàm tính tất cả các ước của một số nguyên dương. Số nguyên sẽ được chuyển đến hàm
dưới dạng tham số duy nhất của nó. Hàm sẽ trả về một danh sách chứa tất cả các ước số
thích hợp là kết quả duy nhất của nó. Hoàn thành bài tập này bằng cách viết một chương
trình chính thể hiện chức năng bằng cách đọc một giá trị từ người dùng và hiển thị danh
sách các ước số thích hợp của nó. Đảm bảo rằng chương trình chính của bạn chỉ chạy khi
giải pháp của bạn chưa được nhập vào tệp khác.

Bài tập 7: Số hoàn hảo

Một số nguyên n được gọi là hoàn hảo khi tổng tất cả các ước thực sự của n bằng n. Ví dụ,
28 là một số hoàn hảo vì các ước thực sự của nó là 1, 2, 4, 7 và 14, và 1 + 2 + 4 + 7 + 14
= 28.

Viết hàm xác định một số nguyên dương có hoàn hảo hay không. Hàm của bạn sẽ
nhận một tham số. Nếu tham số đó là một số hoàn hảo thì hàm của bạn sẽ trả về
True. Nếu không, nó sẽ trả về Sai. Ngoài ra, hãy viết một chương trình chính sử
dụng hàm của bạn để xác định và hiển thị tất cả các số hoàn hảo trong khoảng từ
1 đến 10.000.
Machine Translated by Google

từ điển
6

Có nhiều điểm tương đồng giữa danh sách và từ điển. Giống như danh sách, từ điển cho
phép một số, thậm chí nhiều giá trị được lưu trữ trong một biến. Mỗi phần tử trong danh
sách có một chỉ số nguyên duy nhất được liên kết với nó và các chỉ số này phải là số
nguyên tăng liên tục từ 0. Tương tự, mỗi giá trị trong từ điển có một khóa duy nhất
được liên kết với nó, nhưng các khóa của từ điển linh hoạt hơn các chỉ mục của danh
sách. Các khóa của từ điển có thể là số nguyên. Chúng cũng có thể là các số hoặc chuỗi dấu phẩy động.
Khi các khóa là số, chúng không phải bắt đầu từ số 0 và cũng không phải theo thứ tự.
Khi các khóa là chuỗi, chúng có thể là bất kỳ tổ hợp ký tự nào, kể cả chuỗi trống. Tất
cả các khóa trong từ điển phải khác biệt giống như tất cả các chỉ số trong danh sách là
khác biệt.

Mỗi khóa trong từ điển phải có một giá trị được liên kết với nó. Giá trị được liên
kết với một khóa có thể là số nguyên, số dấu phẩy động, chuỗi hoặc giá trị Boolean. Nó
cũng có thể là một danh sách, hoặc thậm chí là một từ điển khác. Khóa từ điển và giá
trị tương ứng của nó thường được gọi là cặp khóa-giá trị. Mặc dù các khóa trong từ điển
phải khác biệt nhưng không có hạn chế song song đối với các giá trị. Do đó, cùng một
giá trị có thể được liên kết với nhiều khóa.
Bắt đầu từ Python 3.7, các cặp khóa-giá trị trong từ điển luôn được lưu trữ theo thứ
tự mà chúng được thêm vào từ điển.1 Mỗi khi một cặp khóa-giá trị mới được thêm vào từ
điển, nó sẽ được thêm vào cuối danh sách bộ sưu tập hiện có. Không có cơ chế chèn cặp
khóa-giá trị vào giữa từ điển hiện có.
Việc xóa cặp khóa-giá trị khỏi từ điển không làm thay đổi thứ tự của các cặp khóa-giá
trị còn lại trong từ điển.
Một biến chứa từ điển được tạo bằng câu lệnh gán. Từ điển trống, không chứa bất kỳ
cặp khóa-giá trị nào, được ký hiệu là {} (dấu ngoặc nhọn mở ngay sau dấu ngoặc nhọn
đóng). Từ điển không trống có thể được tạo bằng cách bao gồm một bộ sưu tập các cặp khóa-
giá trị được phân tách bằng dấu phẩy bên trong

1Thứ tự lưu trữ các cặp khóa-giá trị không đảm bảo là thứ tự chúng được thêm
vào từ điển trong các phiên bản Python trước đó.
Machine Translated by Google

6 từ điển

niềng răng. Dấu hai chấm được sử dụng để tách khóa khỏi giá trị của nó trong mỗi cặp khóa-giá trị.

Ví dụ: chương trình sau đây tạo một từ điển có ba cặp khóa-giá trị trong đó khóa là chuỗi và giá

trị là số dấu phẩy động. Mỗi cặp khóa-giá trị liên kết tên của một hằng số toán học phổ biến với

giá trị của nó. Sau đó, tất cả các cặp khóa-giá trị được hiển thị bằng cách gọi hàm in.

hằng số = {"pi": 3.14, "e": 2.71, "root 2": 1.41} print(hằng số)

6.1 Truy cập, Sửa đổi và Thêm Giá trị

Truy cập một giá trị trong từ điển tương tự như truy cập một giá trị trong danh sách. Khi đã biết
chỉ mục của một giá trị trong danh sách, chúng ta có thể sử dụng tên của danh sách và chỉ mục

được đặt trong dấu ngoặc vuông để truy cập giá trị tại vị trí đó. Tương tự, khi biết khóa liên

kết với một giá trị trong từ điển, chúng ta có thể sử dụng tên của từ điển và khóa được đặt trong

dấu ngoặc vuông để truy cập giá trị được liên kết với khóa đó.

Việc sửa đổi một giá trị hiện có trong từ điển và thêm một cặp khóa-giá trị mới vào từ điển

đều được thực hiện bằng cách sử dụng các câu lệnh gán. Tên của từ điển, cùng với khóa nằm trong

dấu ngoặc vuông, được đặt ở bên trái toán tử gán và giá trị để liên kết với khóa được đặt ở bên

phải toán tử gán. Nếu khóa đã có trong từ điển thì câu lệnh gán sẽ thay thế giá trị hiện tại của

khóa bằng giá trị ở bên phải của toán tử gán. Nếu khóa chưa có trong từ điển thì một cặp giá trị

khóa mới sẽ được thêm vào nó. Các thao tác này được thể hiện trong chương trình sau.

# Tạo từ điển mới với 2 cặp key-value results =


{"pass": 0, "fail": 0}

# Thêm một cặp khóa-giá trị mới vào từ điển


results["withdrawal"] = 1

# Cập nhật hai giá trị trong từ điển


results["pass"] = 3 results["fail"] =
results["fail"] + 1

# Hiển thị các giá trị liên quan đến lỗi, vượt qua và rút tiền tương ứng
print(results["fail"]) print(results["pass"]) print(results["withdrawal"])

Khi chương trình này thực thi, nó tạo ra một từ điển có tên là results ban đầu có hai khóa:

đạt và không đạt. Giá trị được liên kết với mỗi khóa là 0. Khóa thứ ba, rút tiền, được thêm vào

từ điển với giá trị 1 bằng cách sử dụng câu lệnh gán. Sau đó, giá trị liên kết với pass được cập

nhật thành 3 bằng cách sử dụng câu lệnh gán thứ hai. Dòng tiếp theo đọc giá trị hiện tại liên

quan đến lỗi, là 0, thêm 1 vào giá trị đó, sau đó lưu giá trị mới này trở lại từ điển,
Machine Translated by Google

6.1 Truy cập, Sửa đổi và Thêm Giá trị

thay thế giá trị trước đó. Khi các giá trị được in 1 (giá trị hiện được liên kết với lỗi)
được hiển thị trên dòng đầu tiên, 3 (giá trị hiện được liên kết với vượt qua) được hiển
thị trên dòng thứ hai và 1 (giá trị hiện được liên kết với rút tiền) được hiển thị trên
dòng thứ ba.

6.2 Xóa cặp khóa-giá trị

Một cặp khóa-giá trị được xóa khỏi từ điển bằng phương thức pop. Một đối số, là chìa khóa
để loại bỏ, phải được cung cấp khi phương thức được gọi. Khi phương thức thực thi, nó sẽ
xóa cả khóa và giá trị được liên kết với nó khỏi từ điển. Không giống như danh sách, không
thể bật cặp khóa-giá trị cuối cùng ra khỏi từ điển bằng cách gọi pop mà không có bất kỳ
đối số nào.
Phương thức pop trả về giá trị được liên kết với khóa đã bị xóa khỏi từ điển. Giá trị
này có thể được lưu trữ vào một biến bằng cách sử dụng câu lệnh gán hoặc giá trị này có
thể được sử dụng ở bất kỳ nơi nào khác cần giá trị, chẳng hạn như chuyển giá trị đó làm
đối số cho lệnh gọi hàm hoặc phương thức khác hoặc như một phần của biểu thức số học.

6.3 Các thao tác từ điển bổ sung

Một số chương trình thêm các cặp khóa-giá trị vào từ điển nơi khóa hoặc giá trị được đọc
từ người dùng. Khi tất cả các cặp khóa-giá trị đã được lưu trữ trong từ điển, có thể cần
phải xác định có bao nhiêu cặp, liệu một khóa cụ thể có trong từ điển hay không hoặc liệu
một giá trị cụ thể có trong từ điển hay không. Python cung cấp các hàm, phương thức và
toán tử cho phép chúng ta thực hiện các tác vụ này.

Hàm len, mà trước đây chúng ta đã sử dụng để xác định số phần tử trong danh sách, cũng
có thể được sử dụng để xác định có bao nhiêu cặp khóa-giá trị trong từ điển.
Từ điển được truyền dưới dạng đối số duy nhất cho hàm và số lượng cặp khóa-giá trị được
trả về dưới dạng kết quả của hàm. Hàm len trả về 0 nếu từ điển được truyền dưới dạng đối
số trống.
Toán tử in có thể được sử dụng để xác định xem một khóa hoặc giá trị cụ thể có xuất
hiện trong từ điển hay không. Khi tìm kiếm một khóa, khóa xuất hiện ở bên trái của toán
tử in và một từ điển xuất hiện ở bên phải của nó. Toán tử đánh giá là True nếu khóa có
trong từ điển. Nếu không, nó đánh giá là Sai. Kết quả trả về bởi toán tử in có thể được
sử dụng ở bất kỳ đâu cần giá trị Boolean, kể cả trong điều kiện của câu lệnh if hoặc vòng
lặp while.
Toán tử in được sử dụng cùng với phương thức giá trị để xác định xem một giá trị có
trong từ điển hay không. Giá trị đang được tìm kiếm xuất hiện ở bên trái của toán tử in
và một từ điển, với phương thức giá trị được áp dụng cho nó, xuất hiện ở bên phải của nó.
Ví dụ: đoạn mã sau xác định xem có bất kỳ giá trị nào trong từ điển d bằng với giá trị
hiện được lưu trữ trong biến x hay không.
Machine Translated by Google

6 từ điển

if x in d.values(): print("Ít

nhất một trong các giá trị trong d là", x) other: print("Không có giá trị
nào trong d là", x)

6.4 Vòng lặp và Từ điển

Vòng lặp for có thể được sử dụng để lặp lại tất cả các khóa trong từ điển, như minh họa bên dưới.

Một khóa khác với từ điển được lưu vào biến của vòng lặp for, k, mỗi khi thân vòng lặp thực thi.

# Tạo hằng từ điển =


{"pi": 3.14, "e": 2.71, "root 2": 1.41}

# In tất cả các khóa và giá trị với định dạng đẹp


cho k trong hằng số:
print("Giá trị liên quan đến", k, "là", hằng số[k])

Khi chương trình này thực thi, nó bắt đầu bằng cách tạo một từ điển mới chứa ba cặp khóa-giá

trị. Sau đó, vòng lặp for lặp lại các khóa trong từ điển. Khóa đầu tiên trong từ điển, là pi,

được lưu vào k và phần thân của vòng lặp sẽ thực thi. Nó in ra một thông báo có ý nghĩa bao gồm

cả số pi và giá trị của nó, là 3,14. Sau đó, điều khiển quay trở lại đầu vòng lặp và e được lưu

vào k.

Thân vòng lặp thực thi lần thứ hai và hiển thị thông báo cho biết giá trị của e là 2,71. Cuối

cùng, vòng lặp thực hiện lần thứ ba với k bằng căn 2 và thông báo cuối cùng được hiển thị.

Vòng lặp for cũng có thể được sử dụng để lặp lại các giá trị trong từ điển (thay vì các khóa).

Điều này được thực hiện bằng cách áp dụng phương thức giá trị không nhận đối số vào từ điển để

tạo tập hợp các giá trị được sử dụng bởi vòng lặp for. Ví dụ, chương trình sau tính tổng tất cả

các giá trị trong từ điển. Khi nó thực thi, constants.values() sẽ là một tập hợp bao gồm 3,14,

2,71 và 1,41. Mỗi giá trị này được lưu trữ trong v khi vòng lặp for chạy và điều này cho phép

tính tổng mà không cần sử dụng bất kỳ khóa nào của từ điển.

# Tạo hằng từ điển =


{"pi": 3.14, "e": 2.71, "root 2": 1.41}

# Tính tổng của tất cả các giá trị giá trị trong từ điển
tổng = 0

cho v trong hằng số.giá trị():


tổng = tổng + v

# Hiển thị tổng số


in("The total is", total)

Một số vấn đề liên quan đến từ điển được giải quyết tốt hơn với vòng lặp while so với vòng

lặp for. Ví dụ, chương trình sau sử dụng vòng lặp while để đọc chuỗi
Machine Translated by Google

6.4 Vòng lặp và Từ điển

từ người dùng cho đến khi 5 giá trị duy nhất được nhập vào. Sau đó, tất cả các chuỗi được
hiển thị với số lượng của chúng.

# Đếm số lần mỗi chuỗi được người dùng nhập vào counts = {}

# Lặp lại cho đến khi 5 chuỗi riêng biệt được nhập trong

khi len(counts) < 5: s = input("Nhập một chuỗi:")

# Nếu s đã là một khóa trong từ điển thì hãy tăng số lượng của nó lên 1. Nếu không, hãy thêm s
vào # từ điển với số lượng là 1.
nếu s được tính:

đếm[s] = đếm[s] + 1
khác:

đếm [s] = 1

# Hiển thị tất cả các chuỗi và số lượng của chúng


cho k trong số lượng:

print(k, "xảy ra", đếm[k], "lần")

Khi chương trình này thực thi, nó bắt đầu bằng cách tạo một từ điển trống. Sau đó, điều
kiện vòng lặp while được đánh giá. Nó xác định có bao nhiêu cặp khóa-giá trị trong từ điển
bằng hàm len. Vì số lượng cặp khóa-giá trị ban đầu là 0, điều kiện ước tính là True và phần
thân vòng lặp thực thi.
Mỗi khi thân vòng lặp thực thi, một chuỗi được đọc từ người dùng. Sau đó, toán tử in
được sử dụng để xác định xem chuỗi đã là khóa trong từ điển hay chưa.
Nếu vậy, số lượng được liên kết với khóa được tăng thêm một. Nếu không, chuỗi sẽ được thêm
vào từ điển dưới dạng một khóa mới có giá trị là 1. Vòng lặp tiếp tục thực hiện cho đến khi
từ điển chứa 5 cặp khóa-giá trị. Khi điều này xảy ra, tất cả các chuỗi do người dùng nhập
sẽ được hiển thị cùng với các giá trị được liên kết của chúng.

6.5 Từ điển dưới dạng đối số và giá trị trả về

Từ điển có thể được truyền dưới dạng đối số cho hàm, giống như giá trị của các loại khác.
Cũng giống như danh sách, một thay đổi được thực hiện đối với biến tham số chứa từ điển có
thể sửa đổi cả biến tham số và đối số được truyền cho hàm.
Ví dụ: chèn hoặc xóa một cặp khóa-giá trị sẽ sửa đổi cả biến tham số và đối số, cũng như
sửa đổi giá trị được liên kết với một khóa trong từ điển bằng cách sử dụng câu lệnh gán.
Tuy nhiên, một phép gán cho toàn bộ từ điển (trong đó chỉ tên của từ điển xuất hiện ở bên
trái của toán tử gán) chỉ tác động đến biến tham số. Nó không sửa đổi đối số được truyền
cho hàm. Cũng như các loại khác, từ điển được trả về từ một hàm sử dụng từ khóa return.
Machine Translated by Google

6 từ điển

6.6 Bài tập

Mặc dù nhiều bài tập trong chương này có thể được giải bằng các danh sách hoặc mệnh đề
if, nhưng hầu hết (hoặc thậm chí tất cả) chúng đều có cách giải phù hợp với từ điển. Do
đó, bạn nên sử dụng từ điển để giải tất cả các bài tập này thay vì (hoặc ngoài việc) sử
dụng các tính năng của Python mà bạn đã được giới thiệu trước đây.

Bài tập 1: Tra cứu ngược

Viết một hàm có tên là ReverseLookup để tìm tất cả các khóa trong từ điển ánh xạ tới một
giá trị cụ thể. Hàm sẽ lấy từ điển và giá trị để tìm kiếm làm tham số duy nhất của nó.
Nó sẽ trả về một danh sách các khóa (có thể trống) từ từ điển ánh xạ tới giá trị được
cung cấp.
Bao gồm một chương trình chính thể hiện chức năng ReverseLookup như một phần giải pháp
của bạn cho bài tập này. Chương trình của bạn sẽ tạo một từ điển và sau đó chỉ ra rằng
chức năng ReverseLookup hoạt động chính xác khi nó trả về nhiều khóa, một khóa và không
có khóa nào. Đảm bảo rằng chương trình chính của bạn chỉ chạy khi tệp chứa lời giải cho
bài tập này chưa được nhập vào chương trình khác.

Bài tập 2: Mô phỏng hai viên xúc xắc

Trong bài tập này, bạn sẽ mô phỏng 1.000 lần tung hai con xúc xắc. Bắt đầu bằng cách
viết một hàm mô phỏng tung một cặp xúc xắc sáu mặt. Hàm của bạn sẽ không nhận bất kỳ tham
số nào. Nó sẽ trả về tổng số được tung trên hai viên xúc xắc là kết quả duy nhất của nó.
Viết chương trình chính sử dụng chức năng của bạn để mô phỏng việc tung hai con xúc
xắc sáu mặt 1.000 lần. Khi chương trình của bạn chạy, nó sẽ đếm số lần mà mỗi tổng xảy
ra. Sau đó, nó sẽ hiển thị một bảng tóm tắt dữ liệu này. Biểu thị tần suất cho mỗi tổng
số dưới dạng phần trăm số lần cuộn được thực hiện. Chương trình của bạn cũng sẽ hiển thị
tỷ lệ phần trăm mà lý thuyết xác suất mong đợi cho mỗi tổng số. Đầu ra mẫu được hiển thị
bên dưới.

Tổng số Mô phỏng Dự kiến


Phần trăm Phần trăm

2 2,90 2,78
6,90 5,56
3 4 9,40 8,33
5 11,90 11,11
6 14,20 13,89
7 14,20 16,67
15,00 13,89
8 9 10,50 11.11
10 7,90 8,33
11 4,50 5,56
12 2,60 2,78
Machine Translated by Google

6.6 Bài tập

Bài tập 3: Tạo thẻ Bingo

Một thẻ Bingo bao gồm 5 cột gồm 5 số được đánh dấu bằng các chữ cái B, I, N, G
và O. Có 15 số có thể xuất hiện dưới mỗi chữ cái. Cụ thể, các số có thể xuất
hiện trong phạm vi B từ 1 đến 15, các số có thể xuất hiện trong phạm vi I từ 16
đến 30, các số có thể xuất hiện trong phạm vi N từ 31 đến 45, v.v.

Viết hàm tạo một thẻ Bingo ngẫu nhiên và lưu trữ nó trong từ điển. Các phím sẽ
là các chữ cái B, I, N, G và O. Các giá trị sẽ là danh sách năm số xuất hiện
dưới mỗi chữ cái. Viết hàm thứ hai hiển thị thẻ Bingo với các cột được gắn nhãn
thích hợp. Sử dụng các hàm này để viết chương trình hiển thị một thẻ Bingo ngẫu
nhiên. Đảm bảo rằng chương trình chính chỉ chạy khi tệp chứa giải pháp của bạn
chưa được nhập vào chương trình khác.

Bài tập 4: Ký tự độc đáo

Tạo chương trình xác định và hiển thị số lượng ký tự duy nhất trong một chuỗi do
người dùng nhập vào. Ví dụ, Xin chào, Thế giới! có 10 ký tự duy nhất trong khi zzzh
chỉ có một ký tự duy nhất. Sử dụng từ điển hoặc bộ để giải quyết vấn đề này.

Bài tập 5: Đảo ngữ

Hai từ được đảo chữ nếu chúng chứa tất cả các chữ cái giống nhau, nhưng theo một
thứ tự khác. Ví dụ: “evil” và “live” là đảo chữ cái vì mỗi từ chứa một chữ “e”, một
chữ “i”, một chữ “l” và một chữ “v”. Tạo chương trình đọc hai chuỗi từ người dùng,
xác định xem chúng có phải là đảo chữ cái hay không và báo cáo kết quả.
Machine Translated by Google

Tệp và ngoại lệ
7

Các chương trình mà chúng tôi đã tạo cho đến nay đã đọc tất cả thông tin đầu vào của chúng

từ bàn phím. Do đó, cần phải nhập lại tất cả các giá trị đầu vào mỗi khi chương trình chạy.

Điều này không hiệu quả, đặc biệt đối với các chương trình yêu cầu nhiều đầu vào. Tương tự

như vậy, các chương trình của chúng tôi đã hiển thị tất cả các kết quả của chúng trên màn hình.

Mặc dù điều này hoạt động tốt khi chỉ có một vài dòng đầu ra được in, nhưng sẽ không thực tế

đối với các kết quả lớn hơn di chuyển ra khỏi màn hình quá nhanh để đọc hoặc đối với đầu ra

cần các chương trình khác phân tích thêm. Viết chương trình sử dụng tệp hiệu quả sẽ cho phép
chúng tôi giải quyết tất cả những lo ngại này.

Các tập tin là tương đối lâu dài. Các giá trị được lưu trữ trong chúng được giữ lại sau

khi hoàn thành chương trình và khi tắt máy tính. Điều này làm cho chúng phù hợp để lưu trữ

các kết quả cần thiết trong một khoảng thời gian dài và để giữ các giá trị đầu vào cho một

chương trình sẽ chạy nhiều lần. Trước đây bạn đã từng làm việc với các tệp như tài liệu trình

xử lý văn bản, bảng tính, hình ảnh và video, trong số những tệp khác. Các chương trình Python

của bạn cũng được lưu trữ trong các tệp.

Các tệp thường được phân loại là tệp văn bản hoặc tệp nhị phân. Các tệp văn bản chỉ chứa

các chuỗi bit đại diện cho các ký tự sử dụng hệ thống mã hóa như ASCII hoặc UTF-8. Các tệp

này có thể được xem và sửa đổi bằng bất kỳ trình soạn thảo văn bản nào. Tất cả các chương

trình Python mà chúng tôi đã tạo đã được lưu dưới dạng tệp văn bản.

Giống như tệp văn bản, tệp nhị phân cũng chứa các chuỗi bit. Nhưng không giống như các

tệp văn bản, các chuỗi bit đó có thể đại diện cho bất kỳ loại dữ liệu nào. Chúng không chỉ

giới hạn ở các ký tự. Các tệp chứa dữ liệu hình ảnh, âm thanh và video thường là các tệp nhị

phân. Chúng tôi sẽ hạn chế làm việc với các tệp văn bản trong cuốn sách này vì chúng rất dễ

tạo và xem bằng trình soạn thảo yêu thích của bạn. Hầu hết các nguyên tắc được mô tả cho tệp

văn bản cũng có thể được áp dụng cho tệp nhị phân.
Machine Translated by Google

7 Tệp và Ngoại lệ

7.1 Mở tệp

Một tệp phải được mở trước khi có thể đọc các giá trị dữ liệu từ tệp đó. Cũng cần phải mở
một tệp trước khi các giá trị dữ liệu mới được ghi vào tệp đó. Các tệp được mở bằng cách
gọi chức năng mở.

Hàm mở có hai đối số. Đối số đầu tiên là một chuỗi chứa tên của tệp sẽ được mở. Đối
số thứ hai cũng là một chuỗi. Nó chỉ ra chế độ truy cập cho tập tin. Các chế độ truy cập
mà chúng ta sẽ thảo luận bao gồm đọc (ký hiệu là "r"), viết (ký hiệu là "w") và nối thêm

(ký hiệu là "a").


Một đối tượng tập tin được trả về bởi chức năng mở. Kết quả là, chức năng mở là
thường được gọi ở phía bên phải của câu lệnh gán, như hình dưới đây:

inf = open("input.txt", "r")

Khi tệp đã được mở, các phương thức có thể được áp dụng cho đối tượng tệp để đọc dữ
liệu từ tệp. Tương tự, dữ liệu được ghi vào tệp bằng cách áp dụng các phương thức thích
hợp cho đối tượng tệp. Các phương pháp này được mô tả trong các phần tiếp theo. Tệp phải
được đóng lại sau khi tất cả các giá trị đã được đọc hoặc ghi. Điều này được thực hiện
bằng cách áp dụng phương thức đóng cho đối tượng tệp.

7.2 Đọc đầu vào từ tệp

Có một số phương pháp có thể được áp dụng cho đối tượng tệp để đọc dữ liệu từ tệp. Các
phương pháp này chỉ có thể được áp dụng khi tệp đã được mở ở chế độ đọc.
Cố gắng đọc từ một tệp đã được mở ở chế độ ghi hoặc chế độ chắp thêm sẽ khiến chương
trình của bạn gặp sự cố.
Phương thức readline đọc một dòng từ tệp và trả về nó dưới dạng một chuỗi, giống như
hàm input đọc một dòng văn bản được nhập trên bàn phím. Mỗi lệnh gọi readline tiếp theo
sẽ đọc một dòng khác từ tệp theo trình tự từ đầu tệp đến cuối tệp. Phương thức readline
trả về một chuỗi rỗng khi không có thêm dữ liệu để đọc từ tệp.

Hãy xem xét một tệp dữ liệu chứa một danh sách dài các số, mỗi số xuất hiện trên một
dòng riêng. Chương trình sau đây tính tổng tất cả các số trong một tệp như vậy.

# Đọc tên tệp từ người dùng và mở tệp fname =


input("Nhập tên tệp: ") inf = open(fname, "r")

# Khởi tạo tổng tổng = 0

# Tổng các giá trị trong tệp

line = inf.readline() while line !=


"": total = total + float(line) line

= inf.readline()
Machine Translated by Google

7.2 Đọc đầu vào từ tệp

# Đóng tệp

inf.close()

# Hiển thị kết quả

print("Tổng các giá trị trong", fname, "is", total)

Chương trình này bắt đầu bằng cách đọc tên của tệp từ người dùng. Khi tên đã
được đọc, tệp được mở để đọc và đối tượng tệp được lưu trữ trong inf. Sau đó, tổng
số được khởi tạo thành 0 và dòng đầu tiên được đọc từ tệp.
Điều kiện trên vòng lặp while được đánh giá tiếp theo. Nếu dòng đầu tiên được
đọc từ tệp không trống, thì phần thân của vòng lặp sẽ thực thi. Nó chuyển đổi dòng
được đọc từ tệp thành một số dấu phẩy động và thêm nó vào tổng số. Sau đó, dòng
tiếp theo được đọc từ tệp. Nếu tệp chứa nhiều dữ liệu hơn thì biến dòng sẽ chứa

dòng tiếp theo trong tệp, điều kiện vòng lặp while sẽ đánh giá là True và vòng lặp
sẽ thực thi lại khiến một giá trị khác được thêm vào tổng.
Tại một số điểm, tất cả dữ liệu sẽ được đọc từ tệp. Khi điều này xảy ra, phương
thức readline sẽ trả về một chuỗi trống sẽ được lưu vào dòng.
Điều này sẽ khiến điều kiện trên vòng lặp while đánh giá là Sai và khiến vòng lặp
kết thúc. Sau đó, chương trình sẽ tiếp tục và hiển thị tổng.
Đôi khi sẽ hữu ích khi đọc tất cả dữ liệu từ một tệp cùng một lúc thay vì đọc
từng dòng một. Điều này có thể được thực hiện bằng cách sử dụng phương thức read
hoặc phương thức readlines. Phương thức read trả về toàn bộ nội dung của tệp dưới

dạng một chuỗi (có thể rất dài). Sau đó, quá trình xử lý tiếp theo thường được thực
hiện để chia chuỗi thành các phần nhỏ hơn. Phương thức readlines trả về một danh
sách trong đó mỗi phần tử là một dòng từ tệp. Khi tất cả các dòng được đọc bằng

readlines, một vòng lặp có thể được sử dụng để xử lý từng phần tử trong danh sách.
Chương trình sau sử dụng đường đọc để tính tổng của tất cả các số trong một tệp.
Nó đọc tất cả dữ liệu từ tệp cùng một lúc thay vì cộng từng số vào tổng số khi nó được đọc.

# Đọc tên tệp từ người dùng và mở tệp fname = input("Nhập

tên tệp: ") inf = open(fname, "r")

# Khởi tạo tổng và đọc tất cả các dòng từ tập tin total = 0

lines = inf.readlines()

# Tổng các giá trị trong tệp cho

dòng theo dòng: tổng = tổng +

float(dòng)

# Đóng tệp

inf.close()

# Hiển thị kết quả

print("Tổng các giá trị trong", fname, "is", total)

7.3 Ký tự cuối dòng

Ví dụ sau sử dụng phương thức readline để đọc và hiển thị tất cả các dòng trong
một tệp. Trước mỗi dòng là số dòng và dấu hai chấm khi nó được in.
Machine Translated by Google

7 Tệp và Ngoại lệ

# Đọc tên file từ người dùng và mở file fname = input("Nhập

tên file để hiển thị: ") inf = open(fname, "r")

# Khởi tạo số dòng num = 1

# Hiển thị từng dòng trong tệp, trước số dòng của nó line =
inf.readline()
trong khi dòng != "":

print("%d: %s" % (i, dòng))

# Tăng số dòng và đọc dòng tiếp theo

số = số + 1

dòng = inf.readline()

# Đóng tệp

inf.close()

Khi bạn chạy chương trình này, bạn có thể ngạc nhiên với đầu ra của nó. Cụ thể, mỗi khi

một dòng từ tệp được in, một dòng thứ hai trống sẽ được in ngay sau dòng đó. Điều này xảy ra
vì mỗi dòng trong tệp văn bản kết thúc bằng một hoặc nhiều ký tự

biểu thị phần cuối của dòng.1 Các ký tự như vậy là cần thiết để bất kỳ chương trình nào đọc

tệp có thể xác định nơi một dòng kết thúc và dòng tiếp theo bắt đầu. Nếu không có chúng, tất

cả các ký tự trong tệp văn bản sẽ xuất hiện trên cùng một dòng khi chương trình của bạn đọc

chúng (hoặc khi được tải vào trình soạn thảo văn bản yêu thích của bạn).

Có thể xóa điểm đánh dấu cuối dòng khỏi chuỗi đã được đọc từ tệp bằng cách gọi phương

thức rstrip. Phương pháp này, có thể được áp dụng cho bất kỳ chuỗi nào, xóa mọi ký tự khoảng

trắng (dấu cách, tab và dấu cuối dòng) khỏi đầu bên phải của chuỗi. Một bản sao mới của

chuỗi với các ký tự như vậy đã bị xóa (nếu có) được phương thức trả về.

Phiên bản cập nhật của chương trình đánh số dòng được hiển thị bên dưới. Nó sử dụng

phương pháp rstrip để loại bỏ các điểm đánh dấu cuối dòng và do đó, không bao gồm các dòng

trống được phiên bản trước hiển thị không chính xác.

# Đọc tên file từ người dùng và mở file fname = input("Nhập

tên file để hiển thị: ") inf = open(fname, "r")

# Khởi tạo số dòng

số = 1

# Hiển thị từng dòng trong tệp, trước số dòng của nó line =
inf.readline() while line != "":

# Xóa điểm đánh dấu cuối dòng và hiển thị dòng đứng trước số dòng của nó line = line.rstrip()

print("%d: %s" % (i, line))

1Ký tự hoặc chuỗi ký tự được sử dụng để biểu thị phần cuối của một dòng trong tệp văn bản khác nhau
tùy theo hệ điều hành. May mắn thay, Python tự động xử lý những khác biệt này và cho phép các tệp văn
bản được tạo trên bất kỳ hệ điều hành được sử dụng rộng rãi nào được tải bởi các chương trình Python
chạy trên bất kỳ hệ điều hành được sử dụng rộng rãi nào khác.
Machine Translated by Google

7.3 Ký tự cuối dòng

# Tăng số dòng và đọc dòng tiếp theo

số = số + 1

dòng = inf.readline()

# Đóng tệp

inf.close()

7.4 Ghi đầu ra vào tệp

Khi một tệp được mở ở chế độ ghi, một tệp trống mới sẽ được tạo. Nếu tệp đã tồn tại
thì tệp hiện có sẽ bị hủy và mọi dữ liệu chứa trong đó sẽ bị mất. Việc mở một tệp đã
tồn tại ở chế độ nối thêm sẽ khiến mọi dữ liệu được ghi vào tệp được thêm vào cuối
tệp. Nếu một tệp được mở ở chế độ chắp thêm không tồn tại thì một tệp trống mới sẽ
được tạo.
Phương thức ghi có thể được sử dụng để ghi dữ liệu vào tệp được mở ở chế độ ghi
hoặc chế độ chắp thêm. Nó nhận một đối số, phải là một chuỗi, sẽ được ghi vào tệp.
Các giá trị của các loại khác có thể được chuyển đổi thành một chuỗi bằng cách gọi
hàm str. Có thể ghi nhiều giá trị vào tệp bằng cách nối tất cả các mục thành một
chuỗi dài hơn hoặc bằng cách gọi phương thức ghi nhiều lần.
Không giống như hàm in, phương thức ghi không tự động chuyển sang dòng tiếp theo
sau khi viết một giá trị. Kết quả là, người ta phải viết rõ ràng một điểm đánh dấu
cuối dòng vào tệp giữa các giá trị nằm trên các dòng khác nhau. Python sử dụng \n để
biểu thị điểm đánh dấu cuối dòng. Cặp ký tự này, được gọi là chuỗi thoát, có thể tự
xuất hiện trong một chuỗi hoặc \n có thể xuất hiện dưới dạng một phần của chuỗi dài hơn.
Chương trình sau đây ghi các số từ 1 đến (và bao gồm) một số do người dùng nhập
vào một tệp. Nối chuỗi và chuỗi thoát \n được sử dụng để mỗi số được viết trên dòng
riêng của nó.

# Đọc tên tệp từ người dùng và mở tệp fname = input("Số sẽ

được lưu ở đâu?") outf = open(fname, "w")

# Đọc giá trị lớn nhất sẽ được ghi

giới hạn = int(input(" Giá trị lớn nhất là bao nhiêu?"))

# Viết các số vào tệp với một số trên mỗi dòng

cho num trong phạm vi (1, giới hạn + 1):

outf.write(str(num) + "\n")

# Đóng tệp

outf.close()

7.5 Đối số dòng lệnh

Các chương trình máy tính thường được thực hiện bằng cách nhấp vào biểu tượng hoặc
chọn một mục từ menu. Các chương trình cũng có thể được bắt đầu từ dòng lệnh bằng
cách nhập một lệnh thích hợp vào cửa sổ dấu nhắc lệnh hoặc thiết bị đầu cuối. Ví dụ, trên
Machine Translated by Google

7 Tệp và Ngoại lệ

nhiều hệ điều hành, chương trình Python được lưu trữ trong test.py có thể được thực
thi bằng cách nhập test.py hoặc python test.py trong cửa sổ như vậy.
Bắt đầu một chương trình từ dòng lệnh cung cấp một cơ hội mới để cung cấp đầu vào
cho nó. Các giá trị mà chương trình cần để thực hiện tác vụ của nó có thể là một phần
của lệnh được sử dụng để khởi động chương trình bằng cách đưa chúng vào dòng lệnh sau
tên của tệp .py. Khả năng cung cấp đầu vào như một phần của lệnh được sử dụng để khởi
động chương trình đặc biệt có lợi khi viết tập lệnh sử dụng nhiều chương trình để tự
động hóa một số tác vụ và cho các chương trình được lên lịch chạy định kỳ.
Bất kỳ đối số dòng lệnh nào được cung cấp khi chương trình được thực thi đều được
lưu vào một biến có tên argv (vectơ đối số) nằm trong mô-đun sys (hệ thống). Biến này
là một danh sách và mỗi phần tử trong danh sách là một chuỗi. Các phần tử trong danh
sách có thể được chuyển đổi sang các loại khác bằng cách gọi các hàm chuyển đổi loại
thích hợp như int và float. Phần tử đầu tiên trong vectơ đối số là tên của tệp nguồn
Python đang được thực thi. Các phần tử tiếp theo trong danh sách là các giá trị được
cung cấp trên dòng lệnh sau tên của tệp Python (nếu có).

Chương trình sau minh họa cách truy cập vào vectơ đối số. Nó bắt đầu bằng cách báo
cáo số đối số dòng lệnh được cung cấp cho chương trình và tên của tệp nguồn đang được
thực thi. Sau đó, nó tiếp tục và hiển thị các đối số xuất hiện sau tên của tệp nguồn
nếu các giá trị đó được cung cấp.
Nếu không, một thông báo sẽ hiển thị cho biết rằng không có đối số dòng lệnh nào
ngoài tệp .py đang được thực thi.

# Mô-đun hệ thống phải được nhập để truy cập đối số dòng lệnh nhập sys

# Hiển thị số đối số dòng lệnh (bao gồm cả tệp .py) print("Chương trình có",
len(sys.argv), \ "(các) đối số dòng lệnh.")

# Hiển thị tên của tệp .py print("Tên


của tệp .py là", sys.argv[0])

# Xác định xem có các đối số bổ sung để hiển thị hay không nếu len(sys.argv)
> 1: # Hiển thị tất cả các đối số dòng lệnh ngoài tên của tệp .py
print("Các đối số còn lại là:") for i in phạm vi (1, len (sys.argv)): in (" ",
sys.argv [i])

khác:

print("Không có đối số bổ sung nào được cung cấp.")

Các đối số dòng lệnh có thể được sử dụng để cung cấp bất kỳ giá trị đầu vào nào
cho chương trình có thể được nhập trên dòng lệnh, chẳng hạn như số nguyên, số dấu
phẩy động và chuỗi. Những giá trị này sau đó có thể được sử dụng giống như bất kỳ giá
trị nào khác trong chương trình. Ví dụ: các dòng mã sau đây là phiên bản sửa đổi của
chương trình tính tổng tất cả các số trong một tệp. Trong phiên bản này của chương
trình, tên của tệp được cung cấp dưới dạng đối số dòng lệnh thay vì được đọc từ bàn phím.
Machine Translated by Google

7.5 Đối số dòng lệnh

# Nhập mô-đun hệ thống nhập sys

# Đảm bảo rằng chương trình đã được bắt đầu với một đối số dòng lệnh ngoài tên của tệp .py if

len(sys.argv) != 2: print(" Phải cung cấp tên tệp dưới dạng dòng lệnh", \ "đối số .") từ bỏ()

# Mở tệp được liệt kê ngay sau tệp .py trên dòng lệnh inf = open(sys.argv[1], "r")

# Khởi tạo tổng tổng = 0

# Tổng các giá trị trong tệp

line = inf.readline() while line !=


"": total = total + float(line) line

= inf.readline()

# Đóng tệp

inf.close()

# Hiển thị kết quả

print("Tổng giá trị trong", sys.argv[1], "is", total)

7.6 Ngoại lệ

Có nhiều điều có thể xảy ra sai sót khi chương trình đang chạy: Người dùng có thể cung
cấp một giá trị không phải là số khi giá trị số được mong đợi, người dùng có thể nhập một
giá trị khiến chương trình chia cho 0 hoặc người dùng có thể thử để mở một tệp không tồn
tại, trong số nhiều khả năng khác. Tất cả các lỗi này là ngoại lệ.
Theo mặc định, chương trình Python gặp sự cố khi xảy ra ngoại lệ. Tuy nhiên, chúng tôi có
thể ngăn chương trình của mình bị lỗi bằng cách bắt ngoại lệ và thực hiện các hành động
thích hợp để khôi phục từ đó.

Lập trình viên phải chỉ ra nơi có thể xảy ra ngoại lệ để bắt nó.
Người đó cũng phải chỉ ra mã nào sẽ chạy để xử lý ngoại lệ khi nó xảy ra.
Các tác vụ này được hoàn thành bằng cách sử dụng hai từ khóa mà chúng ta chưa thấy: thử
và ngoại trừ. Mã có thể gây ra ngoại lệ mà chúng tôi muốn bắt được đặt bên trong khối
thử. Ngay sau khối thử là một hoặc nhiều khối ngoại trừ. Khi một ngoại lệ xảy ra bên
trong khối try, việc thực thi sẽ ngay lập tức chuyển sang khối except thích hợp mà không
chạy bất kỳ câu lệnh nào còn lại trong khối try.

Mỗi khối ngoại trừ có thể chỉ định ngoại lệ cụ thể mà nó bắt được. Điều này được thực
hiện bằng cách bao gồm loại ngoại lệ ngay sau từ khóa except. Một khối như vậy chỉ thực
thi khi xảy ra ngoại lệ của loại được chỉ định.
Một khối ngoại trừ không chỉ định một ngoại lệ cụ thể sẽ bắt bất kỳ loại nào
Machine Translated by Google

7 Tệp và Ngoại lệ

của ngoại lệ (không bị bắt bởi một khối ngoại trừ khác được liên kết với cùng một
khối thử). Các khối ngoại trừ chỉ thực hiện khi một ngoại lệ xảy ra. Nếu khối thử
thực thi mà không đưa ra ngoại lệ thì tất cả các khối ngoại trừ sẽ bị bỏ qua và
quá trình thực thi tiếp tục với dòng mã đầu tiên sau khối ngoại trừ cuối cùng.

Tất cả các chương trình mà chúng tôi đã xem xét trong các phần trước đều bị
lỗi khi người dùng cung cấp tên của tệp không tồn tại. Sự cố này xảy ra do một
ngoại lệ FileNotFoundError đã được đưa ra mà không bị bắt. Đoạn mã sau sử dụng
khối thử và khối ngoại trừ để bắt ngoại lệ này và hiển thị thông báo lỗi có ý
nghĩa khi nó xảy ra. Đoạn mã này có thể được theo sau bởi bất kỳ mã bổ sung nào
cần thiết để đọc và xử lý dữ liệu trong tệp.

# Đọc tên tệp từ người dùng


fname = input("Nhập tên tập tin: ")

# Cố gắng mở tệp thử: inf


= open(fname, "r") except
FileNotFoundError:

# Hiển thị thông báo lỗi và thoát nếu tệp không được mở thành công
print("'%s' không thể mở được. Đang thoát...") quit()

Phiên bản hiện tại của chương trình của chúng tôi thoát khi tệp được người
dùng yêu cầu không tồn tại. Mặc dù điều đó có thể ổn trong một số trường hợp,
nhưng có những lúc khác, tốt hơn là nên nhắc người dùng nhập lại tên tệp. Tên tệp
thứ hai do người dùng nhập cũng có thể gây ra ngoại lệ. Do đó, một vòng lặp phải
được sử dụng để chạy cho đến khi người dùng nhập tên của tệp được mở thành công.
Điều này được thể hiện qua chương trình sau. Lưu ý rằng khối try và khối except
đều nằm trong vòng lặp while.

# Đọc tên tệp từ người dùng


fname = input("Nhập tên tập tin: ")

file_opened = Sai trong khi


file_opened == Sai:
# Cố gắng mở tệp thử: inf
= open(fname, "r")
file_opened = True ngoại trừ
FileNotFoundError:

# Hiển thị thông báo lỗi và đọc tên tệp khác nếu tệp không được mở #
thành công print("Không tìm thấy '%s'. Vui lòng thử lại.") fname =
input("Nhập tên tệp: ")

Khi chương trình này chạy, nó bắt đầu bằng cách đọc tên tệp từ người dùng. Sau
đó, biến file_opened được đặt thành Sai và vòng lặp chạy lần đầu tiên. Hai dòng
mã nằm trong khối thử bên trong phần thân của vòng lặp. Những nỗ lực đầu tiên để mở
Machine Translated by Google

7.6 Ngoại lệ

tệp do người dùng chỉ định. Nếu tệp không tồn tại thì một ngoại lệ FileNotFoundError được đưa ra

và thực thi ngay lập tức chuyển sang khối ngoại trừ, bỏ qua dòng thứ hai trong khối thử. Khi khối

ngoại trừ thực thi, nó sẽ hiển thị thông báo lỗi và đọc tên tệp khác từ người dùng.

Quá trình thực thi tiếp tục bằng cách quay lại đầu vòng lặp và đánh giá lại tình trạng của nó.

Điều kiện vẫn đánh giá là Sai vì biến file_opened vẫn là Sai. Kết quả là, phần thân của vòng lặp

thực thi lần thứ hai và chương trình thực hiện một nỗ lực khác để mở tệp bằng cách sử dụng tên tệp

được nhập gần đây nhất.

Nếu tệp đó không tồn tại thì chương trình sẽ tiến triển như mô tả trong đoạn trước. Nhưng nếu tệp

tồn tại, lệnh gọi mở hoàn tất thành công và quá trình thực thi tiếp tục với dòng tiếp theo trong

khối thử. Dòng này đặt file_opened thành True. Sau đó, khối ngoại trừ bị bỏ qua vì không có ngoại

lệ nào được đưa ra trong khi thực hiện khối thử. Cuối cùng, vòng lặp kết thúc vì file_opened được

đặt thành True và quá trình thực thi tiếp tục với phần còn lại của chương trình.

Các khái niệm được giới thiệu trong phần này có thể được sử dụng để phát hiện và phản hồi nhiều

loại lỗi có thể xảy ra khi chương trình đang chạy. Bằng cách tạo các khối thử và ngoại trừ, chương

trình của bạn có thể phản hồi các lỗi này theo cách thích hợp thay vì gặp sự cố.

7.7 Bài tập

Nhiều bài tập trong chương này đọc dữ liệu từ một tệp. Trong một số trường hợp, bất kỳ tệp văn bản

nào cũng có thể được sử dụng làm đầu vào. Trong các trường hợp khác, các tệp đầu vào thích hợp có

thể được tạo dễ dàng trong trình soạn thảo văn bản yêu thích của bạn. Ngoài ra còn có một số bài
tập yêu cầu bộ dữ liệu cụ thể như danh sách các từ, tên hoặc nguyên tố hóa học. Các bộ dữ liệu này
có thể được tải xuống từ trang web của tác giả:

Bài tập 1: Hiển thị phần đầu của tệp

Các hệ điều hành dựa trên Unix thường bao gồm một công cụ có tên là head. Nó hiển thị 10 dòng đầu

tiên của tệp có tên được cung cấp dưới dạng đối số dòng lệnh. Viết chương trình Python cung cấp

hành vi tương tự. Hiển thị thông báo lỗi thích hợp nếu tệp do người dùng yêu cầu không tồn tại

hoặc nếu đối số dòng lệnh bị bỏ qua.


Machine Translated by Google

7 Tệp và Ngoại lệ

Bài tập 2: Hiển thị đuôi tệp

Các hệ điều hành dựa trên Unix cũng thường bao gồm một công cụ có tên là tail. Nó hiển thị
10 dòng cuối cùng của tệp có tên được cung cấp dưới dạng đối số dòng lệnh.
Viết chương trình Python cung cấp hành vi tương tự. Hiển thị thông báo lỗi thích hợp nếu
tệp do người dùng yêu cầu không tồn tại hoặc nếu đối số dòng lệnh bị bỏ qua.

Có một số cách tiếp cận khác nhau có thể được thực hiện để giải quyết vấn đề này.
Một tùy chọn là tải toàn bộ nội dung của tệp vào một danh sách rồi hiển thị 10 phần tử
cuối cùng của nó. Một tùy chọn khác là đọc nội dung của tệp hai lần, một lần để đếm số
dòng và lần thứ hai để hiển thị 10 dòng cuối cùng của nó. Tuy nhiên, cả hai giải pháp này
đều không mong muốn khi làm việc với các tệp lớn. Có một giải pháp khác chỉ yêu cầu bạn
đọc tệp một lần và chỉ yêu cầu bạn lưu trữ 10 dòng từ tệp cùng một lúc. Đối với một thách
thức bổ sung, phát triển một giải pháp như vậy.

Bài tập 3: Nối nhiều tệp

Các hệ điều hành dựa trên Unix thường bao gồm một công cụ có tên là cat, viết tắt của
concatenate. Mục đích của nó là để hiển thị nối của một hoặc nhiều tệp có tên được cung
cấp dưới dạng đối số dòng lệnh. Các tệp được hiển thị theo thứ tự giống như chúng xuất hiện
trên dòng lệnh.
Tạo một chương trình Python thực hiện nhiệm vụ này. Nó sẽ tạo ra một thông báo lỗi thích
hợp cho bất kỳ tệp nào không thể hiển thị, sau đó chuyển sang tệp tiếp theo.
Hiển thị thông báo lỗi thích hợp nếu chương trình của bạn khởi động mà không có bất kỳ đối
số dòng lệnh nào.

You might also like