In các số lên đến n không chia hết cho 3 6 9, ví dụ 1 2 4 5 7 trong Python

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. Bởi vì phép lặp rất phổ biến, Python cung cấp một số tính năng ngôn ngữ để làm cho nó dễ dàng hơn. Chúng ta đã thấy câu lệnh for trong chương 3. Đây là hình thức lặp mà bạn có thể sẽ sử dụng thường xuyên nhất. Nhưng trong chương này, chúng ta sẽ xem xét câu lệnh while — một cách khác để chương trình của bạn thực hiện phép lặp, hữu ích trong các trường hợp hơi khác.

Trước khi chúng tôi làm điều đó, chúng ta hãy xem lại một vài ý tưởng

7. 1. Phân công¶

Như chúng tôi đã đề cập trước đây, việc thực hiện nhiều phép gá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ũ]

1
2
3
4

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]

Đầu ra của chương trình này là

15
7

vì lần đầu tiên airtime_remaining được in nên giá trị của nó là 15 và lần thứ hai, giá trị của nó là 7.

Đ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. Vì Python sử dụng mã thông báo bằng [ = ] để gán nên việc diễn giải một câu lệnh như aaaaa = b as a Boolean test. Unlike mathematics, it is not! Remember that the Python token for the equality operator is == .

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 a == 7 thì 7 == a. But in Python, the statement a = 7 là hợp pháp và 7 = a is not.

Trong Python, một câu lệnh gán có thể làm cho hai biến bằng nhau, nhưng vì các phép gán tiếp theo có thể thay đổi một trong hai biến nên chúng không cần phải giữ nguyên như vậy

1
2
3

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal

Dòng thứ ba thay đổi giá trị của a nhưng không thay đổi giá trị của b, so they are no longer equal. [In some programming languages, a different symbol is used for assignment, such as >> w = x + 1 Traceback [most recent call last]: File "", line 1, in NameError: name 'x' is not defined

Trước khi bạn có thể cập nhật một biến, bạn phải khởi tạo biến đó thành một giá trị bắt đầu nào đó, thường là với một phép gán đơn giản

1
2
3

runs_scored = 0
...
runs_scored = runs_scored + 1

Dòng 3 — cập nhật biến bằng cách thêm 1 vào biến — rất phổ biến. Nó được gọi là số gia của biến; . Đôi khi các lập trình viên cũng nói về việc tăng một biến, điều đó có nghĩa giống như việc tăng nó lên 1

7. 3. Đã xem lại vòng lặp for

Hãy nhớ rằng vòng lặp for xử lý từng mục trong danh sách. 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. Chúng ta đã thấy ví dụ này trong chương trước.

1
2
3

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
1

Chạy qua tất cả các mục trong danh sách được gọi là duyệt qua danh sách hoặc duyệt qua

Bây giờ chúng ta hãy viết một hàm để tính tổng tất cả các phần tử trong một danh sách các số. Làm điều này bằng tay trước và cố gắng cô lập chính xác những bước bạn thực hiện. Bạn sẽ thấy rằng mình cần phải ghi lại một số "tổng đang chạy" của số tiền cho đến nay, trên một tờ giấy, trong đầu hoặc trong máy tính của bạn. Ghi nhớ mọi thứ từ bước này sang bước tiếp theo chính là lý do tại sao chúng ta có các biến trong chương trình. vì vậy chúng tôi sẽ cần một số biến để ghi nhớ "tổng số đang chạy". Nó phải được khởi tạo với giá trị bằng 0, sau đó chúng ta cần duyệt qua các mục trong danh sách. Đối với mỗi mục, chúng tôi sẽ muốn cập nhật tổng số đang chạy bằng cách thêm số tiếp theo vào mục đó

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
2

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
3

7. 4. Câu lệnh while

Đây là một đoạn mã minh họa việc sử dụng câu lệnh while .

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
4

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
5

Bạn gần như có thể đọc câu lệnh while như thể đó là tiếng Anh. Có nghĩa là, trong khi v nhỏ hơn hoặc bằng n , hãy tiếp tục . Trong cơ thể, mỗi lần, tăng v . Khi v vượt qua n , hãy trả lại số tiền tích lũy của bạn.

Chính thức hơn, đây là luồng thực thi chính xác cho câu lệnh while .

  • Đánh giá điều kiện ở dòng 5, cho ra giá trị Sai hoặc Đúng.
  • Nếu giá trị là Sai , hãy thoát khỏi trong khi .
  • Nếu giá trị là True , hãy thực hiện từng câu lệnh trong phần nội dung [dòng 6 và 7] rồi quay lại . . . . . . . while statement at line 5.

Phần thân bao gồm tất cả các câu được thụt vào bên dưới từ khóa while .

Lưu ý rằng nếu điều kiện vòng lặp là Sai trong lần đầu tiên chúng ta thực hiện vòng lặp, thì các câu lệnh trong phần thân của vòng lặp sẽ không bao giờ được thực thi.

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 thú vị bất tận cho các nhà khoa học máy tính là quan sát thấy rằng các hướng dẫn trên dầu gội đầu, "xả, 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 n là hữu hạn và chúng ta có thể thấy . Trong các trường hợp khác, không dễ dàng như vậy, thậm chí là không thể trong một số trường hợp, để biết liệu vòng lặp có bao giờ kết thúc hay không. v increments each time through the loop, so eventually it will have to exceed n. In other cases, it is not so easy, even impossible in some cases, to tell if the loop will ever terminate.

Điều bạn sẽ nhận thấy ở đây là vòng lặp while phù hợp với bạn — lập trình viên — hơn so với vòng lặp tương đương for loop. When using a while người ta phải tự quản lý 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. Để so sánh, đây là một hàm tương đương sử dụng for thay thế.

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
6

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
7

Lưu ý lệnh gọi hàm phạm vi hơi phức tạp — chúng tôi phải thêm một hàm vào n< . Sẽ rất dễ mắc lỗi lập trình và bỏ qua điều này, nhưng vì chúng tôi đã đầu tư viết một số bài kiểm tra đơn vị nên bộ kiểm tra của chúng tôi sẽ phát hiện ra lỗi của chúng tôi. , because range generates its list up to but excluding the value you give it. It would be easy to make a programming mistake and overlook this, but because we’ve made the investment of writing some unit tests, our test suite would have caught our error.

Vậy tại sao có hai loại vòng lặp if for trông dễ dàng hơn? . while loop.

7. 5. Trình tự Collatz 3n + 1¶

Hãy xem xét một dãy số đơn giản đã mê hoặc các nhà toán học trong nhiều năm. Họ vẫn không thể trả lời những câu hỏi khá đơn giản về điều này

“Quy tắc tính toán” để tạo dãy là bắt đầu từ một số n đã cho và tạo số hạng tiếp theo của dãy từ . Chuỗi kết thúc khi n, either by halving n, [whenever n is even], or else by multiplying it by three and adding 1. The sequence terminates when n đạt 1.

Hàm Python này nắm bắt thuật toán đó

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
8

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
9

Đầu tiên, hãy lưu ý rằng hàm in ở dòng 6 có thêm một đối số end=", " . Điều này báo cho hàm print đi theo chuỗi đã in với bất kỳ thứ gì người lập trình chọn [trong trường hợp này, dấu phẩy theo sau bởi khoảng trắng], thay vì kết thúc chuỗi . Vì vậy, mỗi khi nội dung nào đó được in trong vòng lặp, nội dung đó sẽ được in trên cùng một dòng đầu ra, với các số được phân tách bằng dấu phẩy. Cuộc gọi đến print[n, end=". \n"] ở dòng 11 sau khi vòng lặp kết thúc sẽ in giá trị cuối cùng của n theo sau là dấu chấm . [Bạn sẽ đề cập đến \n [ký tự xuống dòng] trong chương tiếp theo].

Điều kiện để tiếp tục với vòng lặp này là n . = 1 , do đó vòng lặp sẽ tiếp tục chạy cho đến khi đạt đến điều kiện kết thúc, [i. e. n == 1 ].

Mỗi lần lặp lại, chương trình sẽ xuất ra giá trị của n rồi kiểm tra xem giá trị đó là chẵn hay lẻ. Nếu là số chẵn, giá trị của n được chia cho 2 bằng phép chia số nguyên. Nếu là số lẻ, giá trị được thay thế bằng n * 3 + . Dưới đây là một số ví dụ. 1. Here are some examples:

15
7
0

n đôi khi tăng và đôi khi giảm nên không có bằng chứng rõ ràng rằng n will ever reach 1, or that the program terminates. For some particular values of n , chúng ta có thể chứng minh sự chấm dứt. Ví dụ: nếu giá trị ban đầu là lũy thừa của 2, thì giá trị của n sẽ là số chẵn mỗi lần qua vòng lặp cho đến khi đạt 1. Ví dụ trước kết thúc với một chuỗi như vậy, bắt đầu với 16.

Xem liệu bạn có thể tìm thấy một số bắt đầu nhỏ cần hơn một trăm bước trước khi nó kết thúc không

Bỏ qua các giá trị cụ thể, câu hỏi thú vị lần đầu tiên được đặt ra bởi một nhà toán học người Đức tên là Lothar Collatz. phỏng đoán Collatz [còn được gọi là phỏng đoán 3n + 1], là dãy này kết thúc đối với tất cả các giá trị dương của n . Cho đến nay, không ai có thể chứng minh hoặc bác bỏ nó. [Một phỏng đoán là một tuyên bố có thể đúng, nhưng không ai biết chắc. ]

Hãy suy nghĩ cẩn thận về những gì cần thiết để chứng minh hoặc bác bỏ phỏng đoán “Tất cả các số nguyên dương cuối cùng sẽ hội tụ về 1 bằng cách sử dụng quy tắc Collatz”. Với các máy tính nhanh, chúng tôi đã có thể kiểm tra mọi số nguyên có giá trị rất lớn và cho đến nay, tất cả chúng đều kết thúc ở 1. Nhưng ai biết được?

Bạn sẽ nhận thấy rằng nếu bạn không dừng lại khi đạt đến 1, chuỗi sẽ đi vào vòng tuần hoàn của chính nó. 1, 4, 2, 1, 4, 2, 1, 4. Vì vậy, một khả năng là có thể có những chu kỳ khác mà chúng ta chưa tìm thấy

Wikipedia có một bài viết thông tin về phỏng đoán Collatz. Dãy số này còn có các tên gọi khác [Dãy núi đá, Những con số kỳ diệu, v.v. ], và bạn sẽ biết có bao nhiêu số nguyên đã được máy tính kiểm tra và hội tụ

Chọn giữa forwhile

Sử dụng vòng lặp for 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 thi 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 đề xuất rằng cho . loop is best.

Ngược lại, nếu bạn được yêu cầu lặp lại một số phép tính cho đến khi đáp ứng một số điều kiện và bạn không thể tính trước khi nào [nếu] điều này xảy ra, như chúng ta đã làm trong bài toán 3n + 1 này, thì bạn sẽ . while loop.

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 biết trướ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

7. 6. Theo dõi một chương trình¶

Để viết các chương trình máy tính hiệu quả và để xây dựng một mô hình khái niệm tốt về việc thực hiện chương trình, 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 một 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 lệnh gọi tới seq3np1[3] từ phần trước. Khi bắt đầu theo dõi, chúng tôi có một biến, n [tham số], với giá trị ban đầu là 3. Vì 3 không bằng 1 nên thân vòng lặp while được thực thi. 3 được in và 3 % 2 == 0 is evaluated. Since it evaluates to Sai nên nhánh else được thực thi và 3 * 3 + 1 is evaluated and assigned to n.

Để 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

15
7
1

Kể từ 10 . = 1 đánh giá là True , thân vòng lặp được thực thi lại và . 10 % 2 == . Đến cuối dấu vết chúng ta có. is true, so the if branch is executed and n becomes 5. By the end of the trace we have:

15
7
2

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ừ dấu vết này, chúng ta có thể học được rất nhiều điều về cách mã của chúng ta hoạt động. Chúng ta có thể quan sát thấy rằng ngay khi n trở thành lũy thừa của 2, chẳng hạn, chương trình sẽ yêu cầu thực thi log2[n] của thân vòng lặp để hoàn thành. Chúng ta cũng có thể thấy rằng 1 cuối cùng sẽ không được in dưới dạng đầu ra trong phần thân của vòng lặp, đó là lý do tại sao chúng ta đặt hàm print đặc biệt tại .

Tất nhiên, theo dõi một chương trình liên quan đến việc thực hiện một bước thông qua mã của bạn và có thể kiểm tra các biến. Sử dụng máy tính để thực hiện từng bước cho bạn ít lỗi hơn và thuận tiện hơn. Ngoài ra, khi các chương trình của bạn trở nên phức tạp hơn, chúng có thể thực hiện hàng triệu bước trước khi có được mã mà bạn thực sự quan tâm, vì vậy việc theo dõi thủ công trở nên bất khả thi. Có thể thiết lập một điểm dừng nơi bạn cần sẽ mạnh mẽ hơn nhiều. Vì vậy, chúng tôi thực sự khuyến khích bạn đầu tư thời gian vào việc học bằng cách sử dụng môi trường lập trình của bạn [PyScripter, trong các ghi chú này] để phát huy hết tác dụng

Ngoài ra còn có một số công cụ trực quan tuyệt vời có sẵn để giúp bạn theo dõi và hiểu các đoạn mã Python nhỏ. Cái chúng tôi khuyên dùng là tại http. //netserv. ict. ru. AC. za/python3_viz

Chúng tôi đã cảnh báo về các chức năng hộp trò chuyện, nhưng đã sử dụng chúng ở đây. Khi tìm hiểu thêm một chút về Python, chúng tôi sẽ có thể chỉ cho bạn cách tạo danh sách các giá trị để giữ chuỗi, thay vì yêu cầu hàm in chúng. Làm điều này sẽ loại bỏ nhu cầu phải có tất cả các hàm in phiền phức này ở giữa logic của chúng ta và sẽ làm cho hàm này hữu ích hơn.

7. 7. Đếm chữ số¶

Hàm sau đếm số chữ số thập phân trong một số nguyên dương

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
6

15
7
4

Một cuộc gọi đến print[num_digits[710]] sẽ in 3. Trace the execution of this function call [perhaps using the single step function in PyScripter, or the Python visualizer, or on some paper] to convince yourself that it works.

Hàm này thể hiện một mẫu tính toán quan trọng được gọi là bộ đếm. Biến count được khởi tạo bằng 0 và sau đó tăng lên mỗi khi thân vòng lặp được thực thi. Khi vòng lặp kết thúc, count chứa kết quả — tổng số lần phần thân vòng lặp được thực thi, bằng với số chữ số.

Nếu chúng tôi chỉ muốn đếm các chữ số là 0 hoặc 5, thì việc thêm một điều kiện trước khi tăng bộ đếm sẽ thực hiện thủ thuật

15
7
5

15
7
6

Xác nhận rằng test[num_zero_and_ five_digits[1055030250] == 7] passes.

Tuy nhiên, lưu ý rằng test[num_digits[0] == 1] fails. Explain why. Do you think this is a bug in the code, or a bug in the specifications, or our expectations, or the tests?

7. 8. 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ó

15
7
7

count += 1 là viết tắt của count . 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. = count + 1 . We pronounce the operator as “plus-equals”. The increment value does not have to be 1:

15
7
8

Có các từ viết tắt tương tự cho -= , *=, /=, //= and %=:

15
7
9

7. 9. Trợ giúp và ký hiệu meta¶

Python đi kèm với tài liệu mở rộng cho tất cả các chức năng tích hợp sẵn và các thư viện của nó. Các hệ thống khác nhau có những cách khác nhau để truy cập trợ giúp này. Trong PyScripter, nhấp vào mục menu Trợ giúp và chọn Hướng dẫn sử dụng Python. Sau đó, tìm kiếm trợ giúp về phạm vi chức năng tích hợp. Bạn sẽ nhận được một cái gì đó như thế này

Chú ý dấu ngoặc vuông trong phần mô tả đối số. Đây là những ví dụ về ký hiệu meta — ký hiệu mô tả cú pháp Python, nhưng không phải là một phần của nó. Dấu ngoặc vuông trong tài liệu này có nghĩa là đối số là tùy chọn — lập trình viên có thể bỏ qua nó. Vì vậy, dòng trợ giúp đầu tiên này cho chúng ta biết rằng phạm vi phải luôn có điểm dừng argument, but it may have an optional start argument [which must be followed by a comma if it is present], and it can also have an optional step argument, preceded by a comma if it is present.

Các ví dụ từ trợ giúp cho thấy rằng phạm vi có thể có 1, 2 hoặc 3 đối số. Danh sách có thể bắt đầu ở bất kỳ giá trị bắt đầu nào và tăng hoặc giảm theo gia số khác 1. Tài liệu ở đây cũng nói rằng các đối số phải là số nguyên.

Một ký hiệu meta khác mà bạn thường gặp là việc sử dụng chữ in đậm và in nghiêng. Chữ in đậm có nghĩa là đây là các mã thông báo — từ khóa hoặc ký hiệu — được nhập vào mã Python của bạn chính xác như chúng vốn có, trong khi các thuật ngữ in nghiêng là viết tắt của “thứ gì đó thuộc loại này”. Vì vậy cú pháp mô tả

cho biến trong danh sách

có nghĩa là bạn có thể thay thế bất kỳ biến hợp pháp nào và bất kỳ danh sách hợp pháp nào khi bạn viết mã Python của mình

Mô tả [đơn giản hóa] này của hàm in , hiển thị một ví dụ khác về ký hiệu meta trong đó dấu chấm lửng [ ... ] có nghĩa là bạn có thể có bao nhiêu đối tượng tùy thích [thậm chí là 0], được phân tách bằng dấu phẩy.

in [ [đối tượng,. ] ]

Ký hiệu meta cung cấp cho chúng tôi một cách ngắn gọn và mạnh mẽ để mô tả mẫu của một số cú pháp hoặc tính năng

7. 10. Những cái bàn¶

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 dụng như trước, nhưng nó vẫn là một ví dụ điển hình về phép lặp. 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

1
2

1
2
3
1

Chuỗi "\t" đại diện cho một ký tự tab. Ký tự gạch chéo ngược trong "\t" cho biết phần đầu của chuỗi thoát. Trình tự thoát được sử dụng để đại diện cho các ký tự vô hình như tab và dòng mới. Trình tự \n đại diện cho một dòng mới.

Chuỗi thoát có thể xuất hiện ở bất kỳ đâu trong chuỗi; . Làm thế nào để bạn nghĩ rằng bạn đại diện cho một dấu gạch chéo ngược trong một chuỗi?

Khi các ký tự và chuỗi được hiển thị trên màn hình, một điểm đánh dấu vô hình được gọi là con trỏ sẽ theo dõi vị trí của ký tự tiếp theo. Sau chức năng in , con trỏ thường di chuyển đến đầu dòng tiếp theo.

Ký tự tab dịch chuyển con trỏ sang phải cho đến khi nó đến một trong các điểm dừng tab. Các tab rất hữu ích để tạo các cột văn bản thẳng hàng, như trong đầu ra của chương trình trước

1
2
3
2

Do giữa các cột có các ký tự tab nên vị trí của cột thứ hai không phụ thuộc vào số chữ số trong cột thứ nhất

7. 11. Bảng hai chiều¶

Bảng hai chiều là bảng mà bạn đọc giá trị tại giao điểm của một hàng và một cột. Bảng cửu chương là một ví dụ điển hình. Giả sử bạn muốn in bảng cửu chương cho các giá trị từ 1 đến 6

Một cách hay để bắt đầu là viết một vòng lặp in bội số của 2, tất cả trên một dòng

1
2
3

1
2
3
4

Ở đây chúng ta đã sử dụng hàm phạm vi , nhưng đặt nó bắt đầu chuỗi từ 1. Khi vòng lặp thực thi, giá trị của i thay đổi từ 1 thành 6. Khi tất cả các phần tử của dãy đã được gán cho i , vòng lặp kết thúc. Mỗi lần qua vòng lặp, nó sẽ hiển thị giá trị của 2 * i .

Một lần nữa, đối số bổ sung end="    " . Sau khi vòng lặp kết thúc, lệnh gọi print function suppresses the newline, and uses three spaces instead. After the loop completes, the call to print ở dòng 3 kết thúc dòng hiện tại và bắt đầu một dòng mới.

Đầu ra của chương trình là

1
2
3
5

Càng xa càng tốt. Bước tiếp theo là gói gọn và khái quát hóa

7. 12. Đóng gói và khái quát hóa¶

Đóng gói là quá trình gói một đoạn mã trong một hàm, cho phép bạn tận dụng tất cả những thứ mà hàm tốt cho. Bạn đã thấy một số ví dụ về đóng gói, bao gồm is_divisiable trong chương trước.

Khái quát hóa có nghĩa là lấy một cái gì đó cụ thể, chẳng hạn như in bội số của 2 và làm cho nó trở nên tổng quát hơn, chẳng hạn như in bội số của bất kỳ số nguyên nào

Hàm này đóng gói vòng lặp trước đó và tổng quát hóa nó để in bội số của n .

1
2
3
4

1
2
3
7

Để đóng gói, tất cả những gì chúng ta phải làm là thêm dòng đầu tiên khai báo tên của hàm và danh sách tham số. Để khái quát hóa, tất cả những gì chúng ta phải làm là thay thế giá trị 2 bằng tham số n .

Nếu chúng ta gọi hàm này với đối số 2, chúng ta sẽ nhận được kết quả giống như trước đây. Với đối số 3, đầu ra là

1
2
3
8

Với đối số 4, đầu ra là

1
2
3
9

Bây giờ, bạn có thể đoán được cách in bảng cửu chương — bằng cách gọi print_multiples nhiều lần với các đối số khác nhau. Trong thực tế, chúng ta có thể sử dụng một vòng lặp khác.

1
2

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
1

Lưu ý mức độ tương tự của vòng lặp này với vòng lặp bên trong print_multiples . Tất cả những gì chúng ta làm là thay thế hàm print bằng một lệnh gọi hàm.

Đầu ra của chương trình này là một bảng cửu chương

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
2

7. 13. Đóng gói nhiều hơn¶

Để chứng minh tính đóng gói một lần nữa, hãy lấy mã từ phần trước và gói nó trong một hàm

1
2
3

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
4

Quá trình này là một kế hoạch phát triển chung. Chúng tôi phát triển mã bằng cách viết các dòng mã bên ngoài bất kỳ chức năng nào hoặc nhập chúng vào trình thông dịch. Khi chúng tôi làm cho mã hoạt động, chúng tôi giải nén nó và gói nó trong một hàm

Kế hoạch phát triển này đặc biệt hữu ích nếu bạn không biết cách chia chương trình thành các chức năng khi bắt đầu viết. Cách tiếp cận này cho phép bạn thiết kế khi bạn thực hiện

7. 14. Biến cục bộ¶

Bạn có thể thắc mắc làm thế nào chúng ta có thể sử dụng cùng một biến, i , trong cả hai print_multiples< . Nó có gây ra vấn đề khi một trong các hàm thay đổi giá trị của biến không? and print_mult_table. Doesn’t it cause problems when one of the functions changes the value of the variable?

Câu trả lời là không, bởi vì i trong print_multiples and the i in print_mult_table are not the same variable.

Các biến được tạo bên trong một định nghĩa hàm là cục bộ; . Điều đó có nghĩa là bạn có thể tự do đặt nhiều biến có cùng tên miễn là chúng không cùng chức năng

Python kiểm tra tất cả các câu lệnh trong một hàm — nếu bất kỳ câu lệnh nào trong số chúng gán giá trị cho một biến, thì đó là manh mối mà Python sử dụng để biến biến đó thành biến cục bộ

Sơ đồ ngăn xếp của chương trình này cho thấy hai biến có tên i không phải là cùng một biến. Chúng có thể đề cập đến các giá trị khác nhau và việc thay đổi giá trị này không ảnh hưởng đến giá trị kia.

Giá trị của i trong print_mult_table đi từ 1 . Trong sơ đồ, nó xảy ra là 3. Lần tiếp theo qua vòng lặp, nó sẽ là 4. Mỗi lần trong vòng lặp, print_mult_table gọi print_multiples với giá trị hiện tại là . Giá trị đó được gán cho tham số i as an argument. That value gets assigned to the parameter n .

Bên trong print_multiples , giá trị của i bắt nguồn từ . Trong sơ đồ, nó xảy ra là 2. Việc thay đổi biến này không ảnh hưởng đến giá trị của i trong print_mult_table .

Việc có các biến cục bộ khác nhau có cùng tên là điều phổ biến và hoàn toàn hợp pháp. Đặc biệt, những cái tên như ij thường được sử dụng làm biến vòng lặp. Nếu bạn tránh sử dụng chúng trong một chức năng chỉ vì bạn đã sử dụng chúng ở một chức năng khác, bạn có thể sẽ khiến chương trình khó đọc hơn.

Trình hiển thị tại http. //netserv. ict. ru. AC. za/python3_viz/ chỉ ra rất rõ ràng cách hai biến i là các biến riêng biệt và cách chúng có các giá trị độc lập.

7. 15. Câu lệnh break

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

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
5

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
6

bản in này

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
7

Vòng lặp kiểm tra trước - hành vi vòng lặp tiêu chuẩn

forwhile thực hiện kiểm tra của chúng ngay từ đầu, trước khi thực hiện bất kỳ phần nào của cơ thể. Chúng được gọi là các vòng kiểm tra trước, bởi vì quá trình kiểm tra diễn ra trước [trước] cơ thể. breakreturn là những công cụ của chúng tôi để điều chỉnh hành vi tiêu chuẩn này.

7. 16. Các hương vị khác của vòng lặp¶

Đôi khi, chúng tôi muốn có vòng lặp kiểm tra giữa với kiểm tra thoát ở giữa nội dung, thay vì ở đầu hoặc ở cuối. Hoặc một vòng lặp hậu kiểm tra đặt bài kiểm tra thoát của nó là điều cuối cùng trong phần thân. Các ngôn ngữ khác có cú pháp và từ khóa khác nhau cho những hương vị khác nhau này, nhưng Python chỉ sử dụng kết hợp whileif< . condition: nghỉ để hoàn thành công việc.

Ví dụ điển hình là bài toán người dùng phải nhập số để tính tổng. Để chỉ ra rằng không còn đầu vào nào nữa, người dùng nhập một giá trị đặc biệt, thường là giá trị -1 hoặc chuỗi rỗng. Điều này cần một mô hình vòng lặp thoát giữa. nhập số tiếp theo, sau đó kiểm tra xem có thoát hay không hoặc xử lý số khác

Sơ đồ vòng lặp kiểm tra giữa

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
8

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
9

Thuyết phục bản thân rằng điều này phù hợp với sơ đồ vòng lặp giữa thoát. dòng 3 thực hiện một số công việc hữu ích, dòng 4 và 5 có thể thoát khỏi vòng lặp và nếu không, dòng 6 sẽ thực hiện công việc hữu ích hơn trước khi lần lặp tiếp theo bắt đầu

The while bool-expr. sử dụng biểu thức Boolean để xác định xem có lặp lại lần nữa hay không. True là một biểu thức Boolean tầm thường, vì vậy while True. có nghĩa là luôn thực hiện lại thân vòng lặp. Đây là một thành ngữ ngôn ngữ — một quy ước mà hầu hết các lập trình viên sẽ nhận ra ngay lập tức. Vì biểu thức ở dòng 2 sẽ không bao giờ kết thúc vòng lặp, [đây là phép thử giả] người lập trình phải sắp xếp để ngắt [hoặc quay lại] ra khỏi thân vòng lặp ở nơi khác, theo một cách nào đó [i. e. ở dòng 4 và 5 trong ví dụ này]. Một trình biên dịch hoặc thông dịch viên thông minh sẽ hiểu rằng dòng 2 là một bài kiểm tra giả luôn phải thành công, vì vậy nó thậm chí sẽ không tạo ra một bài kiểm tra nào và lưu đồ của chúng tôi thậm chí không bao giờ đặt hộp kiểm tra giả hình kim cương ở đầu vòng lặp.

Tương tự, chỉ cần di chuyển điều kiện if . ngắt đến cuối thân vòng lặp, chúng ta tạo một mẫu cho vòng lặp kiểm tra sau. Các vòng lặp kiểm tra sau được sử dụng khi bạn muốn chắc chắn rằng thân vòng lặp luôn thực thi ít nhất một lần [vì lần kiểm tra đầu tiên chỉ xảy ra khi kết thúc quá trình thực thi thân vòng lặp đầu tiên]. Điều này hữu ích, ví dụ: nếu chúng tôi muốn chơi một trò chơi tương tác với người dùng — chúng tôi luôn muốn chơi ít nhất một trò chơi.

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
6

1
2
1

Gợi ý. Hãy suy nghĩ về nơi bạn muốn bài kiểm tra xuất cảnh diễn ra

Khi bạn đã nhận ra rằng bạn cần một vòng lặp để lặp lại điều gì đó, hãy nghĩ về điều kiện kết thúc của nó — khi nào thì tôi muốn dừng việc lặp lại? . Các chương trình tương tác yêu cầu đầu vào từ người dùng hoặc đọc từ tệp thường cần thoát khỏi các vòng lặp của chúng ở giữa hoặc ở cuối quá trình lặp, khi rõ ràng là không còn dữ liệu để xử lý hoặc người dùng không muốn

7. 17. Một ví dụ¶

Chương trình sau thực hiện một trò chơi đoán đơn giản

1
2
2

1
2
3

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]

Tại dòng 18 có gọi hàm nhập nhưng ta không làm gì với kết quả, thậm chí không gán cho biến. Điều này là hợp pháp trong Python. Ở đây nó có tác dụng làm xuất hiện cửa sổ hộp thoại nhập liệu chờ người dùng trả lời trước khi kết thúc chương trình. Các lập trình viên thường sử dụng thủ thuật thực hiện một số đầu vào bổ sung ở cuối tập lệnh, chỉ để giữ cho cửa sổ mở

Cũng lưu ý việc sử dụng biến msg , ban đầu là một chuỗi rỗng, trên các dòng 6, 12 và 14. Mỗi lần qua vòng lặp, chúng tôi mở rộng thông báo được hiển thị. điều này cho phép chúng tôi hiển thị phản hồi của chương trình ngay tại cùng một nơi khi chúng tôi yêu cầu dự đoán tiếp theo.

7. 18. Câu lệnh tiếp tục

Đâ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ó

a = 5
b = a    # After executing this line, a and b are now equal
a = 3    # After executing this line, a and b are no longer equal
5

1
2
5

bản in này

1
2
6

7. 19. Khái quát hơn¶

Một ví dụ khác về khái quát hóa, hãy tưởng tượng bạn muốn một chương trình có thể in ra một bảng cửu chương với kích thước bất kỳ, không chỉ bảng sáu nhân sáu. Bạn có thể thêm một tham số vào print_mult_table .

1
2
3

1
2
8

Chúng tôi đã thay thế giá trị 7 bằng biểu thức high+1 . Nếu chúng ta gọi print_mult_table với đối số 7, nó sẽ hiển thị.

1
2
9

Điều này không sao, ngoại trừ việc chúng ta có thể muốn bảng là hình vuông — với cùng số lượng hàng và cột. Để làm điều đó, chúng tôi thêm một tham số khác vào print_multiples để chỉ định số lượng cột mà bảng nên có.

Để gây phiền nhiễu, chúng tôi gọi tham số này là cao , chứng minh rằng các hàm khác nhau có thể có các tham số có cùng tên [giống như các biến cục bộ . Đây là toàn bộ chương trình.

15
7
5

n = 5
n = 3 * n + 1
1

Lưu ý rằng khi chúng ta thêm một tham số mới, chúng ta phải thay đổi dòng đầu tiên của hàm [tiêu đề hàm] và chúng ta cũng phải thay đổi nơi gọi hàm trong print_mult_table.

Bây giờ, khi chúng ta gọi print_mult_table[7] .

n = 5
n = 3 * n + 1
2

Khi bạn khái quát hóa một chức năng một cách thích hợp, bạn thường nhận được một chương trình với các khả năng mà bạn không có trong kế hoạch. Ví dụ, bạn có thể nhận thấy rằng, bởi vì ab = ba, tất cả các mục trong bảng xuất hiện hai lần. Bạn có thể tiết kiệm mực bằng cách chỉ in một nửa bảng. Để làm điều đó, bạn chỉ phải thay đổi một dòng print_mult_table . Thay đổi

n = 5
n = 3 * n + 1
3

n = 5
n = 3 * n + 1
4

đến

n = 5
n = 3 * n + 1
3

n = 5
n = 3 * n + 1
6

và bạn nhận được

n = 5
n = 3 * n + 1
7

7. 20. Chức năng¶

Một vài lần, chúng tôi đã đề cập đến tất cả những chức năng tốt cho. Bây giờ, bạn có thể tự hỏi chính xác những thứ đó là gì. Dưới đây là một số trong số họ

  1. Nắm bắt khối tinh thần của bạn. Chia các nhiệm vụ phức tạp của bạn thành các nhiệm vụ phụ và đặt cho các nhiệm vụ phụ một cái tên có ý nghĩa là một kỹ thuật tinh thần mạnh mẽ. Nhìn lại ví dụ minh họa vòng lặp hậu kiểm tra. chúng tôi giả sử rằng chúng tôi có một chức năng gọi là play_the_game_once . Việc phân đoạn này cho phép chúng tôi bỏ qua các chi tiết của trò chơi cụ thể — đó là một trò chơi bài, hay trò chơi nought and cross, hay một trò chơi nhập vai — và chỉ cần tập trung vào một phần biệt lập trong logic chương trình của chúng tôi — cho phép người chơi chọn xem họ có muốn hay không .
  2. Việc chia một chương trình dài thành các chức năng cho phép bạn tách các phần của chương trình, gỡ lỗi chúng một cách riêng biệt và sau đó kết hợp chúng thành một tổng thể
  3. Các chức năng tạo điều kiện thuận lợi cho việc sử dụng phép lặp
  4. Các chức năng được thiết kế tốt thường hữu ích cho nhiều chương trình. Khi bạn viết và gỡ lỗi, bạn có thể sử dụng lại nó

7. 21. Dữ liệu được ghép nối¶

Chúng ta đã thấy danh sách tên và danh sách số trong Python. Chúng tôi sẽ xem qua sách giáo khoa một chút và hiển thị một cách nâng cao hơn để biểu diễn dữ liệu của chúng tôi. Tạo một cặp đối tượng trong Python cũng đơn giản như đặt chúng vào dấu ngoặc đơn, như thế này

n = 5
n = 3 * n + 1
3

n = 5
n = 3 * n + 1
9

Chúng ta có thể đặt nhiều cặp vào một danh sách các cặp

1
2

>>> w = x + 1
Traceback [most recent call last]:
  File "", line 1, in
NameError: name 'x' is not defined
1

Đây là một ví dụ nhanh về những điều chúng ta có thể làm với dữ liệu có cấu trúc như thế này. Đầu tiên, in tất cả những người nổi tiếng

1
2

>>> w = x + 1
Traceback [most recent call last]:
  File "", line 1, in
NameError: name 'x' is not defined
3

>>> w = x + 1
Traceback [most recent call last]:
  File "", line 1, in
NameError: name 'x' is not defined
4

Lưu ý rằng danh sách người nổi tiếng chỉ có 3 phần tử, mỗi phần tử là một cặp.

Bây giờ chúng tôi in tên của những người nổi tiếng sinh trước năm 1980

1
2
3

>>> w = x + 1
Traceback [most recent call last]:
  File "", line 1, in
NameError: name 'x' is not defined
6

>>> w = x + 1
Traceback [most recent call last]:
  File "", line 1, in
NameError: name 'x' is not defined
7

Điều này chứng tỏ điều gì đó mà chúng ta chưa thấy trong vòng lặp for . thay vì sử dụng một biến điều khiển vòng lặp duy nhất, chúng tôi đã sử dụng một cặp tên biến, [nm, yr], instead. The loop is executed three times — once for each pair in the list, and on each iteration both the variables are assigned values from the pair of data that is being handled.

7. 22. Vòng lặp lồng nhau 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ý

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
6

>>> w = x + 1
Traceback [most recent call last]:
  File "", line 1, in
NameError: name 'x' is not defined
9

Ở đây, chúng ta đã gán một danh sách gồm năm phần tử cho biến sinh viên . Hãy in ra tên từng sinh viên và số môn học họ đăng ký.

1
2
3

1
2
3
1

Python đáp ứng một cách dễ chịu với đầu ra sau

1
2
3
2

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

15
7
5

1
2
3
4

1
2
3
5

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?"

7. 23. Phương pháp tìm căn bậc hai của Newton¶

Các vòng lặp thường được sử dụng trong các chương trình tính toán kết quả số bằng cách bắt đầu với một câu trả lời gần đúng và lặp đi lặp lại việc cải thiện nó

Ví dụ: trước khi chúng ta có máy tính hoặc máy tính, mọi người cần tính căn bậc hai theo cách thủ công. Newton đã sử dụng một phương pháp đặc biệt tốt [có một số bằng chứng cho thấy phương pháp này đã được biết đến từ nhiều năm trước]. Giả sử bạn muốn biết căn bậc hai của n . Nếu bạn bắt đầu với hầu hết mọi phép tính gần đúng, bạn có thể tính một phép tính gần đúng tốt hơn [gần với đáp số thực tế hơn] bằng công thức sau.

n = 5
n = 3 * n + 1
3

1
2
3
7

Lặp lại phép tính này một vài lần bằng máy tính của bạn. Bạn có thể thấy lý do tại sao mỗi lần lặp lại đưa ước tính của bạn đến gần hơn một chút không?

Bằng cách sử dụng một vòng lặp và lặp lại công thức này cho đến khi giá trị gần đúng tốt hơn đủ gần với giá trị trước đó, chúng ta có thể viết một hàm để tính căn bậc hai. [Trên thực tế, đây là cách máy tính của bạn tìm căn bậc hai — nó có thể có công thức và phương pháp hơi khác một chút, nhưng nó cũng dựa trên việc liên tục cải thiện các dự đoán của mình. ]

Đây là một ví dụ về một vấn đề lặp đi lặp lại vô thời hạn. chúng tôi không thể dự đoán trước bao nhiêu lần chúng tôi muốn cải thiện dự đoán của mình - chúng tôi chỉ muốn tiếp tục tiến gần hơn. Điều kiện dừng của vòng lặp sẽ là khi dự đoán cũ và dự đoán đã cải thiện của chúng ta “đủ gần” với nhau

Lý tưởng nhất là chúng tôi muốn dự đoán cũ và mới hoàn toàn bằng nhau khi chúng tôi dừng lại. Nhưng đẳng thức chính xác là một khái niệm phức tạp trong số học máy tính khi có liên quan đến số thực. Bởi vì các số thực không được biểu diễn chính xác tuyệt đối [xét cho cùng, một số như số pi hoặc căn bậc hai của hai số có vô số chữ số thập phân vì nó là số vô tỉ], chúng ta cần lập công thức kiểm tra dừng cho vòng lặp bằng cách hỏi “là a

1
2

1
2
3
9

Lưu ý rằng chúng tôi lấy giá trị tuyệt đối của chênh lệch giữa ab!

Vấn đề này cũng là một ví dụ điển hình về thời điểm thích hợp để thoát khỏi vòng lặp giữa chừng

airtime_remaining = 15
print[airtime_remaining]
airtime_remaining = 7
print[airtime_remaining]
4

runs_scored = 0
...
runs_scored = runs_scored + 1
1

đầu ra là

runs_scored = 0
...
runs_scored = runs_scored + 1
2

Xem liệu bạn có thể cải thiện các giá trị gần đúng bằng cách thay đổi điều kiện dừng hay không. Ngoài ra, hãy xem qua thuật toán [có thể bằng tay, sử dụng máy tính của bạn] để xem cần bao nhiêu lần lặp lại trước khi đạt được mức độ chính xác này cho sqrt[25].

7. 24. thuật toán¶

Phương pháp của Newton là một ví dụ về thuật toán. đó là một quy trình máy móc để giải một loại bài toán [trong trường hợp này là tính căn bậc hai]

Một số loại tri thức không phải là thuật toán. Ví dụ: học ngày từ lịch sử hoặc bảng cửu chương của bạn liên quan đến việc ghi nhớ các giải pháp cụ thể

Nhưng các kỹ thuật bạn đã học để cộng có mang, trừ có mượn và chia dài đều là thuật toán. Hoặc nếu bạn là người đam mê giải câu đố Sudoku, bạn có thể có một số bước cụ thể mà bạn luôn tuân theo

Một trong những đặc điểm của thuật toán là chúng không yêu cầu bất kỳ trí thông minh nào để thực hiện. Chúng là các quy trình cơ học, trong đó mỗi bước nối tiếp bước trước theo một bộ quy tắc đơn giản. Và chúng được thiết kế để giải quyết một lớp hoặc loại vấn đề chung, không chỉ một vấn đề đơn lẻ

Hiểu rằng các vấn đề khó khăn có thể được giải quyết bằng các quy trình thuật toán từng bước [và có công nghệ để thực hiện các thuật toán này cho chúng tôi] là một trong những bước đột phá lớn mang lại lợi ích to lớn. Vì vậy, trong khi việc thực hiện thuật toán có thể nhàm chán và có thể không đòi hỏi trí thông minh, thuật toán hoặc tư duy tính toán — tôi. e. sử dụng các thuật toán và tự động hóa làm cơ sở để tiếp cận các vấn đề — đang thay đổi nhanh chóng xã hội của chúng ta. Một số người cho rằng sự thay đổi này đối với tư duy và quy trình thuật toán sẽ có tác động thậm chí còn nhiều hơn đến xã hội của chúng ta so với việc phát minh ra máy in. Và quá trình thiết kế các thuật toán rất thú vị, thách thức trí tuệ và là phần trung tâm của cái mà chúng ta gọi là lập trình

Một số điều mà mọi người làm một cách tự nhiên, không gặp khó khăn hoặc suy nghĩ có ý thức, lại là điều khó diễn đạt nhất bằng thuật toán. Hiểu ngôn ngữ tự nhiên là một ví dụ điển hình. Tất cả chúng ta đều làm điều đó, nhưng cho đến nay không ai có thể giải thích cách chúng ta làm điều đó, ít nhất là không phải dưới dạng thuật toán cơ học từng bước

7. 25. Bảng chú giải¶

quy trình từng bước của thuật toán để giải quyết một loại vấn đề. bodyCác câu lệnh bên trong một vòng lặp. điểm dừngMột vị trí trong mã chương trình của bạn, nơi việc thực thi chương trình sẽ tạm dừng [hoặc ngắt], cho phép bạn kiểm tra trạng thái của các biến của chương trình hoặc thực hiện từng bước thông qua các câu lệnh riêng lẻ, thực hiện từng bước một. tiếng lóng của lập trình viên. Từ đồng nghĩa với gia tăng. câu lệnh continue Một câu lệnh làm cho phần còn lại của vòng lặp hiện tại bị bỏ qua. Luồng thực thi quay trở lại đầu vòng lặp, đánh giá điều kiện và nếu điều này đúng thì lần lặp tiếp theo của vòng lặp sẽ bắt đầu. counterMộ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ảmGiảmgiảm 1. vòng lặp xác định 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 for . kế hoạch phát triển Một quá trình để phát triển một chương trình. Trong chương này, chúng tôi đã trình bày một phong cách phát triển dựa trên việc phát triển mã để làm những việc đơn giản, cụ thể, sau đó đóng gói và khái quát hóa. đóng gói Để chia một chương trình phức tạp lớn thành các thành phần [như hàm] và cách ly các thành phần với nhau [ví dụ bằng cách sử dụng các biến cục bộ]. chuỗi thoát Một ký tự thoát, \, theo sau là một hoặc nhiều ký tự in được dùng để chỉ định một ký tự không in được. tổng quát hóaĐể thay thế một cái gì đó cụ thể không cần thiết [như một giá trị không đổi] bằng một cái gì đó chung chung một cách thích hợp [như một biến hoặc tham số]. Tổng quát hóa làm cho mã linh hoạt hơn, có nhiều khả năng được sử dụng lại và đôi khi còn dễ viết hơn. gia tăng Vừa là danh từ vừa là động từ, gia tăng có nghĩa là tăng thêm 1. vòng lặp vô hạn Một vòng lặp trong đó điều kiện kết thúc không bao giờ được thỏa mãn. vòng lặp lặp vô hạn trong đó chúng ta chỉ cần tiếp tục cho đến khi một số điều kiện được đáp ứng. Câu lệnh while được sử dụng cho trường hợp này. khở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. lặp Thực hiện lặp lại một tập hợp các câu lệnh lập trình. loopCấu trúc cho phép chúng ta thực hiện lặp đi lặp lại một câu lệnh hoặc một nhóm câu lệnh cho đến khi thỏa mãn điều kiện kết thúc. biến vòng lặp Mộ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. ký hiệu meta Các ký hiệu hoặc ký hiệu bổ sung giúp mô tả các ký hiệu khác. Ở đây chúng tôi đã giới thiệu dấu ngoặc vuông, dấu chấm lửng, chữ nghiêng và chữ đậm dưới dạng ký hiệu meta để giúp mô tả các phần tùy chọn, có thể lặp lại, có thể thay thế và cố định của cú pháp Python. vòng lặp kiểm tra giữaMột vòng lặp thực thi một số nội dung, sau đó kiểm tra điều kiện thoát và sau đó có thể thực thi thêm một số nội dung. Chúng tôi không có cấu trúc Python đặc biệt cho trường hợp này, nhưng có thể sử dụng whilebreak together.nested loopA loop inside the body of another loop.newlineA special character that causes the cursor to move to the beginning of the next line.post-test loopA loop that executes the body, then tests for the exit condition. We don’t have a special Python construct for this, but can use whilebreak together.pre-test loopA loop that tests before deciding whether the execute its body. forwhile đều là các vòng thử nghiệm trước. một bước Một chế độ thực thi trình thông dịch trong đó bạn có thể thực hiện chương trình của mình từng bước một và kiểm tra kết quả của bước đó. Hữu ích để gỡ lỗi và xây dựng mô hình tinh thần bên trong của bạn về những gì đang diễn ra. tabMộ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. trichotomyCho bất kỳ số thực a và b nào, đúng một trong các quan hệ 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 mối quan hệ là sai, bạn có thể cho rằng mối quan hệ còn lại là đúng. theo dõi 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.

7. 26. Bài tập¶

Chương này chỉ cho chúng ta cách tổng hợp một danh sách các mục và cách đếm các mục. Ví dụ đếm cũng có câu lệnh if cho phép chúng tôi chỉ đếm một số mục đã chọn. Trong chương trước, chúng ta cũng đã trình bày một hàm find_first_2_letter_word cho phép chúng ta “thoát sớm” khỏi vòng lặp bằng cách sử dụng < . when some condition occurred. We now also have break để thoát khỏi một vòng lặp [nhưng không phải chức năng kèm theo và tiếp tục to abandon the current iteration of the loop without ending the loop.

Thành phần duyệt danh sách, tính tổng, đếm, kiểm tra điều kiện và thoát sớm là một bộ sưu tập phong phú các khối xây dựng có thể được kết hợp theo những cách mạnh mẽ để tạo ra nhiều chức năng hơi khác nhau

Sáu câu hỏi đầu tiên là các chức năng điển hình mà bạn có thể viết chỉ bằng các khối xây dựng này

  1. Viết hàm đếm xem có bao nhiêu số lẻ trong một danh sách

  2. Tính tổng tất cả các số chẵn trong một danh sách

  3. Tính tổng tất cả các số âm trong một danh sách

  4. Đếm xem có bao nhiêu từ trong danh sách có độ dài 5

  5. Tính tổng tất cả các phần tử trong một danh sách nhưng không bao gồm số chẵn đầu tiên. [Viết bài kiểm tra đơn vị của bạn. Nếu không có số chẵn thì sao?]

  6. Đếm xem có bao nhiêu từ xuất hiện trong một danh sách lên đến và bao gồm cả lần xuất hiện đầu tiên của từ “sam”. [Viết bài kiểm tra đơn vị của bạn cho trường hợp này. Nếu “sam” không xảy ra thì sao?]

  7. Thêm hàm in vào hàm sqrt của Newton để in ra tốt hơn each time it is calculated. Call your modified function with 25 as an argument and record the results.

  8. Theo dõi quá trình thực thi phiên bản mới nhất của print_mult_table và tìm hiểu cách thức hoạt động của phiên bản đó.

  9. Viết hàm print_triangular_numbers[n] in ra n số tam giác đầu tiên. Một cuộc gọi đến print_triangular_numbers[5] sẽ tạo ra kết quả sau.

    runs_scored = 0
    ...
    runs_scored = runs_scored + 1
    
    3

    [gợi ý. sử dụng tìm kiếm trên web để tìm ra số tam giác là gì. ]

  10. Viết hàm is_prime , nhận vào một đối số số nguyên duy nhất và trả về True when the argument is a prime number and False otherwise. Add tests for cases like this:

    runs_scored = 0
    ...
    runs_scored = runs_scored + 1
    
    4

    Trường hợp cuối cùng có thể đại diện cho ngày sinh của bạn. Bạn có được sinh ra vào một ngày tốt đẹp?

  11. Xem lại vấn đề tên cướp biển say rượu từ các bài tập trong chương 3. Lần này, tên cướp biển say rượu rẽ, sau đó tiến lên một số bước và lặp lại điều này. Sinh viên khoa học xã hội của chúng tôi hiện ghi lại các cặp dữ liệu. góc của mỗi lượt và số bước thực hiện sau lượt. Dữ liệu thử nghiệm của cô ấy là [[160, 20], [-43, 10], [270, 8], [-43, 12]]. Sử dụng một con rùa để vẽ con đường mà người bạn say rượu của chúng ta đã đi

  12. Rùa có thể vẽ nhiều hình dạng thú vị bằng cách đưa ra một danh sách các cặp như chúng ta đã làm ở trên, trong đó mục đầu tiên của cặp là góc quay và mục thứ hai là khoảng cách để di chuyển về phía trước. Thiết lập một danh sách các cặp sao cho con rùa vẽ một ngôi nhà có chữ thập ở giữa, như minh họa ở đây. Điều này nên được thực hiện mà không cần lướt qua bất kỳ dòng / cạnh nào nhiều lần và không cần nhấc bút lên

  13. Không phải tất cả các hình như hình trên đều có thể được vẽ mà không cần nhấc bút lên hoặc đi qua một cạnh nhiều lần. Cái nào trong số này có thể được rút ra?

    Bây giờ hãy đọc bài viết của Wikipedia[http. // vi. wikipedia. org/wiki/Eulerian_path] về đường đi Euler. Học cách nhận biết ngay lập tức bằng cách kiểm tra liệu có thể tìm ra giải pháp hay không. Nếu con đường khả thi, bạn cũng sẽ biết nơi đặt bút để bắt đầu vẽ và nơi bạn nên kết thúc

  14. Cái gì num_digits[0] sẽ trả về? . Tại sao lệnh gọi 1 for this case. Why does a call to num_digits[-24] dẫn đến một vòng lặp vô hạn? . -1//10 ước tính thành -1] Sửa đổi num_digits để nó hoạt động chính xác với bất kỳ giá trị số nguyên nào. Thêm các bài kiểm tra này.

    runs_scored = 0
    ...
    runs_scored = runs_scored + 1
    
    5

  15. Viết hàm num_even_digits[n] đếm số chữ số chẵn trong nnnnnnnnnnnnnnnnnnnnnnnnnnnnnn. These tests should pass:

    runs_scored = 0
    ...
    runs_scored = runs_scored + 1
    
    6

  16. Viết hàm sum_of_squares[xs] tính tổng bình phương của các số trong danh sách xs. For example, sum_of_squares[[2, 3, 4]] nên .

    runs_scored = 0
    ...
    runs_scored = runs_scored + 1
    
    7

  17. Bạn và bạn của bạn đang trong một nhóm viết một trò chơi hai người chơi, con người đấu với máy tính, chẳng hạn như Tic-Tac-Toe / Noughts and Crosses. Bạn của bạn sẽ viết logic để chơi một vòng của trò chơi, trong khi bạn sẽ viết logic để cho phép chơi nhiều vòng, ghi điểm, quyết định ai chơi, trước, v.v. Hai bạn thương lượng về cách hai phần của chương trình sẽ ăn khớp với nhau và bạn nghĩ ra giàn giáo đơn giản này [mà bạn của bạn sẽ cải thiện sau]

    Điều kiện để tìm một số chia hết cho 3 và 5 là gì?

    Phương thức. Điều này cũng có thể được thực hiện bằng cách kiểm tra xem số đó có chia hết cho 15 hay không , vì BCNN của 3 và 5 là 15 và bất kỳ số nào chia hết cho 15 đều chia hết .

    Số nào không chia hết cho 3?

    Ở đây, 11 không chia hết cho 3.

    không chia hết cho 6?

    70 không chia hết cho 3. Vì tổng các chữ số của 70 = 7 + 0 = 7 không chia hết cho 3. Vậy 70 chia hết cho 2 nhưng không chia hết cho 3. Vậy 70 không chia hết cho 6. . chia hết cho 6

    Có chia hết cho 3 và 5 không?

Chủ Đề