Để viết các chương trình hữu ích, hầu như chúng ta luôn cần khả năng kiểm tra các điều kiện và thay đổi hành vi của chương trình cho phù hợp. Câu lệnh điều kiện cho chúng ta khả năng này. Dạng đơn giản nhất là câu lệnh if, có dạng tổng quát
if BOOLEAN EXPRESSION: STATEMENTS
Một số điều quan trọng cần lưu ý về câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6
Dấu hai chấm [
if True: # This is always true pass # so this is always executed, but it does nothing else: pass
8] là quan trọng và bắt buộc. Nó tách phần đầu của câu lệnh ghép khỏi phần thânDòng sau dấu hai chấm phải được thụt vào. Tiêu chuẩn trong Python là sử dụng bốn khoảng trắng để thụt lề
Tất cả các dòng được thụt vào cùng một lượng sau dấu hai chấm sẽ được thực thi bất cứ khi nào BOOLEAN EXPRESSION là true
Đây là một ví dụ
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]
Biểu thức boolean sau câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6 được gọi là điều kiện. Nếu nó đúng, thì tất cả các câu lệnh thụt lề sẽ được thực thi. Điều gì xảy ra nếu điều kiện sai và
if x y: STATEMENTS_B else: STATEMENTS_C0 không bằng
if x y: STATEMENTS_B else: STATEMENTS_C1?
Chạy mã ví dụ này và xem điều gì sẽ xảy ra. Sau đó, thay đổi giá trị của
if x y: STATEMENTS_B else: STATEMENTS_C0 thành giá trị khác với
if x y: STATEMENTS_B else: STATEMENTS_C1 và chạy lại, xác nhận rằng bạn không nhận được bất kỳ kết quả nào
Lưu đồ của câu lệnh if
Cũng như câu lệnh
if x y: STATEMENTS_B else: STATEMENTS_C5 ở chương trước, câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6 là câu lệnh ghép. Câu lệnh ghép bao gồm một dòng tiêu đề và một phần thân. Dòng tiêu đề của câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6 bắt đầu bằng từ khóa
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6 theo sau là một biểu thức boolean và kết thúc bằng dấu hai chấm [
if True: # This is always true pass # so this is always executed, but it does nothing else: pass8]
Các câu lệnh thụt lề theo sau được gọi là một khối. Câu lệnh không thụt lề đầu tiên đánh dấu sự kết thúc của khối. Mỗi câu lệnh bên trong khối phải có cùng một vết lõm
Thụt lề và PEP 8 Python Style Guide
Cộng đồng Python đã phát triển Hướng dẫn về Phong cách cho Mã Python, thường được gọi đơn giản là “PEP 8”. Đề xuất cải tiến Python, hoặc PEP, là một phần của quy trình mà cộng đồng Python sử dụng để thảo luận và áp dụng các thay đổi đối với ngôn ngữ
PEP 8 khuyến nghị sử dụng 4 khoảng trắng cho mỗi mức thụt đầu dòng. Chúng tôi sẽ làm theo điều này [và các khuyến nghị PEP 8 khác] trong cuốn sách này
Để giúp chúng tôi học cách viết mã Python có kiểu dáng đẹp, có một chương trình tên là pep8 hoạt động như một trình kiểm tra hướng dẫn kiểu dáng tự động cho mã nguồn Python.
if True: # This is always true pass # so this is always executed, but it does nothing else: pass50 có thể cài đặt dưới dạng gói trên các hệ thống GNU/Linux dựa trên Debian như Ubuntu
Trong phần Vim của phụ lục, Định cấu hình Ubuntu để phát triển web Python, there is instruction on configuring vim to run
if True: # This is always true pass # so this is always executed, but it does nothing else: pass50 on your source code with the push of a button.
4. 1. 2. Câu lệnh if True: # This is always true
pass # so this is always executed, but it does nothing
else:
pass
52¶
Thường xảy ra trường hợp bạn muốn điều này xảy ra khi điều kiện đó đúng và điều khác xảy ra khi điều kiện đó sai. Đối với điều đó, chúng tôi có tuyên bố
if True: # This is always true pass # so this is always executed, but it does nothing else: pass52
if True: # This is always true pass # so this is always executed, but it does nothing else: pass9
Ở đây, câu lệnh in đầu tiên sẽ được thực thi nếu
if x y: STATEMENTS_B else: STATEMENTS_C0 bằng với
if x y: STATEMENTS_B else: STATEMENTS_C1 và câu lệnh in được thụt vào dưới mệnh đề
if True: # This is always true pass # so this is always executed, but it does nothing else: pass56 sẽ được thực thi khi nó không bằng
Lưu đồ câu lệnh if other
Cú pháp của câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass52 trông như thế này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass4
Mỗi câu lệnh bên trong khối
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6 của câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass52 được thực thi theo thứ tự nếu biểu thức boolean ước tính là
if True: # This is always true pass # so this is always executed, but it does nothing else: pass70. Toàn bộ khối câu lệnh bị bỏ qua nếu biểu thức boolean ước tính là
if True: # This is always true pass # so this is always executed, but it does nothing else: pass71 và thay vào đó, tất cả các câu lệnh trong mệnh đề
if True: # This is always true pass # so this is always executed, but it does nothing else: pass56 được thực thi
Không có giới hạn về số lượng câu lệnh có thể xuất hiện dưới hai mệnh đề của câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass52, nhưng phải có ít nhất một câu lệnh trong mỗi khối. Đôi khi, sẽ rất hữu ích nếu có một phần không có câu lệnh nào [thường là để giữ chỗ, hoặc tạo khung cho đoạn mã bạn chưa viết]. Trong trường hợp đó, bạn có thể sử dụng câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass74, câu lệnh này không làm gì khác ngoài việc đóng vai trò giữ chỗ
if True: # This is always true pass # so this is always executed, but it does nothing else: pass
Thuật ngữ Python
Tài liệu Python đôi khi sử dụng thuật ngữ bộ câu lệnh để chỉ cái mà chúng ta gọi là khối ở đây. Chúng có nghĩa giống nhau và vì hầu hết các ngôn ngữ khác và các nhà khoa học máy tính đều sử dụng khối từ, chúng tôi sẽ gắn bó với điều đó
Cũng lưu ý rằng
if True: # This is always true pass # so this is always executed, but it does nothing else: pass56 không phải là một câu lệnh. Câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6 có hai mệnh đề, một trong số đó là mệnh đề [tùy chọn]
if True: # This is always true pass # so this is always executed, but it does nothing else: pass56. Tài liệu Python gọi cả hai biểu mẫu, cùng với biểu mẫu tiếp theo mà chúng ta sắp gặp, câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6
4. 2. Câu điều kiện theo chuỗi¶
Đôi khi có nhiều hơn hai khả năng và chúng ta cần nhiều hơn hai nhánh. Một cách để thể hiện một tính toán như vậy là một chuỗi điều kiện
if x y: STATEMENTS_B else: STATEMENTS_C
Lưu đồ của chuỗi điều kiện này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass79 là viết tắt của
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]90. Một lần nữa, chính xác một nhánh sẽ được thực thi. Không có giới hạn về số lượng câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass79 nhưng chỉ cho phép một câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass56 cuối cùng [và tùy chọn] duy nhất và nó phải là nhánh cuối cùng trong câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass5
Mỗi điều kiện được kiểm tra theo thứ tự. Nếu cái đầu tiên là sai, cái tiếp theo sẽ được chọn, v.v. Nếu một trong số chúng là đúng, thì nhánh tương ứng sẽ thực thi và câu lệnh kết thúc. Ngay cả khi có nhiều hơn một điều kiện là đúng, thì chỉ có nhánh đúng đầu tiên được thực thi
4. 3. Điều kiện lồng nhau¶
Một điều kiện cũng có thể được lồng trong một điều kiện khác. [Đó là cùng một chủ đề về khả năng kết hợp, một lần nữa. ] Chúng ta có thể viết ví dụ trước như sau
Lưu đồ của điều kiện lồng nhau này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass7
Điều kiện bên ngoài chứa hai nhánh. Nhánh thứ hai chứa một câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6 khác, có hai nhánh riêng. Hai nhánh đó cũng có thể chứa các câu điều kiện
Mặc dù việc thụt lề của các câu lệnh làm cho cấu trúc trở nên rõ ràng, nhưng các điều kiện lồng nhau rất nhanh trở nên khó đọc. Nói chung, nên tránh chúng khi bạn có thể
Các toán tử logic thường cung cấp một cách để đơn giản hóa các câu lệnh điều kiện lồng nhau. Ví dụ: chúng ta có thể viết lại đoạn mã sau bằng cách sử dụng một điều kiện duy nhất
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]9
Hàm
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]94 chỉ được gọi nếu chúng ta vượt qua cả hai điều kiện, vì vậy chúng ta có thể sử dụng toán tử
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]95
if True: # This is always true pass # so this is always executed, but it does nothing else: pass8
Ghi chú
Python thực sự cho phép một biểu mẫu viết tay ngắn cho việc này, vì vậy cách sau cũng sẽ hoạt động
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]0
4. 4. Lặp lại¶
Máy tính thường được sử dụng để tự động hóa các công việc lặp đi lặp lại. Lặp lại các tác vụ giống hệt hoặc tương tự nhau mà không mắc lỗi là điều mà máy tính làm tốt còn con người thì làm kém
Việc thực hiện lặp đi lặp lại một tập hợp các câu lệnh được gọi là phép lặp. Python có hai câu lệnh để lặp lại – câu lệnh
if x y: STATEMENTS_B else: STATEMENTS_C5 mà chúng ta đã gặp ở chương trước và câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97
Trước khi xem xét những điều đó, chúng ta cần xem lại một vài ý tưởng
4. 4. 1. Chỉ định lại¶
Như chúng ta đã thấy trong phần Biến là biến , việc gán nhiều hơn một lần cho cùng một biến là hợp pháp. Một nhiệm vụ mới làm cho một biến hiện có tham chiếu đến một giá trị mới [và ngừng tham chiếu đến giá trị cũ].
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]1
Đầu ra của chương trình này là
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]2
bởi vì lần đầu tiên
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]98 được in, giá trị của nó là 5 và lần thứ hai, giá trị của nó là 7
Đây là giao diện của sự phân công lại trong ảnh chụp nhanh trạng thái
Với phép gán lại, điều đặc biệt quan trọng là phải phân biệt giữa câu lệnh gán và biểu thức boolean kiểm tra sự bằng nhau. Bởi vì Python sử dụng mã thông báo bằng nhau [
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]99] để gán, nên việc diễn giải một câu lệnh như
if True: # This is always true pass # so this is always executed, but it does nothing else: pass80 là một phép thử boolean rất hấp dẫn. Không giống như toán học, nó không phải là. Hãy nhớ rằng mã thông báo Python cho toán tử đẳng thức là
if True: # This is always true pass # so this is always executed, but it does nothing else: pass81
Cũng lưu ý rằng phép thử đẳng thức là đối xứng, nhưng phép gán thì không. Ví dụ: nếu
if True: # This is always true pass # so this is always executed, but it does nothing else: pass82 thì
if True: # This is always true pass # so this is always executed, but it does nothing else: pass83. Nhưng trong Python, câu lệnh
if True: # This is always true pass # so this is always executed, but it does nothing else: pass84 là hợp lệ và
if True: # This is always true pass # so this is always executed, but it does nothing else: pass85 thì không
Hơn nữa, trong toán học, mệnh đề đẳng thức luôn đúng. Nếu bây giờ ________ 486, thì ________ 487 sẽ luôn bằng _______ 488. Trong Python, một câu lệnh gán có thể làm cho hai biến bằng nhau, nhưng do khả năng gán lại, chúng không cần phải giữ nguyên như vậy
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]3
Dòng thứ ba thay đổi giá trị của
if True: # This is always true pass # so this is always executed, but it does nothing else: pass87 nhưng không thay đổi giá trị của
if True: # This is always true pass # so this is always executed, but it does nothing else: pass88 nên chúng không còn bằng nhau
Ghi chú
Trong một số ngôn ngữ lập trình, một ký hiệu khác được sử dụng để gán, chẳng hạn như
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]01 hoặc
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]02, để tránh nhầm lẫn. Python đã chọn sử dụng mã thông báo
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]99 để gán và
if True: # This is always true pass # so this is always executed, but it does nothing else: pass81 cho đẳng thức. Đây là một lựa chọn phổ biến, cũng được tìm thấy trong các ngôn ngữ như C, C++, Java, JavaScript và PHP, mặc dù nó khiến mọi thứ hơi khó hiểu đối với các lập trình viên mới
4. 4. 2. Cập nhật biến¶
Khi một câu lệnh gán được thực thi, biểu thức bên phải [i. e. biểu thức xuất hiện sau mã thông báo gán] được đánh giá trước. Sau đó, kết quả của đánh giá đó được ghi vào biến ở phía bên trái, do đó thay đổi nó
Một trong những hình thức gán lại phổ biến nhất là cập nhật, trong đó giá trị mới của biến phụ thuộc vào giá trị cũ của nó
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]4
Dòng thứ hai có nghĩa là “lấy giá trị hiện tại của n, nhân nó với ba và thêm một, rồi đặt câu trả lời trở lại n làm giá trị mới của nó”. Như vậy sau khi thực hiện 2 dòng trên thì
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]05 sẽ có giá trị là 16
Nếu bạn cố lấy giá trị của một biến chưa tồn tại, bạn sẽ gặp lỗi
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]5
Trước khi bạn có thể cập nhật một biến, bạn phải khởi tạo nó, thường bằng một phép gán đơn giản
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]6
Câu lệnh thứ hai này — cập nhật một biến bằng cách thêm 1 vào nó — rất phổ biến. Nó được gọi là số gia của biến;
4. 5. Vòng lặp if x y:
STATEMENTS_B
else:
STATEMENTS_C
5¶
Vòng lặp
if x y: STATEMENTS_B else: STATEMENTS_C5 xử lý từng mục theo trình tự, do đó, nó được sử dụng với các kiểu dữ liệu trình tự của Python - chuỗi, danh sách và bộ dữ liệu
Mỗi mục lần lượt được [tái] gán cho biến vòng lặp và phần thân của vòng lặp được thực thi
Hình thức chung của một vòng lặp
if x y: STATEMENTS_B else: STATEMENTS_C5 là
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]7
Đây là một ví dụ khác về câu lệnh ghép trong Python và giống như các câu lệnh rẽ nhánh, nó có phần đầu được kết thúc bằng dấu hai chấm [
if True: # This is always true pass # so this is always executed, but it does nothing else: pass8] và phần thân bao gồm một chuỗi gồm một hoặc nhiều câu lệnh được thụt vào cùng một lượng từ phần đầu
Biến vòng lặp được tạo khi câu lệnh
if x y: STATEMENTS_B else: STATEMENTS_C5 chạy nên bạn không cần tạo biến trước rồi. Mỗi lần lặp gán biến vòng lặp cho phần tử tiếp theo trong chuỗi, sau đó thực hiện các câu lệnh trong phần thân. Câu lệnh kết thúc khi đến phần tử cuối cùng trong dãy
Loại luồng này được gọi là vòng lặp vì nó vòng ngược trở lại đỉnh sau mỗi lần lặp
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]8
Chạy qua tất cả các mục trong một chuỗi được gọi là duyệt qua chuỗi hoặc duyệt qua
Bạn nên chạy ví dụ này để xem những gì nó làm
Mẹo
Như với tất cả các ví dụ bạn thấy trong cuốn sách này, bạn nên tự mình thử đoạn mã này và xem nó làm được gì. Bạn cũng nên cố gắng dự đoán kết quả trước khi thực hiện và tạo các ví dụ liên quan của riêng bạn và thử chúng.
Nếu bạn nhận được kết quả như mong đợi, hãy vỗ nhẹ vào lưng và tiếp tục. Nếu bạn không, hãy cố gắng tìm hiểu tại sao. Đây là bản chất của phương pháp khoa học và rất cần thiết nếu bạn muốn suy nghĩ như một lập trình viên máy tính
Thông thường, bạn sẽ muốn một vòng lặp lặp lại một số lần nhất định hoặc lặp lại trên một dãy số nhất định. Hàm
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]11 có ích cho việc đó
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]9
4. 6. Bảng¶
Một trong những điều tốt cho các vòng lặp là tạo bảng. Trước khi có máy tính, mọi người phải tính logarit, sin và cosin và các hàm toán học khác bằng tay. Để làm điều đó dễ dàng hơn, sách toán học chứa các bảng dài liệt kê các giá trị của các hàm này. Tạo các bảng chậm và nhàm chán, và chúng có xu hướng đầy lỗi
Khi máy tính xuất hiện, một trong những phản ứng ban đầu là, “Điều này thật tuyệt. Chúng ta có thể sử dụng máy tính để tạo bảng nên sẽ không có sai sót. ” Điều đó hóa ra đúng [hầu hết] nhưng thiển cận. Ngay sau đó, máy tính và máy tính phổ biến đến mức các bảng đã trở nên lỗi thời
Vâng, gần như. Đối với một số hoạt động, máy tính sử dụng bảng giá trị để nhận được câu trả lời gần đúng và sau đó thực hiện tính toán để cải thiện kết quả gần đúng. Trong một số trường hợp, đã xảy ra lỗi trong các bảng bên dưới, nổi tiếng nhất là trong bảng mà chip xử lý Intel Pentium được sử dụng để thực hiện phép chia dấu phẩy động
Mặc dù bảng nhật ký không còn hữu ích như trước đây, nhưng nó vẫn là một ví dụ điển hình. Chương trình sau đây xuất ra một chuỗi các giá trị ở cột bên trái và 2 được nâng lên lũy thừa của giá trị đó ở cột bên phải
if True: # This is always true pass # so this is always executed, but it does nothing else: pass90
Sử dụng ký tự tab [
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]12] làm cho đầu ra được căn chỉnh độc đáo
if True: # This is always true pass # so this is always executed, but it does nothing else: pass91
4. 7. Câu lệnh food = 'spam'
if food == 'spam':
print['Ummmm, my favorite!']
print['I feel like saying it 100 times...']
print[100 * [food + '! ']]
97¶
Cú pháp chung cho câu lệnh while trông như thế này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass92
Giống như các câu lệnh rẽ nhánh và vòng lặp
if x y: STATEMENTS_B else: STATEMENTS_C5, câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97 là một câu lệnh ghép bao gồm phần đầu và phần thân. Vòng lặp
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97 thực thi với số lần không xác định, miễn là BOOLEAN EXPRESSION là đúng
Đây là một ví dụ đơn giản
if True: # This is always true pass # so this is always executed, but it does nothing else: pass93
Lưu ý rằng nếu
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]17 được đặt thành
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]18 trên dòng đầu tiên, phần thân của câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97 sẽ không được thực thi
Đây là một chương trình ví dụ phức tạp hơn thể hiện việc sử dụng câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97
if True: # This is always true pass # so this is always executed, but it does nothing else: pass94
Luồng thực thi cho một câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97 hoạt động như thế này
Đánh giá điều kiện [
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]
22], mang lạiif True: # This is always true pass # so this is always executed, but it does nothing else: pass
71 hoặcif True: # This is always true pass # so this is always executed, but it does nothing else: pass
70Nếu điều kiện sai, thoát khỏi câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]
97 và tiếp tục thực hiện ở câu lệnh tiếp theoNếu điều kiện là đúng, hãy thực hiện từng
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]
26 trong phần thân rồi quay lại bước 1
Phần nội dung bao gồm tất cả các câu lệnh bên dưới tiêu đề có cùng độ thụt đầu dòng
Phần thân của vòng lặp sẽ thay đổi giá trị của một hoặc nhiều biến để cuối cùng điều kiện trở thành sai và vòng lặp kết thúc. Nếu không, vòng lặp sẽ lặp lại mãi mãi, được gọi là vòng lặp vô hạn
Một nguồn giải trí bất tận cho các lập trình viên máy tính là quan sát thấy rằng các hướng dẫn về dầu gội, tạo bọt, xả, lặp lại, là một vòng lặp vô tận.
Trong trường hợp ở đây, chúng ta có thể chứng minh rằng vòng lặp kết thúc vì chúng ta biết rằng giá trị của
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]27 là hữu hạn và chúng ta có thể thấy rằng giá trị của
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]28 tăng lên mỗi lần qua vòng lặp, vì vậy cuối cùng nó sẽ phải bằng
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]27. Trong các trường hợp khác, không dễ để nói
Điều bạn sẽ nhận thấy ở đây là vòng lặp
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97 phù hợp với bạn — lập trình viên — hơn vòng lặp
if x y: STATEMENTS_B else: STATEMENTS_C5 tương đương. Khi sử dụng vòng lặp
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97, người ta phải tự điều khiển biến vòng lặp. cung cấp cho nó một giá trị ban đầu, kiểm tra để hoàn thành và sau đó đảm bảo rằng bạn thay đổi thứ gì đó trong phần thân để vòng lặp kết thúc
4. 8. Lựa chọn giữa if x y:
STATEMENTS_B
else:
STATEMENTS_C
5 và food = 'spam'
if food == 'spam':
print['Ummmm, my favorite!']
print['I feel like saying it 100 times...']
print[100 * [food + '! ']]
97¶
Vậy tại sao lại có hai loại vòng lặp nếu
if x y: STATEMENTS_B else: STATEMENTS_C5 trông dễ dàng hơn?
Sử dụng vòng lặp
if x y: STATEMENTS_B else: STATEMENTS_C5 nếu bạn biết, trước khi bắt đầu lặp, số lần tối đa bạn cần để thực hiện phần thân. Ví dụ: nếu bạn đang duyệt qua một danh sách các phần tử, bạn biết rằng số lần lặp tối đa mà bạn có thể cần là “tất cả các phần tử trong danh sách”. Hoặc nếu cần in bảng 12 lần ta biết ngay vòng lặp cần chạy bao nhiêu lần
Vì vậy, bất kỳ vấn đề nào như “lặp lại mô hình thời tiết này trong 1000 chu kỳ” hoặc “tìm kiếm danh sách các từ này”, “tìm tất cả các số nguyên tố lên đến 10000” đều gợi ý rằng vòng lặp
if x y: STATEMENTS_B else: STATEMENTS_C5 là tốt nhất
Ngược lại, nếu bạn được yêu cầu lặp lại một số tính toán cho đến khi một số điều kiện được đáp ứng và bạn không thể tính toán trước khi điều này xảy ra, như chúng ta đã làm trong chương trình “tên lớn nhất”, thì bạn sẽ cần một vòng lặp
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97
Chúng tôi gọi trường hợp đầu tiên là lặp lại xác định - chúng tôi có một số giới hạn nhất định cho những gì cần thiết. Trường hợp thứ hai được gọi là phép lặp không xác định — chúng ta không chắc mình sẽ cần bao nhiêu phép lặp — chúng ta thậm chí không thể thiết lập giới hạn trên
4. 9. Dò tìm chương trình¶
Để viết các chương trình máy tính hiệu quả, một lập trình viên cần phát triển khả năng theo dõi quá trình thực hiện chương trình máy tính. Theo dõi liên quan đến việc “trở thành máy tính” và theo dõi luồng thực thi thông qua một chương trình mẫu chạy, ghi lại trạng thái của tất cả các biến và bất kỳ đầu ra nào mà chương trình tạo ra sau mỗi lệnh được thực thi
Để hiểu quy trình này, hãy theo dõi quá trình thực thi chương trình từ phần Câu lệnh while .
Khi bắt đầu theo dõi, chúng tôi có một biến cục bộ,
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]40 với giá trị ban đầu là
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]41. Người dùng sẽ nhập một chuỗi được lưu trữ trong biến,
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]42. Giả sử họ nhập
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]43. Dòng tiếp theo tạo một biến có tên là
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]28 và đặt cho nó giá trị ban đầu là ________ 345
Để theo dõi tất cả những điều này khi bạn theo dõi bằng tay một chương trình, hãy tạo một tiêu đề cột trên một tờ giấy cho mỗi biến được tạo khi chương trình chạy và một cột khác cho đầu ra. Dấu vết của chúng tôi cho đến nay sẽ trông giống như thế này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass95
Vì
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]46 đánh giá bằng
if True: # This is always true pass # so this is always executed, but it does nothing else: pass70 [hãy dành một phút để thuyết phục bản thân về điều này], thân vòng lặp được thực thi
Bây giờ người dùng sẽ thấy
if True: # This is always true pass # so this is always executed, but it does nothing else: pass96
Giả sử người dùng nhập vào
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]48 lần này,
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]28 sẽ được tăng lên,
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]46 lại đánh giá thành
if True: # This is always true pass # so this is always executed, but it does nothing else: pass70 và dấu vết của chúng ta bây giờ sẽ như thế này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass97
Một dấu vết đầy đủ của chương trình có thể tạo ra một cái gì đó như thế này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass98
Việc theo dõi có thể hơi tẻ nhạt và dễ xảy ra lỗi [đó là lý do tại sao chúng tôi yêu cầu máy tính thực hiện công việc này ngay từ đầu. ], nhưng nó là một kỹ năng cần thiết cho một lập trình viên. Từ một dấu vết, chúng ta có thể học được nhiều điều về cách mã của chúng ta hoạt động
4. 10. Bài tập viết tắt¶
Tăng một biến phổ biến đến mức Python cung cấp một cú pháp viết tắt cho nó
if True: # This is always true pass # so this is always executed, but it does nothing else: pass99
________ 352 là viết tắt của ________ 353. Chúng tôi phát âm toán tử là “cộng-bằng”. Giá trị gia tăng không nhất thiết phải là 1
if True: # This is always true pass # so this is always executed, but it does nothing else: pass40
Có các chữ viết tắt tương tự cho
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]54,
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]55,
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]56,
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]57 và
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]58
if True: # This is always true pass # so this is always executed, but it does nothing else: pass41
4. 11. Ví dụ khác về food = 'spam'
if food == 'spam':
print['Ummmm, my favorite!']
print['I feel like saying it 100 times...']
print[100 * [food + '! ']]
97. Trò chơi đoán¶
Chương trình sau thực hiện một trò chơi đoán đơn giản
if True: # This is always true pass # so this is always executed, but it does nothing else: pass42
Chương trình này sử dụng định luật toán học tam phân [cho các số thực a và b, chính xác một trong ba số này phải đúng. a > b, a < b hoặc a == b]
4. 12. Câu lệnh food = 'spam'
if food == 'spam':
print['Ummmm, my favorite!']
print['I feel like saying it 100 times...']
print[100 * [food + '! ']]
60¶
Câu lệnh break được sử dụng để rời khỏi phần thân của vòng lặp ngay lập tức. Câu lệnh tiếp theo được thực thi là câu lệnh đầu tiên sau phần thân
if True: # This is always true pass # so this is always executed, but it does nothing else: pass43
bản in này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass44
4. 13. Câu lệnh food = 'spam'
if food == 'spam':
print['Ummmm, my favorite!']
print['I feel like saying it 100 times...']
print[100 * [food + '! ']]
61¶
Đây là một câu lệnh luồng điều khiển khiến chương trình ngay lập tức bỏ qua việc xử lý phần còn lại của phần thân vòng lặp, cho lần lặp hiện tại. Nhưng vòng lặp vẫn tiếp tục chạy cho các lần lặp lại còn lại của nó
if True: # This is always true pass # so this is always executed, but it does nothing else: pass45
bản in này
if True: # This is always true pass # so this is always executed, but it does nothing else: pass46
4. 14. Ví dụ if x y:
STATEMENTS_B
else:
STATEMENTS_C
5 khác¶
Đây là một ví dụ kết hợp một số điều chúng ta đã học được
if True: # This is always true pass # so this is always executed, but it does nothing else: pass47
Theo dõi chương trình này và đảm bảo rằng bạn cảm thấy tự tin rằng bạn hiểu cách thức hoạt động của nó
4. 15. Vòng lặp lồng nhau dành cho dữ liệu lồng nhau¶
Bây giờ chúng ta sẽ đưa ra một danh sách dữ liệu có cấu trúc thậm chí còn mạo hiểm hơn. Trong trường hợp này, chúng tôi có một danh sách các sinh viên. Mỗi sinh viên có một tên được ghép nối với một danh sách các môn học khác mà họ đăng ký
if True: # This is always true pass # so this is always executed, but it does nothing else: pass48
Ở đây chúng tôi đã gán một danh sách năm phần tử cho biến
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]63. Hãy in ra tên từng sinh viên và số môn học họ đăng ký
if True: # This is always true pass # so this is always executed, but it does nothing else: pass49
Python đáp ứng một cách dễ chịu với đầu ra sau
if True: # This is always true pass # so this is always executed, but it does nothing else: pass0
Bây giờ chúng tôi muốn hỏi có bao nhiêu sinh viên đang học CompSci. Điều này cần một bộ đếm và đối với mỗi học sinh, chúng tôi cần một vòng lặp thứ hai để kiểm tra lần lượt từng môn học
if True: # This is always true pass # so this is always executed, but it does nothing else: pass1
if True: # This is always true pass # so this is always executed, but it does nothing else: pass2
Bạn nên thiết lập một danh sách dữ liệu của riêng mình mà bạn quan tâm — có thể là danh sách các đĩa CD của bạn, mỗi đĩa chứa danh sách tên bài hát trên đĩa CD hoặc danh sách tên phim, mỗi đĩa có danh sách các ngôi sao điện ảnh đã đóng trong phim. . Sau đó, bạn có thể đặt những câu hỏi như "Những bộ phim nào có sự tham gia của Angelina Jolie?"
4. 16. Danh sách hiểu¶
Khả năng hiểu danh sách là một cấu trúc cú pháp cho phép tạo danh sách từ các danh sách khác bằng cách sử dụng cú pháp toán học nhỏ gọn
if True: # This is always true pass # so this is always executed, but it does nothing else: pass3
Cú pháp chung cho một biểu thức hiểu danh sách là
if True: # This is always true pass # so this is always executed, but it does nothing else: pass4
Biểu thức danh sách này có tác dụng tương tự như
if True: # This is always true pass # so this is always executed, but it does nothing else: pass5
Như bạn có thể thấy, việc hiểu danh sách nhỏ gọn hơn nhiều
4. 17. Bảng thuật ngữ¶
nối thêmĐể thêm dữ liệu mới vào cuối tệp hoặc đối tượng dữ liệu khác
khốiMột nhóm các câu lệnh liên tiếp có cùng dấu đầu dòng
thân hìnhKhối câu lệnh trong câu lệnh ghép theo sau tiêu đề
chi nhánhMột trong những đường dẫn có thể có của luồng thực thi được xác định bởi thực thi có điều kiện
xiềng xích có điều kiệnMột nhánh có điều kiện với nhiều hơn hai luồng thực thi có thể. Trong chuỗi điều kiện Python được viết bằng câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]64Tuyên bố phức hợp
Một câu lệnh Python có hai phần. một tiêu đề và một cơ thể. Tiêu đề bắt đầu bằng từ khóa và kết thúc bằng dấu hai chấm [
if True: # This is always true pass # so this is always executed, but it does nothing else: pass8]. Phần thân chứa một loạt các câu lệnh Python khác, tất cả đều được thụt vào cùng một lượng
Ghi chú
Chúng tôi sẽ sử dụng tiêu chuẩn Python gồm 4 khoảng trắng cho mỗi cấp độ thụt đầu dòng
tình trạngBiểu thức boolean trong câu lệnh điều kiện xác định nhánh nào được thực thi
câu lệnh điều kiệnMột câu lệnh điều khiển luồng thực thi tùy thuộc vào một số điều kiện. Trong Python, các từ khóa
if True: # This is always true pass # so this is always executed, but it does nothing else: pass6,
if True: # This is always true pass # so this is always executed, but it does nothing else: pass79 và
if True: # This is always true pass # so this is always executed, but it does nothing else: pass56 được sử dụng cho các câu điều kiệnphản đối
Một biến dùng để đếm thứ gì đó, thường được khởi tạo bằng 0 và tăng dần trong phần thân của vòng lặp
con trỏMột điểm đánh dấu vô hình theo dõi nơi ký tự tiếp theo sẽ được in
giảm bớtGiảm 1
lặp xác địnhMột vòng lặp trong đó chúng ta có giới hạn trên về số lần phần thân sẽ được thực thi. Vòng lặp xác định thường được mã hóa tốt nhất dưới dạng vòng lặp
if x y: STATEMENTS_B else: STATEMENTS_C5dấu phân cách
Một chuỗi gồm một hoặc nhiều ký tự được sử dụng để xác định ranh giới giữa các phần riêng biệt của văn bản
tăngVừa là danh từ vừa là động từ, increment có nghĩa là tăng thêm 1
vòng lặp vô hạnMột vòng lặp trong đó điều kiện kết thúc không bao giờ được thỏa mãn
lặp lại vô thời hạnMột vòng lặp mà chúng ta chỉ cần tiếp tục cho đến khi một số điều kiện được đáp ứng. Một câu lệnh
food = 'spam' if food == 'spam': print['Ummmm, my favorite!'] print['I feel like saying it 100 times...'] print[100 * [food + '! ']]97 được sử dụng cho trường hợp nàykhởi tạo [của một biến]
Để khởi tạo một biến là đặt cho nó một giá trị ban đầu. Vì trong Python các biến không tồn tại cho đến khi chúng được gán giá trị, nên chúng được khởi tạo khi chúng được tạo. Trong các ngôn ngữ lập trình khác, đây không phải là trường hợp và các biến có thể được tạo mà không cần khởi tạo, trong trường hợp đó, chúng có giá trị mặc định hoặc giá trị rác
sự lặp đi lặp lạiThực hiện lặp đi lặp lại một tập hợp các câu lệnh lập trình
vòngMột câu lệnh hoặc nhóm các câu lệnh thực hiện lặp đi lặp lại cho đến khi một điều kiện kết thúc được thỏa mãn
biến vòng lặpMột biến được sử dụng như một phần của điều kiện kết thúc vòng lặp
vòng lặp lồng nhauMột vòng lặp bên trong phần thân của một vòng lặp khác
làm tổMột cấu trúc chương trình bên trong một cấu trúc chương trình khác, chẳng hạn như một câu lệnh điều kiện bên trong một nhánh của một câu lệnh điều kiện khác
dòng mớiMột ký tự đặc biệt khiến con trỏ di chuyển đến đầu dòng tiếp theo
lời nhắcMột gợi ý trực quan yêu cầu người dùng nhập dữ liệu
phân công lạiThực hiện nhiều phép gán cho cùng một biến trong quá trình thực thi chương trình
chuyển hướngMột ký tự đặc biệt khiến con trỏ di chuyển đến điểm dừng tab tiếp theo trên dòng hiện tại
sự chọc ghẹoVới mọi số thực a và b, đúng một trong các hệ thức sau thỏa mãn. a < b, a > b hoặc a == b. Vì vậy, khi bạn có thể thiết lập rằng hai trong số các quan hệ là sai, bạn có thể cho rằng quan hệ còn lại là đúng
dấu vếtĐể theo dõi luồng thực hiện chương trình bằng tay, ghi lại sự thay đổi trạng thái của các biến và bất kỳ đầu ra nào được tạo ra