Hướng dẫn python iteration example - ví dụ về lặp lại python

Hướng dẫn python iteration example - ví dụ về lặp lại python

Nội dung chính ShowShow

  • Các câu lệnh lặp Python
  • Phá vỡ các tuyên bố
  • Tiếp tục tuyên bố:
  • Tiếp tục tuyên bố:
  • 7.1. Phân công¶
  • 7.2. Cập nhật các biến
  • 7.3. Các vòng lặp lại được xem xét lạifor loop revisited¶
  • 7.4. Câu nói trong khiwhile statement¶
  • 7.5. Trình tự Collatz 3N + 1
  • 7.6. Truy tìm một chương trình
  • 7.7. Đếm chữ số
  • 7.8. Bài tập viết tắt
  • 7.10. Những cái bàn¶
  • 7.11. Bảng hai chiều
  • 7.12. Đóng gói và tổng quát
  • 7.13. Đóng gói nhiều hơn
  • 7.14. Các biến cục bộ
  • 7.15. Tuyên bố phá vỡbreak statement¶
  • 7.16. Các hương vị khác của Loops¶
  • 7.17. Một ví dụ¶
  • 7.18. Tuyên bố tiếp tụccontinue statement¶
  • 7.19. Tổng quát hơn
  • 7.20. Chức năng¶
  • 7.21. Dữ liệu được ghép nối
  • 7.22. Các vòng lặp lồng cho dữ liệu lồng nhau
  • 7.23. Phương pháp Newton để tìm rễ vuông
  • 7.24. Algorithms¶
  • 7.25. Glossary¶
  • 7.26. Bài tập
  • Các tuyên bố lặp lại giải thích với ví dụ là gì?
  • Một tuyên bố lặp lại trong Python là gì?
  • Lặp đi lặp lại trong Python với ví dụ là gì?
  • Có bao nhiêu tuyên bố lặp lại trong Python?

Ngày 17 tháng 5 năm 2019

Các câu lệnh lặp Python

Iteration:

Lặp lại lặp lại việc thực thi một chuỗi mã. Lặp lại rất hữu ích để giải quyết nhiều vấn đề lập trình. Lặp lại và thực hiện có điều kiện là cơ sở cho việc xây dựng thuật toán. Máy tính là & nbsp; thường được sử dụng để tự động hóa các tác vụ lặp đi lặp lại. Lặp lại các nhiệm vụ giống hệt hoặc tương tự mà không mắc lỗi là điều mà máy tính làm tốt. Một hình thức lặp trong Python là tuyên bố trong khi. Dưới đây là một chương trình đơn giản đếm ngược từ năm. One form of iteration in Python is the while statement. Here is a simple program that counts down from five.
One form of iteration in Python is the while statement. Here is a simple program that counts down
from five.

Example:
iteration.py
n = 5
while n > 0:
print n
n = n-1
print(“iterated trough 5 values”)

Lưu ý: Để biết thêm chi tiết về trong khi vòng lặp vui lòng lưu lượng điều khiển Goto Python.: For more details on while loop please goto python control flow.: For more details on while loop please goto python control flow.

Các câu lệnh lặp có thể được kiểm soát bởi từ khóa sau:

• Phá vỡ • Tiếp tục • Vượt qua trong Python, phá vỡ và tiếp tục các câu lệnh có thể thay đổi luồng của một vòng lặp bình thường. • continue • Pass In Python, break and continue statements can alter the flow of a normal loop.
• continue
• Pass
In Python, break and continue statements can alter the flow of a normal loop.

Phá vỡ các tuyên bố

Tuyên bố Break chấm dứt vòng lặp chứa nó. Kiểm soát chương trình chảy vào câu lệnh ngay sau phần thân của vòng lặp. immediately after the body of the loop.
immediately after the body of the loop.

Syntax:

break;

Biểu đồ lưu lượng cho các câu lệnh phá vỡ

Example:
break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
Đầu ra

Tiếp tục tuyên bố:

Câu lệnh tiếp tục được sử dụng để bỏ qua phần còn lại của mã bên trong một vòng lặp cho lần lặp hiện tại. Vòng lặp không chấm dứt mà tiếp tục với lần lặp tiếp theo. Loop does not terminate but continues on with the next iteration.
Loop does not terminate but continues on with the next iteration.

Syntax:

Continue;

Biểu đồ lưu lượng cho các tuyên bố tiếp tục

Example:
 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
Đầu ra

Tiếp tục tuyên bố:

Câu lệnh tiếp tục được sử dụng để bỏ qua phần còn lại của mã bên trong một vòng lặp cho lần lặp hiện tại. Vòng lặp không chấm dứt mà tiếp tục với lần lặp tiếp theo. Loop does not terminate but continues on with the next iteration.

Syntax:

Pass;

Example:
pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
Đầu ra

Câu lệnh tiếp tục được sử dụng để bỏ qua phần còn lại của mã bên trong một vòng lặp cho lần lặp hiện tại. Vòng lặp không chấm dứt mà tiếp tục với lần lặp tiếp theo. Loop does not terminate but continues on with the next iteration.
Note: pass is mostly used in defualt cases, where just for future handling a case is defined.

Biểu đồ lưu lượng cho các tuyên bố tiếp tục

Câu lệnh tiếp tục được sử dụng để bỏ qua phần còn lại của mã bên trong một vòng lặp cho lần lặp hiện tại. Vòng lặp không chấm dứt mà tiếp tục với lần lặp tiếp theo.iteration. Because iteration is so common, Python provides several language features to make it easier. We’ve already seen the for statement in chapter 3. This the the form of iteration you’ll likely be using most often. But in this chapter we’ve going to look at the while statement — another way to have your program do iteration, useful in slightly different circumstances.

Tiếp tục tuyên bố:Note: pass is mostly used in defualt cases, where just for future handling a case is defined.

7.1. Phân công¶

Máy tính thường được sử dụng để tự động hóa các tác vụ lặp đi lặp lại. Lặp đi lặp lại các nhiệm vụ giống hệt hoặc tương tự mà không mắc lỗi là điều mà máy tính làm tốt và mọi người làm kém.

Việc thực hiện lặp đi lặp lại của một tập hợp các câu lệnh được gọi là lặp. Bởi vì lặp lại 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 tôi đã thấy tuyên bố cho 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 tôi sẽ xem xét tuyên bố trong khi - một cách khác để chương trình của bạn thực hiện việc lặp lại, hữu ích trong các trường hợp hơi khác nhau.iteration. Because iteration is so common, Python provides several language features to make it easier. We’ve already seen the for statement in chapter 3. This the the form of iteration you’ll likely be using most often. But in this chapter we’ve going to look at the while statement — another way to have your program do iteration, useful in slightly different circumstances.

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

Như chúng tôi đã đề cập trước đây, việc thực hiện nhiều hơn một nhiệm vụ cho cùng một biến là hợp pháp. Một bài tập mới làm cho một biến hiện có đề cập đến một giá trị mới (và dừng tham khảo giá trị cũ).airtime_remaining is printed, its value is 15, and the second time, its value is 7.

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
=) for assignment, it is tempting to interpret a statement like a = 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 một bài kiểm tra bình đẳng là đối xứng, nhưng bài tập thì không. Ví dụ: nếu a == 7 thì 7 == a. Nhưng trong Python, tuyên bố A = 7 là hợp pháp và 7 = A thì không.a==7 then 7==a. But in Python, the statement a=7 is legal and 7=a is not.a == 7 then 7 == a. But in Python, the statement a = 7 is legal and 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 bài tập tiếp theo có thể thay đổi một trong số đó, họ không phải ở lại như vậ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

Dòng thứ ba thay đổi giá trị của A nhưng không thay đổi giá trị của B, vì vậy chúng không còn bằng. (Trong một số ngôn ngữ lập trình, một biểu tượng khác được sử dụng để gán, chẳng hạn nhưa but does not change the value of b, so they are no longer equal. (In some programming languages, a different symbol is used for assignment, such as a but does not change the value of b, so they are no longer equal. (In some programming languages, a different symbol is used for assignment, such as <- or :=, to avoid confusion. Some people also think that variable was an unfortunae word to choose, and instead we should have called them assignables. Python chooses to follow common terminology and token usage, also found in languages like C, C++, Java, and C#, so we use the tokens = for assignment, == for equality, and we talk of variables.

7.2. Cập nhật các biến

Khi một câu lệnh gán được thực thi, biểu thức bên tay phải (nghĩa là biểu thức xuất hiện sau mã thông báo gán) được đánh giá trước. Điều này tạo ra một giá trị. Sau đó, nhiệm vụ được thực hiện, để biến ở phía bên trái bây giờ đề cập đến giá trị mới.

Một trong những hình thức phân công phổ biến nhất là bản cập nhật, trong đó giá trị mới của biến phụ thuộc vào giá trị cũ của nó. Khấu trừ 40 xu từ cân bằng thời gian phát sóng của tôi hoặc thêm một lần chạy vào bảng điểm.

Dòng 2 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, và gán câu trả lời cho N, do đó làm cho n đề cập đến giá trị. Vì vậy, sau khi thực hiện hai dòng trên, N sẽ chỉ/tham khảo số nguyên 16.n will point/refer to the integer 16.n will point/refer to the integer 16.

Nếu bạn cố gắng nhận được giá trị của một biến chưa từng được gán, bạn sẽ gặp lỗi:

>>> 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 nó thành một số giá trị bắt đầu, thường là với một bài tập đơn giản:initialize it to some starting value, usually with a simple assignment:initialize it to some starting value, usually with a simple assignment:

runs_scored = 0
...
runs_scored = runs_scored + 1

Dòng 3 - Cập nhật một biến bằng cách thêm 1 vào nó - là rất phổ biến. Nó được gọi là một sự gia tăng của biến; Trừ 1 được gọi là giảm. Đôi khi các lập trình viên cũng nói về việc va chạm một biến, điều đó có nghĩa là giống như tăng 1.increment of the variable; subtracting 1 is called a decrement. Sometimes programmers also talk about bumping a variable, which means the same as incrementing it by 1.increment of the variable; subtracting 1 is called a decrement. Sometimes programmers also talk about bumping a variable, which means the same as incrementing it by 1.

7.3. Các vòng lặp lại được xem xét lạifor loop revisited¶

Hãy nhớ lại rằng các quá trình vòng lặp cho mỗi mục trong một danh sách. Mỗi mục lần lượt được (lại) được 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 tôi đã thấy ví dụ này trong một chương trước:for loop processes each item in a list. Each item in turn is (re-)assigned to the loop variable, and the body of the loop is executed. We saw this example in an earlier chapter:for loop processes each item in a list. Each item in turn is (re-)assigned to the loop variable, and the body of the loop is executed. We saw this example in an earlier chapter:

for f in ["Joe", "Zoe", "Brad", "Angelina", "Zuki", "Thandi", "Paris"]:
    invitation = "Hi " + f + ".  Please come to my party on Saturday!"
    print(invitation)

Chạy qua tất cả các mục trong một danh sách được gọi là đi ngang qua danh sách, hoặc truyền tải.traversing the list, or traversal.traversing the list, or traversal.

Hãy để chúng tôi viết một hàm ngay bây giờ để tổng hợp tất cả các yếu 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 có thể thấy bạn cần phải giữ một số hoạt động của người Viking cho đến nay, trên một mảnh 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 xác là lý do tại sao chúng tôi có các biến trong một chương trình: vì vậy chúng tôi sẽ cần một số biến để nhớ tổng số chạy. Nó nên được khởi tạo với giá trị bằng không, và sau đó chúng ta cần đi 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ố chạy bằng cách thêm số tiếp theo vào nó.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
0

7.4. Câu nói trong khiwhile statement¶

Dưới đây là một đoạn mã thể hiện việc sử dụng câu lệnh WHRE:while statement:while statement:

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
1
break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
2

Bạn gần như có thể đọc câu nói như thể đó là tiếng Anh. Điều đó có nghĩa là, trong khi V nhỏ hơn hoặc bằng n, tiếp tục thực hiện cơ thể của vòng lặp. Trong cơ thể, mỗi lần, tăng v. Khi v vượt qua n, trả lại tổng tích lũy của bạn.while statement as if it were English. It means, while v is less than or equal to n, continue executing the body of the loop. Within the body, each time, increment v. When v passes n, return your accumulated sum.while statement as if it were English. It means, while v is less than or equal to n, continue executing the body of the loop. Within the body, each time, increment v. When v passes n, return your accumulated sum.

Chính thức hơn, đây là luồng thực thi chính xác trong một thời gian:while statement:while statement:

  • Đánh giá điều kiện ở dòng 5, mang lại một giá trị là sai hoặc đúng.False or True.False or True.
  • Nếu giá trị là sai, hãy thoát khỏi câu lệnh WHRE và tiếp tục thực thi tại câu lệnh tiếp theo (dòng 8 trong trường hợp này).False, exit the while statement and continue execution at the next statement (line 8 in this case).False, exit the while statement and continue execution at the next statement (line 8 in this case).
  • Nếu giá trị là đúng, hãy thực hiện từng câu lệnh trong phần thân (dòng 6 và 7) và sau đó quay lại câu lệnh WHRE ở dòng 5.True, execute each of the statements in the body (lines 6 and 7) and then go back to the while statement at line 5.True, execute each of the statements in the body (lines 6 and 7) and then go back to the while statement at line 5.

Cơ thể bao gồm tất cả các tuyên bố được thụt vào bên dưới từ khóa.while keyword.while keyword.

Lưu ý rằng nếu điều kiện vòng lặp là sai khi lần đầu tiên chúng ta nhận được vòng lặp, các câu lệnh trong phần thân của vòng lặp không bao giờ được thực thi.False the first time we get loop, the statements in the body of the loop are never executed.False the first time we get loop, the statements in the body of the loop are never executed.

Phần thân của vòng lặp nên thay đổi giá trị của một hoặc nhiều biến để cuối cùng điều kiện trở nên sai và vòng lặp chấm dứt. 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í vô tận cho các nhà khoa học máy tính là quan sát rằng các hướng trên dầu gội, Lather Lather, Rửa sạch, lặp lại, là một vòng lặp vô hạn.infinite loop. An endless source of amusement for computer scientists is the observation that the directions on shampoo, “lather, rinse, repeat”, are an infinite loop.infinite loop. An endless source of amusement for computer scientists is the observation that the directions on shampoo, “lather, rinse, repeat”, are an infinite loop.

Trong trường hợp ở đây, chúng ta có thể chứng minh rằng vòng lặp chấm dứt 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 rằng giá trị của V tăng mỗi lần thông qua vòng lặp, vì vậy cuối cùng nó sẽ phải vượt quá n. Trong các trường hợp khác, trong một số trường hợp, không thể dễ dàng, thậm chí không thể biết được vòng lặp sẽ chấm dứt.n is finite, and we can see that the value of 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.n is finite, and we can see that the value of 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.

Những gì bạn sẽ nhận thấy ở đây là vòng lặp trong khi hoạt động nhiều hơn cho bạn - lập trình viên - hơn là tương đương với vòng lặp. Khi sử dụng vòng lặp thời gian, người ta phải tự quản lý biến vòng lặp: cho nó một giá trị ban đầu, kiểm tra hoàn thành và sau đó đảm bảo bạn thay đổi thứ gì đó trong cơ thể để vòng lặp chấm dứt. Để so sánh, đây là một chức năng tương đương sử dụng cho thay vào đó:while loop is more work for you — the programmer — than the equivalent for loop. When using a while loop one has to manage the loop variable yourself: give it an initial value, test for completion, and then make sure you change something in the body so that the loop terminates. By comparison, here is an equivalent function that uses for instead:while loop is more work for you — the programmer — than the equivalent for loop. When using a while loop one has to manage the loop variable yourself: give it an initial value, test for completion, and then make sure you change something in the body so that the loop terminates. By comparison, here is an equivalent function that uses for instead:

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
3

Lưu ý cuộc gọi hơi khó khăn đến hàm phạm vi - chúng tôi phải thêm một cuộc gọi vào N, vì phạm vi tạo ra danh sách của nó lên đến nhưng không bao gồm giá trị bạn đưa ra. Sẽ rất dễ dàng để phạm sai lầm 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ị, bộ thử nghiệm của chúng tôi sẽ bắt gặp lỗi của chúng tôi.range function — we had to add one onto n, 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.range function — we had to add one onto n, 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 nếu có vẻ dễ dàng hơn? Ví dụ tiếp theo này cho thấy một trường hợp chúng ta cần thêm sức mạnh mà chúng ta nhận được từ vòng lặp trong khi.for looks easier? This next example shows a case where we need the extra power that we get from the while loop.for looks easier? This next example shows a case where we need the extra power that we get from the while loop.

7.5. Trình tự Collatz 3N + 1

Hãy cùng nhìn vào một chuỗi đơn giản đã bị các nhà toán học mê hoặc và cáo trong nhiều năm. Họ vẫn không thể trả lời ngay cả những câu hỏi khá đơn giản về điều này.

Quy tắc tính toán của người Viking để tạo chuỗi là bắt đầu từ một số n đã cho và tạo ra thuật ngữ tiếp theo của chuỗi từ n, bằng cách giảm một nửa 1. Trình tự chấm dứt khi N đạt 1.n, and to generate the next term of the sequence from n, either by halving n, (whenever n is even), or else by multiplying it by three and adding 1. The sequence terminates when n reaches 1.n, and to generate the next term of the sequence from n, either by halving n, (whenever n is even), or else by multiplying it by three and adding 1. The sequence terminates when n reaches 1.

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

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
4

Trước tiên, lưu ý rằng hàm in trên dòng 6 có thêm một đối số kết thúc = ",". Điều này cho biết chức năng in theo chuỗi in với bất cứ điều gì mà lập trình viên chọn (trong trường hợp này là dấu phẩy theo sau là một không gian), thay vì kết thúc dòng. Vì vậy, mỗi lần một cái gì đó được in trong vòng lặp, nó đượ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 để in (n, end = ". (Bạn sẽ bao gồm \ n (ký tự dòng mới) trong chương tiếp theo).end=",". This tells the print function to follow the printed string with whatever the programmer chooses (in this case, a comma followed by a space), instead of ending the line. So each time something is printed in the loop, it is printed on the same output line, with the numbers separated by commas. The call to print(n,end=".\n") at line 11 after the loop terminates will then print the final value of n followed by a period and a newline character. (You’ll cover the \n (newline character) in the next chapter).end=", ". This tells the print function to follow the printed string with whatever the programmer chooses (in this case, a comma followed by a space), instead of ending the line. So each time something is printed in the loop, it is printed on the same output line, with the numbers separated by commas. The call to print(n, end=".\n") at line 11 after the loop terminates will then print the final value of n followed by a period and a newline character. (You’ll cover the \n (newline character) in the next chapter).

Điều kiện để tiếp tục với vòng lặp này là n! = 1, vì vậy vòng lặp sẽ tiếp tục chạy cho đến khi nó đạt đến điều kiện chấm dứt, (tức là n == 1).n!=1, so the loop will continue running until it reaches its termination condition, (i.e. n==1).n != 1, so the loop will continue running until it reaches its termination condition, (i.e. n == 1).

Mỗi lần thông qua vòng lặp, chương trình sẽ xuất ra giá trị của N và sau đó kiểm tra xem nó có chẵn hay lẻ không. Nếu nó là chẵn, giá trị của N được chia cho 2 bằng cách sử dụng phân chia số nguyên. Nếu nó là lẻ, giá trị được thay thế bằng n*3+1. Dưới đây là một số ví dụ:n and then checks whether it is even or odd. If it is even, the value of n is divided by 2 using integer division. If it is odd, the value is replaced by n*3+1. Here are some examples:n and then checks whether it is even or odd. If it is even, the value of n is divided by 2 using integer division. If it is odd, the value is replaced by n * 3 + 1. Here are some examples:

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
5

Vì n đôi khi tăng và đôi khi giảm, không có bằng chứng rõ ràng rằng N sẽ đạt được 1 hoặc chương trình chấm dứt. Đối với một số giá trị cụ thể của N, chúng ta có thể chứng minh chấm dứt. Ví dụ: nếu giá trị bắt đầu là công suất của hai, thì giá trị của n sẽ thậm chí mỗi lần thông qua vòng lặp cho đến khi nó đạt đến 1. Ví dụ trước kết thúc với một chuỗi như vậy, bắt đầu bằng 16.n sometimes increases and sometimes decreases, there is no obvious proof that n will ever reach 1, or that the program terminates. For some particular values of n, we can prove termination. For example, if the starting value is a power of two, then the value of n will be even each time through the loop until it reaches 1. The previous example ends with such a sequence, starting with 16.n sometimes increases and sometimes decreases, there is no obvious proof that n will ever reach 1, or that the program terminates. For some particular values of n, we can prove termination. For example, if the starting value is a power of two, then the value of n will be even each time through the loop until it reaches 1. The previous example ends with such a sequence, starting with 16.

Xem nế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ó chấm dứt.

Các giá trị cụ thể sang một bên, 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 có tên Lothar Collatz: The Collatz phỏng đoán (còn được gọi là phỏng đoán 3N + 1), là chuỗi này chấm dứt cho tất cả các giá trị dương của n. Cho đến nay, không ai có thể chứng minh nó hoặc từ chối 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 chắn.)n. So far, no one has been able to prove it or disprove it! (A conjecture is a statement that might be true, but nobody knows for sure.)n. So far, no one has been able to prove it or disprove it! (A conjecture is a statement that might be true, but nobody knows for sure.)

Hãy suy nghĩ cẩn thận về những gì cần thiết cho một bằng chứng hoặc không phù hợp với phỏng đoán, tất cả các số nguyên dương cuối cùng sẽ hội tụ đến 1 bằng cách sử dụng các 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 lên đến các giá trị rất lớn, và cho đến nay, cuối cùng họ đã kết thúc ở mức 1. Nhưng ai biết? Có lẽ có một số số chưa được kiểm tra chưa được giảm xuống còn 1.

Bạn sẽ nhận thấy rằng nếu bạn không dừng lại khi bạn đạt được 1, trình tự sẽ vào vòng lặp theo chu kỳ của riêng nó: 1, 4, 2, 1, 4, 2, 1, 4 ... vì vậy một khả năng là có thể Hãy là 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. Trình tự này cũng nằm dưới các tên khác (trình tự mưa đá, số kỳ diệu, v.v.), và bạn sẽ tìm hiểu xem có bao nhiêu số nguyên đã được thử nghiệm bằng máy tính và được tìm thấy để hội tụ!

Lựa chọn giữa và trong khifor and whilefor and while

Sử dụng một vòng lặp cho vòng nếu bạn biết, trước khi bạn bắt đầu lặp, số lần tối đa mà bạn sẽ cần phải thực hiện cơ thể. Ví dụ: nếu bạn vượt qua một danh sách các yếu tố, bạn sẽ biết rằng số lần lặp vòng tối đa mà bạn có thể cần là tất cả các yếu tố trong danh sách. Hoặc nếu bạn cần in bảng 12 lần, chúng tôi biết ngay lập tức vòng lặp sẽ cần chạy.for loop if you know, before you start looping, the maximum number of times that you’ll need to execute the body. For example, if you’re traversing a list of elements, you know that the maximum number of loop iterations you can possibly need is “all the elements in the list”. Or if you need to print the 12 times table, we know right away how many times the loop will need to run.for loop if you know, before you start looping, the maximum number of times that you’ll need to execute the body. For example, if you’re traversing a list of elements, you know that the maximum number of loop iterations you can possibly need is “all the elements in the list”. Or if you need to print the 12 times table, we know right away how many times the loop will need to run.

Vì vậy, bất kỳ vấn đề nào như khác nhau về 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, thì Tìm tất cả các số nguyên tố lên tới 10000, cho thấy rằng một vòng lặp là tốt nhất.for loop is best.for loop is best.

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 (nếu) điều này sẽ xảy ra, như chúng tôi đã làm trong vấn đề 3n + 1 này, bạn sẽ cần một vòng lặp.while loop.while loop.

Chúng tôi gọi trường hợp nhất định trường hợp lặp đi lặp lại - chúng tôi biết trước một số giới hạn xác định cho những gì cần thiết. Trường hợp thứ hai được gọi là lặp lại không xác định - chúng tôi không chắc chắn có bao nhiêu lần lặp lại mà chúng tôi cần - chúng tôi thậm chí không thể thiết lập giới hạn trên!definite iteration — we know ahead of time some definite bounds for what is needed. The latter case is called indefinite iteration — we’re not sure how many iterations we’ll need — we cannot even establish an upper bound!definite iteration — we know ahead of time some definite bounds for what is needed. The latter case is called indefinite iteration — we’re not sure how many iterations we’ll need — we cannot even establish an upper bound!

7.6. Truy tìm 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ề 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 việc thực hiện chương trình máy tính. Truy tìm liên quan đến việc trở thành máy tính và tuân theo luồng thực thi thông qua chạy chương trình mẫu, 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ần thực hiện được thực thi.trace the execution of a computer program. Tracing involves becoming the computer and following the flow of execution through a sample program run, recording the state of all variables and any output the program generates after each instruction is executed.trace the execution of a computer program. Tracing involves becoming the computer and following the flow of execution through a sample program run, recording the state of all variables and any output the program generates after each instruction is executed.

Để hiểu quá trình này, hãy để theo dõi cuộc gọi đến SEQ3NP1 (3) từ phần trước. Khi bắt đầu dấu vết, chúng ta có một biến, n (tham số), với giá trị ban đầu là 3. Vì 3 không bằng 1, trong khi cơ thể vòng lặp được thực thi. 3 được in và 3%2 == 0 được đánh giá. Vì nó đánh giá là sai, nhánh khác được thực thi và 3*3+1 được đánh giá và gán cho n.seq3np1(3) from the previous section. At the start of the trace, we have a variable, n (the parameter), with an initial value of 3. Since 3 is not equal to 1, the while loop body is executed. 3 is printed and 3%2==0 is evaluated. Since it evaluates to False, the else branch is executed and 3*3+1 is evaluated and assigned to n.seq3np1(3) from the previous section. At the start of the trace, we have a variable, n (the parameter), with an initial value of 3. Since 3 is not equal to 1, the while loop body is executed. 3 is printed and 3 % 2 == 0 is evaluated. Since it evaluates to False, the else branch is executed and 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 một chương trình, hãy tạo một cột hướng trên một mảnh giấy cho mỗi biến được tạo khi chương trình chạy và một bài 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:

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
6

Vì 10! = 1 đánh giá là đúng, phần thân vòng lặp lại được thực thi và 10 được in. 10%2 == 0 là đúng, vì vậy nhánh nếu được thực thi và n trở thành 5. Vào cuối dấu vết chúng ta có:10!=1 evaluates to True, the loop body is again executed, and 10 is printed. 10%2==0 is true, so the if branch is executed and n becomes 5. By the end of the trace we have:10 != 1 evaluates to True, the loop body is again executed, and 10 is printed. 10 % 2 == 0 is true, so the if branch is executed and n becomes 5. By the end of the trace we have:

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
7

Theo dõi có thể hơi tẻ nhạt và dễ bị lỗi (đó là lý do tại sao chúng ta có máy tính để làm công việc này ngay từ đầu!), Nhưng đó là một kỹ năng thiết yếu cho một lập trình viên có. Từ dấu vết này, chúng ta có thể tìm hiểu rất nhiều về cách thức hoạt động của mã. Ví dụ, chúng ta có thể quan sát rằng ngay khi N trở thành sức mạnh của 2, ví dụ, chương trình sẽ yêu cầu thực hiện log2 (n) của cơ thể 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 chức năng in đặc biệt ở cuối.n becomes a power of 2, for example, the program will require log2(n) executions of the loop body to complete. We can also see that the final 1 will not be printed as output within the body of the loop, which is why we put the special print function at the end.n becomes a power of 2, for example, the program will require log2(n) executions of the loop body to complete. We can also see that the final 1 will not be printed as output within the body of the loop, which is why we put the special print function at the end.

Tất nhiên, theo dõi một chương trình liên quan đến việc 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 để một bước cho bạn ít dễ bị lỗi 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, họ có thể thực hiện nhiều triệu bước trước khi họ nhận được mã mà bạn thực sự quan tâm, vì vậy truy tìm thủ công trở nên không thể. Có thể đặt một điểm dừng nơi bạn cần một người mạnh mẽ hơn nhiều. Vì vậy, chúng tôi khuyến khích bạn đầu tư thời gian vào việc học sử dụng để sử dụng môi trường lập trình của bạn (pyscripter, trong các ghi chú này) để có hiệu quả đầy đủ.single-step for you is less error prone and more convenient. Also, as your programs get more complex, they might execute many millions of steps before they get to the code that you’re really interested in, so manual tracing becomes impossible. Being able to set a breakpoint where you need one is far more powerful. So we strongly encourage you to invest time in learning using to use your programming environment (PyScripter, in these notes) to full effect.single-step for you is less error prone and more convenient. Also, as your programs get more complex, they might execute many millions of steps before they get to the code that you’re really interested in, so manual tracing becomes impossible. Being able to set a breakpoint where you need one is far more powerful. So we strongly encourage you to invest time in learning using to use your programming environment (PyScripter, in these notes) to full effect.

Ngoài ra còn có một số công cụ trực quan tuyệt vời trở nên có sẵn để giúp bạn theo dõi và hiểu các đoạn nhỏ của mã Python. Một trong những chúng tôi đề xuất là tại http://netserv.ict.ru.ac.za/python3_viz

Chúng tôi đã cảnh báo chống lại các chức năng Chatterbox, nhưng đã sử dụng chúng ở đây. Khi chúng tôi tìm hiểu thêm một chút 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ì có chức năng in chúng. Làm điều này sẽ loại bỏ sự cần thiết phải có tất cả các chức năng in pesky này ở giữa logic của chúng tôi và sẽ làm cho chức năng trở nên hữu ích hơn.print functions in the middle of our logic, and will make the function more useful.print functions in the middle of our logic, and will make the function more useful.

7.7. Đếm chữ số

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

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
8

Một cuộc gọi để in (num_digits (710)) sẽ in 3. Theo dõi việc thực hiện cuộc gọi chức năng này (có thể sử dụng hàm bước duy nhất trong Pyscripter hoặc trình hiển thị Python hoặc trên một số bài báo) để thuyết phục bản thân rằng nó hoạt động.print(num_digits(710)) will print 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.print(num_digits(710)) will print 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 cho thấy một mô hình tính toán quan trọng được gọi là bộ đếm. Số lượng biến được khởi tạo thành 0 và sau đó tăng mỗi lần cơ thể vòng lặp được thực thi. Khi vòng lặp thoát, số lượng chứa kết quả - tổng số lần cơ thể vòng được thực thi, giống như số lượng chữ số.counter. The variable count is initialized to 0 and then incremented each time the loop body is executed. When the loop exits, count contains the result — the total number of times the loop body was executed, which is the same as the number of digits.counter. The variable count is initialized to 0 and then incremented each time the loop body is executed. When the loop exits, count contains the result — the total number of times the loop body was executed, which is the same as the number of digits.

Nếu chúng tôi chỉ muốn đếm các chữ số là 0 hoặc 5, 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:

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
9

Xác nhận rằng kiểm tra (num_zero_and_five_digits (1055030250) == 7).test(num_zero_and_five_digits(1055030250)==7) passes.test(num_zero_and_five_digits(1055030250) == 7) passes.

Tuy nhiên, lưu ý rằng bài kiểm tra (num_digits (0) == 1) không thành công. Giải thích vì sao. Bạn có nghĩ rằng đây là một lỗi trong mã, hoặc một lỗi trong các thông số kỹ thuật, hoặc kỳ vọng của chúng tôi hoặc các bài kiểm tra?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?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

Việc tăng một biến là phổ biến đến mức Python cung cấp cú pháp viết tắt cho nó:

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
00

Đếm+= 1 là một vi phạm cho đếm = đếm+1. Chúng tôi phát âm người vận hành là cộng đồng cộng. Giá trị gia tăng không phải là 1:+=1 is an abreviation for count=count+1 . We pronounce the operator as “plus-equals”. The increment value does not have to be 1: += 1 is an abreviation for count = count + 1 . We pronounce the operator as “plus-equals”. The increment value does not have to be 1:

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
01

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

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
02

7.10. Những cái bàn¶

Một trong những điều vòng lặp là tốt cho việc tạo bảng. Trước khi máy tính có sẵn, mọi người phải tính toán logarit, sines và cosines và các chức năng toán học khác bằng tay. Để làm cho điều đó dễ dàng hơn, các cuố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 chức năng 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 trên hiện trường, một trong những phản ứng ban đầu là, Đây là điều tuyệt vời! Chúng ta có thể sử dụng các máy tính để tạo các bảng, vì vậy sẽ không có lỗi. Điều đó hóa ra là đúng (chủ yếu) nhưng thiển cận. Ngay sau đó, máy tính và máy tính lan tỏa đế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 các bảng của các giá trị để nhận được câu trả lời gần đúng và sau đó thực hiện các tính toán để cải thiện xấp xỉ. Trong một số trường hợp, đã có lỗi trong các bảng cơ bản, nổi tiếng nhất trong bảng Chip của bộ xử lý Intel Pentium được sử dụng để thực hiện phân chia điểm nổi.

Mặc dù một bảng nhật ký không hữu ích như trước đây, nhưng nó vẫn tạo ra một ví dụ điển hình về việc lặp lại. Chương trình sau đây đưa ra một chuỗi các giá trị trong cột bên trái và 2 được nâng lên công suất của giá trị đó trong cột bên phải:

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
03

Chuỗi "\ t" đại diện cho một ký tự tab. Ký tự dấu gạch chéo ngược trong "\ t" chỉ ra sự khởi đầu của chuỗi thoát. Trình tự thoát được sử dụng để thể hiện các ký tự vô hình như tab và newlines. Trình tự \ n đại diện cho một dòng mới."\t" represents a tab character. The backslash character in "\t" indicates the beginning of an escape sequence. Escape sequences are used to represent invisible characters like tabs and newlines. The sequence \n represents a newline."\t" represents a tab character. The backslash character in "\t" indicates the beginning of an escape sequence. Escape sequences are used to represent invisible characters like tabs and newlines. The sequence \n represents a newline.

Một chuỗi thoát có thể xuất hiện ở bất cứ đâu trong một chuỗi; Trong ví dụ này, chuỗi thoát tab là điều duy nhất 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ỏ theo dõi nơi nhân vật tiếp theo sẽ đi. Sau một chức năng in, con trỏ thường đi đến đầu dòng tiếp theo.cursor keeps track of where the next character will go. After a print function, the cursor normally goes to the beginning of the next line.cursor keeps track of where the next character will go. After a print function, the cursor normally goes to the beginning of the next line.

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

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
04

Do các ký tự tab giữa các cột, vị trí của cột thứ hai không phụ thuộc vào số lượng chữ số trong cột đầu tiên.

7.11. Bảng hai chiều

Một bảng hai chiều là một bảng nơi bạn đọc giá trị ở giao điểm của một hàng và một cột. Một bảng nhân là một ví dụ tốt. Hãy nói rằng bạn muốn in một bảng nhân cho các giá trị từ 1 đến 6.

Một cách tốt để 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:

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
05

Ở đây, chúng tôi đã sử dụng hàm phạm vi, nhưng làm cho nó bắt đầu chuỗi của nó ở mức 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 phạm vi đã được gán cho I, vòng lặp chấm dứt. Mỗi lần qua vòng lặp, nó hiển thị giá trị của 2*I, theo sau là ba khoảng trống.range function, but made it start its sequence at 1. As the loop executes, the value of i changes from 1 to 6. When all the elements of the range have been assigned to i, the loop terminates. Each time through the loop, it displays the value of 2*i, followed by three spaces.range function, but made it start its sequence at 1. As the loop executes, the value of i changes from 1 to 6. When all the elements of the range have been assigned to i, the loop terminates. Each time through the loop, it displays the value of 2 * i, followed by three spaces.

Một lần nữa, end end = "& nbsp; & nbsp;" Đối số trong chức năng in triệt tiêu dòng mới và sử dụng ba không gian thay thế. Sau khi vòng lặp hoàn thành, cuộc gọi để in ở dòng 3 kết thúc dòng hiện tại và bắt đầu một dòng mới.end="   " argument in the print function suppresses the newline, and uses three spaces instead. After the loop completes, the call to print at line 3 finishes the current line, and starts a new line.end="   " argument in the print function suppresses the newline, and uses three spaces instead. After the loop completes, the call to print at line 3 finishes the current line, and starts a new line.

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

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

7.12. Đóng gói và tổng quát

Đó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ả các chức năng là tốt. Bạn đã thấy một số ví dụ về đóng gói, bao gồm cả is_divisible trong một chương trước.is_divisible in a previous chapter.is_divisible in a previous chapter.

Tổng 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ó 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à khái quát nó để in bội số của N:n:n:

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
06

Để gói gọn, tất cả những gì chúng tôi phải làm là thêm dòng đầu tiên, tuyên bố 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.n.

Nếu chúng ta gọi chức năng này với đối số 2, chúng ta sẽ nhận được đầu ra giống như trước đây. Với đối số 3, đầu ra là:

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

Đến bây giờ bạn có thể đoán cách in bảng nhân - bằng cách gọi print_multiples nhiều lần với các đối số khác nhau. Trên thực tế, chúng ta có thể sử dụng một vòng lặp khác:print_multiples repeatedly with different arguments. In fact, we can use another loop:print_multiples repeatedly with different arguments. In fact, we can use another loop:

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
07

Lưu ý rằng vòng lặp này giống nhau như thế nào với một bên trong print_multiples. Tất cả những gì chúng tôi đã làm là thay thế chức năng in bằng một cuộc gọi chức năng.print_multiples. All we did was replace the print function with a function call.print_multiples. All we did was replace the print function with a function call.

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

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
08

7.13. Đóng gói nhiều hơn

Để chứng minh đóng gói một lần nữa, hãy để Lừa lấy mã từ phần cuối cùng và bọc nó trong một chức năng:

 continue_test.py
for val in "string":
if val == "i":
continue
print(val)
print("The end")
09

Quá trình này là một kế hoạch phát triển phổ biến. 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 có mã hoạt động, chúng tôi trích xuất nó và bọc nó trong một hàm.development plan. We develop code by writing lines of code outside any function, or typing them in to the interpreter. When we get the code working, we extract it and wrap it up in a function.development plan. We develop code by writing lines of code outside any function, or typing them in to the interpreter. When we get the code working, we extract it and wrap it up in a function.

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ạn bắt đầu viết. Cách tiếp cận này cho phép bạn thiết kế khi bạn đi cùng.

7.14. Các biến cục bộ

Bạn có thể tự hỏi làm thế nào chúng ta có thể sử dụng cùng một biến, tôi, trong cả print_multiples và print_mult_table. Có phải nó gây ra vấn đề khi một trong các hàm thay đổi giá trị của biến?i, in both print_multiples and print_mult_table. Doesn’t it cause problems when one of the functions changes the value of the variable?i, in both print_multiples 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 và I trong print_mult_table không phải là cùng một biến.i in print_multiples and the i in print_mult_table are not the same variable.i in 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ộ; Bạn có thể truy cập một biến cục bộ từ bên ngoài chức năng nhà của nó. Điều đó có nghĩa là bạn được tự do có nhiều biến có cùng tên miễn là chúng không ở trong cùng một 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ỳ trong số chúng gán giá trị cho một biến, đó là manh mối mà Python sử dụng để biến biến thành một biến cục bộ.

Sơ đồ ngăn xếp cho chương trình này cho thấy hai biến có tên i không giống nhau. Chúng có thể đề cập đến các giá trị khác nhau và thay đổi cái này không ảnh hưởng đến cái kia.i are not the same variable. They can refer to different values, and changing one does not affect the other.

Giá trị của I trong print_mult_table đi từ 1 đến 6. 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 qua vòng lặp, print_mult_table gọi print_multiples với giá trị hiện tại của tôi như một đối số . Giá trị đó được gán cho tham số n.i in print_mult_table goes from 1 to 6. In the diagram it happens to be 3. The next time through the loop it will be 4. Each time through the loop, print_mult_table calls print_multiples with the current value of i as an argument. That value gets assigned to the parameter n.

Bên trong print_multiples, giá trị của I đi từ 1 đến 6. Trong sơ đồ, nó xảy ra là 2. Thay đổi biến này không ảnh hưởng đến giá trị của I trong print_mult_table.print_multiples, the value of i goes from 1 to 6. In the diagram, it happens to be 2. Changing this variable has no effect on the value of i in print_mult_table.

Nó là phổ biến và hoàn toàn hợp pháp để có các biến cục bộ khác nhau cùng tên. Cụ thể, các tên như I và J được sử dụng thường xuyên 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 nơi khác, có lẽ bạn sẽ làm cho chương trình khó đọc hơn.i and j are used frequently as loop variables. If you avoid using them in one function just because you used them somewhere else, you will probably make the program harder to read.

Trình hiển thị tại http://netserv.ict.ru.ac.za/python3_viz/ cho thấy rất rõ hai biến I là các biến riêng biệt và cách chúng có giá trị độc lập.i are distinct variables, and how they have independent values.

7.15. Tuyên bố phá vỡbreak statement¶

Tuyên bố phá vỡ được sử dụng để ngay lập tức rời khỏi cơ thể của vòng lặp của nó. Tuyên bố tiếp theo được thực thi là câu nói đầu tiên sau cơ thể:break statement is used to immediately leave the body of its loop. The next statement to be executed is the first one after the body:

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
0

Bản in này:

Vòng lặp thử nghiệm trước-hành vi vòng lặp tiêu chuẩn

cho và trong khi các vòng lặp thực hiện các bài kiểm tra của họ khi bắt đầu, trước khi thực hiện bất kỳ bộ phận nào của cơ thể. Họ gọi là vòng lặp thử nghiệm trước, vì bài kiểm tra xảy ra trước (trước) cơ thể. Phá vỡ và trả lại là các công cụ của chúng tôi để điều chỉnh hành vi tiêu chuẩn này. and while loops do their tests at the start, before executing any part of the body. They’re called pre-test loops, because the test happens before (pre) the body. break and return are our tools for adapting this standard behaviour.

7.16. Các hương vị khác của Loops¶

Đôi khi, chúng tôi muốn có vòng lặp thử nghiệm giữa với bài kiểm tra thoát ở giữa cơ thể, thay vì ở đầu hoặc cuối cùng. Hoặc một vòng lặp sau thử nghiệm đặt bài kiểm tra thoát của nó là điều cuối cùng trong cơ thể. Các ngôn ngữ khác có cú pháp và từ khóa khác nhau cho các hương vị khác nhau này, nhưng Python chỉ sử dụng kết hợp giữa và ifcondition: break để hoàn thành công việc.middle-test loop with the exit test in the middle of the body, rather than at the beginning or at the end. Or a post-test loop that puts its exit test as the last thing in the body. Other languages have different syntax and keywords for these different flavours, but Python just uses a combination of while and if condition: break to get the job done.

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

Sơ đồ vòng thử nghiệm giữa

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
1

Thuyết phục bản thân rằng điều này phù hợp với sơ đồ vòng lặp trung bình: 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 họ không làm việc 6 công việc hữu ích hơn trước khi lần lặp tiếp theo bắt đầu.

WHREBOOL-EXPR: Sử dụng biểu thức boolean để xác định xem có lặp lại hay không. Đúng là một biểu hiện boolean tầm thường, vì vậy whiletrue: có nghĩa là luôn luôn làm lại cơ thể 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 trên dòng 2 sẽ không bao giờ chấm dứt vòng lặp, (đó là một bài kiểm tra giả), người lập trình phải sắp xếp để phá vỡ (hoặc trả lại) ra khỏi thân vòng ở nơi khác, theo một cách khác (tức là trong dòng 4 và 5 trong mẫu này ). Một trình biên dịch hoặc trình thông dịch thông minh sẽ hiểu rằng dòng 2 là một thử nghiệm giả phải luôn thành công, vì vậy nó đã giành được thậm chí tạo ra một bài kiểm tra, và sơ đồ 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!while bool-expr: uses the Boolean expression to determine whether to iterate again. True is a trivial Boolean expression, so while True: means always do the loop body again. This is a language idiom — a convention that most programmers will recognize immediately. Since the expression on line 2 will never terminate the loop, (it is a dummy test) the programmer must arrange to break (or return) out of the loop body elsewhere, in some other way (i.e. in lines 4 and 5 in this sample). A clever compiler or interpreter will understand that line 2 is a fake test that must always succeed, so it won’t even generate a test, and our flowchart never even put the diamond-shape dummy test box at the top of the loop!

Tương tự, bằng cách chỉ di chuyển IFCondition: Break đến cuối thân vòng lặp, chúng tôi tạo ra một mẫu cho một vòng lặp sau thử nghiệm. Các vòng lặp sau thử nghiệm được sử dụng khi bạn muốn chắc chắn rằng cơ thể vòng lặp luôn thực hiện ít nhất một lần (vì thử nghiệm đầu tiên chỉ xảy ra ở cuối quá trình thực hiện thân vòng đầu tiên). Điều này rất 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:ifcondition:break to the end of the loop body we create a pattern for a post-test loop. Post-test loops are used when you want to be sure that the loop body always executes at least once (because the first test only happens at the end of the execution of the first loop body). This is useful, for example, if we want to play an interactive game against the user — we always want to play at least one game:if condition: break to the end of the loop body we create a pattern for a post-test loop. Post-test loops are used when you want to be sure that the loop body always executes at least once (because the first test only happens at the end of the execution of the first loop body). This is useful, for example, if we want to play an interactive game against the user — we always want to play at least one game:

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
2

Gợi ý: Hãy suy nghĩ về nơi bạn muốn kiểm tra thoát

Một khi bạn đã nhận ra rằng bạn cần một vòng lặp để lặp lại một cái gì đó, hãy nghĩ về điều kiện chấm dứt của nó - khi nào tôi muốn ngừng lặp lại? Sau đó tìm hiểu xem bạn cần thực hiện bài kiểm tra trước khi bắt đầu lần lặp đầu tiên (và mọi thứ khác), hoặc ở cuối lần lặp đầu tiên (và mọi thứ khác), hoặc có lẽ ở giữa mỗi lần lặp. 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ừ các tệp thường cần thoát các vòng lặp của chúng ở giữa hoặc ở cuối lần lặp, khi rõ ràng là không còn dữ liệu nào để xử lý hoặc người dùng không muốn Chơi trò chơi của chúng tôi nữa.

7.17. Một ví dụ¶

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

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
3
pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
4

Chương trình này sử dụng luật toán học toán học (được đưa ra số thực A và B, chính xác là một trong ba điều này phải đúng: A> B, A trichotomy (given real numbers a and b, exactly one of these three must be true: a > b, a < b, or a == b).trichotomy (given real numbers a and b, exactly one of these three must be true: a > b, a < b, or a == b).

Ở dòng 18 có một cuộc gọi đến chức năng đầu vào, nhưng chúng tôi không làm bất cứ điều gì với kết quả, thậm chí không gán nó cho một biến. Đây là hợp pháp trong Python. Ở đây, nó có tác dụng bật lên cửa sổ hộp thoại đầu vào và chờ người dùng trả lời trước khi chương trình chấm dứt. 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 ý rằng việc sử dụng biến MSG, ban đầu là một chuỗi trố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 với chúng tôi ' Re yêu cầu dự đoán tiếp theo.msg variable, initially an empty string, on lines 6, 12 and 14. Each time through the loop we extend the message being displayed: this allows us to display the program’s feedback right at the same place as we’re asking for the next guess.msg variable, initially an empty string, on lines 6, 12 and 14. Each time through the loop we extend the message being displayed: this allows us to display the program’s feedback right at the same place as we’re asking for the next guess.

7.18. Tuyên bố tiếp tụccontinue statement¶

Đây là một tuyên bố dòng điều khiển khiến chương trình bỏ qua ngay lập tức việc xử lý phần còn lại của phần thân của 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:

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
5

Bản in này:

7.19. Tổng quát hơn

Như 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 in một bảng nhân với bất kỳ kích thước nào, không chỉ là bảng sáu lần sáu. Bạn có thể thêm một tham số vào print_mult_table:print_mult_table:print_mult_table:

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
6

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

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
7

Điều này là tốt, ngoại trừ việc chúng ta có thể muốn bảng được 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 bảng nên có.print_multiples to specify how many columns the table should have.print_multiples to specify how many columns the table should have.

Chỉ cần gây phiền nhiễu, chúng tôi gọi tham số này 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, toàn bộ chương trình:high, demonstrating that different functions can have parameters with the same name (just like local variables). Here’s the whole program:high, demonstrating that different functions can have parameters with the same name (just like local variables). Here’s the whole program:

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
8

Lưu ý rằng khi chúng tôi thêm một tham số mới, chúng tôi phải thay đổi dòng đầu tiên của hàm (tiêu đề chức năng) và chúng tôi cũng phải thay đổi vị trí mà hàm được gọi trong print_mult_table.print_mult_table.print_mult_table.

Bây giờ, khi chúng ta gọi print_mult_table (7):print_mult_table(7):print_mult_table(7):

pass_test.py
sequence = {'p', 'a', 's', 's'}
for val in sequence:
pass
9

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 bạn đã lập kế hoạch. Ví dụ: bạn có thể nhận thấy rằng, 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. Biến đổiprint_mult_table. Changeprint_mult_table. Change

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
0

đến

Và bạn nhận được:

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
1

7.20. Chức năng¶

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

  1. Nắm bắt chunking 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à 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 sau thử nghiệm: Chúng tôi giả định rằng chúng tôi có một chức năng gọi là play_the_game_once. Vùng 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 Noughts và Crosses, hoặc một trò chơi nhập vai - và chỉ cần tập trung vào một phần bị cô 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 để chơi lại.play_the_game_once. This chunking allowed us to put aside the details of the particular game — is it a card game, or noughts and crosses, or a role playing game — and simply focus on one isolated part of our program logic — letting the player choose whether they want to play again.play_the_game_once. This chunking allowed us to put aside the details of the particular game — is it a card game, or noughts and crosses, or a role playing game — and simply focus on one isolated part of our program logic — letting the player choose whether they want to play again.
  2. Chia một chương trình dài thành các chức năng cho phép bạn phân tách các phần của chương trình, gỡ lỗi chúng một cách cô lập và sau đó soạn chúng thành một tổng thể.
  3. Các chức năng tạo điều kiện cho việc sử dụng lặp lại.
  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 một cái, bạn có thể sử dụng lại nó.

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

Chúng tôi đã thấy danh sách các tên và danh sách các số trong Python. Chúng tôi sẽ xem xét về phía trước trong sách giáo khoa một chút và chỉ ra một cách đại diện cho dữ liệu của chúng tôi. Làm một cặp trong Python cũng đơn giản như đưa chúng vào ngoặc đơn, như thế này:

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
2

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

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
3

Dưới đây là một mẫu nhanh chóng 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:

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

Lưu ý rằng danh sách Celebs chỉ có 3 yếu tố, mỗi cặp.celebs list has just 3 elements, each of them pairs.celebs list has just 3 elements, each of them pairs.

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

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
6

Điều này cho thấy một cái gì đó 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), thay vào đó. Vòng lặp được thực thi ba lần - một lần cho mỗi cặp trong danh sách và trên mỗi lần lặp, cả hai biến được gán giá trị từ cặp dữ liệu đang được xử lý.for loop: instead of using a single loop control variable, we’ve used a pair of variable names, (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.for loop: instead of using a single loop control variable, we’ve used a pair of variable names, (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. Các vòng lặp lồng cho dữ liệu lồng nhau

Bây giờ chúng tôi sẽ đưa ra một danh sách phiêu lưu hơn nữa của dữ liệu có cấu trúc. 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 một danh sách các môn học mà họ đã đăng ký:

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
7

Ở đây, chúng tôi đã chỉ định một danh sách năm yếu tố cho các sinh viên biến. Hãy để in ra từng tên học sinh và số lượng môn học mà họ đã đăng ký:students. Let’s print out each student name, and the number of subjects they are enrolled for:students. Let’s print out each student name, and the number of subjects they are enrolled for:

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
8

Python đáp ứng dễ dàng với đầu ra sau:

airtime_remaining = 15
print(airtime_remaining)
airtime_remaining = 7
print(airtime_remaining)
9

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 sinh viên, chúng tôi cần một vòng thứ hai kiểm tra từng đối tượng lần lượt:

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
0
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

Bạn nên thiết lập một danh sách các dữ liệu của riêng bạn mà bạn quan tâm - có thể là một danh sách các đĩa CD của bạn, mỗi loại chứa một danh sách các tiêu đề bài hát trên CD hoặc một danh sách các tiêu đề phim bộ phim. Sau đó, bạn có thể đặt 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 Newton để tìm rễ vuông

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.

Ví dụ, trước khi chúng tôi có máy tính hoặc máy tính, mọi người cần tính toán rễ vuông bằng tay. 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 nhiều năm trước). Giả sử rằng 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 xấp xỉ, bạn có thể tính toán xấp xỉ tốt hơn (gần hơn với câu trả lời thực tế) với công thức sau:n. If you start with almost any approximation, you can compute a better approximation (closer to the actual answer) with the following formula:n. If you start with almost any approximation, you can compute a better approximation (closer to the actual answer) with the following formula:

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

Repeat this calculation a few times using your calculator. Can you see why each iteration brings your estimate a little closer? One of the amazing properties of this particular algorithm is how quickly it converges to an accurate answer — a great advantage for doing it manually.

By using a loop and repeating this formula until the better approximation gets close enough to the previous one, we can write a function for computing the square root. (In fact, this is how your calculator finds square roots — it may have a slightly different formula and method, but it is also based on repeatedly improving its guesses.)

This is an example of an indefinite iteration problem: we cannot predict in advance how many times we’ll want to improve our guess — we just want to keep getting closer and closer. Our stopping condition for the loop will be when our old guess and our improved guess are “close enough” to each other.

Ideally, we’d like the old and new guess to be exactly equal to each other when we stop. But exact equality is a tricky notion in computer arithmetic when real numbers are involved. Because real numbers are not represented absolutely accurately (after all, a number like pi or the square root of two has an infinite number of decimal places because it is irrational), we need to formulate the stopping test for the loop by asking “is a close enough to b”? This stopping condition can be coded like this:

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
3

Notice that we take the absolute value of the difference between a and b!

This problem is also a good example of when a middle-exit loop is appropriate:

break_test.py
for val in "string":
if val == "i":
break
print(val)
print("The end")
1
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

The output is:

See if you can improve the approximations by changing the stopping condition. Also, step through the algorithm (perhaps by hand, using your calculator) to see how many iterations were needed before it achieved this level of accuracy for sqrt(25).

7.24. Algorithms¶

Newton’s method is an example of an algorithm: it is a mechanical process for solving a category of problems (in this case, computing square roots).

Some kinds of knowledge are not algorithmic. For example, learning dates from history or your multiplication tables involves memorization of specific solutions.

But the techniques you learned for addition with carrying, subtraction with borrowing, and long division are all algorithms. Or if you are an avid Sudoku puzzle solver, you might have some specific set of steps that you always follow.

One of the characteristics of algorithms is that they do not require any intelligence to carry out. They are mechanical processes in which each step follows from the last according to a simple set of rules. And they’re designed to solve a general class or category of problems, not just a single problem.

Understanding that hard problems can be solved by step-by-step algorithmic processes (and having technology to execute these algorithms for us) is one of the major breakthroughs that has had enormous benefits. So while the execution of the algorithm may be boring and may require no intelligence, algorithmic or computational thinking — i.e. using algorithms and automation as the basis for approaching problems — is rapidly transforming our society. Some claim that this shift towards algorithmic thinking and processes is going to have even more impact on our society than the invention of the printing press. And the process of designing algorithms is interesting, intellectually challenging, and a central part of what we call programming.

Some of the things that people do naturally, without difficulty or conscious thought, are the hardest to express algorithmically. Understanding natural language is a good example. We all do it, but so far no one has been able to explain how we do it, at least not in the form of a step-by-step mechanical algorithm.

7.25. Glossary¶

algorithmA step-by-step process for solving a category of problems.bodyThe statements inside a loop. breakpointA place in your program code where program execution will pause (or break), allowing you to inspect the state of the program’s variables, or single-step through individual statements, executing them one at a time.bumpProgrammer slang. Synonym for increment.continue statementA statement that causes the remainder of the current iteration of a loop to be skipped. The flow of execution goes back to the top of the loop, evaluates the condition, and if this is true the next iteration of the loop will begin.counterA variable used to count something, usually initialized to zero and incremented in the body of a loop.cursorAn invisible marker that keeps track of where the next character will be printed.decrementDecrease by 1.definite iterationA loop where we have an upper bound on the number of times the body will be executed. Definite iteration is usually best coded as a for loop.development planA process for developing a program. In this chapter, we demonstrated a style of development based on developing code to do simple, specific things and then encapsulating and generalizing.encapsulateTo divide a large complex program into components (like functions) and isolate the components from each other (by using local variables, for example).escape sequenceAn escape character, \, followed by one or more printable characters used to designate a nonprintable character.generalizeTo replace something unnecessarily specific (like a constant value) with something appropriately general (like a variable or parameter). Generalization makes code more versatile, more likely to be reused, and sometimes even easier to write.incrementBoth as a noun and as a verb, increment means to increase by 1.infinite loopA loop in which the terminating condition is never satisfied.indefinite iterationA loop where we just need to keep going until some condition is met. A while statement is used for this case.initialization (of a variable)To initialize a variable is to give it an initial value. Since in Python variables don’t exist until they are assigned values, they are initialized when they are created. In other programming languages this is not the case, and variables can be created without being initialized, in which case they have either default or garbage values.iteration Repeated execution of a set of programming statements.loopThe construct that allows allows us to repeatedly execute a statement or a group of statements until a terminating condition is satisfied.loop variableA variable used as part of the terminating condition of a loop.meta-notationExtra symbols or notation that helps describe other notation. Here we introduced square brackets, ellipses, italics, and bold as meta-notation to help describe optional, repeatable, substitutable and fixed parts of the Python syntax.middle-test loopA loop that executes some of the body, then tests for the exit condition, and then may execute some more of the body. We don’t have a special Python construct for this case, but can use while and break 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 while and break together.pre-test loopA loop that tests before deciding whether the execute its body. for and while are both pre-test loops.single-stepA mode of interpreter execution where you are able to execute your program one step at a time, and inspect the consequences of that step. Useful for debugging and building your internal mental model of what is going on.tabA special character that causes the cursor to move to the next tab stop on the current line.trichotomyGiven any real numbers a and b, exactly one of the following relations holds: a < b, a > b, or a == b. Thus when you can establish that two of the relations are false, you can assume the remaining one is true.traceTo follow the flow of execution of a program by hand, recording the change of state of the variables and any output produced.

7.26. Bài tập

Chương này chỉ cho chúng tôi 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ó một câu lệnh IF cho phép chúng tôi chỉ đếm một số mục được chọn. Trong chương trước, chúng tôi cũng đã hiển thị một chức năng find_first_2_letter_word cho phép chúng tôi thoát ra sớm từ bên trong một vòng lặp bằng cách sử dụng return khi một số điều kiện xảy ra. Bây giờ chúng tôi cũng đã phá vỡ để thoát một vòng lặp (nhưng không phải là hàm bao quanh và tiếp tục từ bỏ lần lặp hiện tại của vòng lặp mà không kết thúc vòng lặp.if statement that let us only count some selected items. In the previous chapter we also showed a function find_first_2_letter_word that allowed us an “early exit” from inside a loop by using return when some condition occurred. We now also have break to exit a loop (but not the enclosing function, and continue to abandon the current iteration of the loop without ending the loop.if statement that let us only count some selected items. In the previous chapter we also showed a function find_first_2_letter_word that allowed us an “early exit” from inside a loop by using return when some condition occurred. We now also have break to exit a loop (but not the enclosing function, and continue to abandon the current iteration of the loop without ending the loop.

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

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

  1. Viết một hàm để đếm số số lẻ trong danh sách.

  2. Tổng hợp tất cả các số chẵn trong một danh sách.

  3. Tổng hợp tất cả các số âm trong một danh sách.

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

  5. Tổng hợp tất cả các yếu tố trong một danh sách lên đến 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. Điều gì sẽ xảy ra nếu không có số thậm chí?)

  6. Đếm có bao nhiêu từ xảy ra 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 Sam. (Viết các bài kiểm tra đơn vị của bạn cho trường hợp này. Điều gì sẽ xảy ra nếu Sam Sam không xảy ra?)

  7. Thêm một chức năng in vào chức năng Newton, SQRT in ra tốt hơn mỗi khi nó được tính toán. Gọi chức năng sửa đổi của bạn với 25 làm đối số và ghi lại kết quả.sqrt function that prints out better each time it is calculated. Call your modified function with 25 as an argument and record the results.sqrt function that prints out better each time it is calculated. Call your modified function with 25 as an argument and record the results.

  8. Theo dõi việc thực hiện phiên bản cuối cùng của print_mult_table và tìm ra cách thức hoạt động của nó.print_mult_table and figure out how it works.print_mult_table and figure out how it works.

  9. Viết mộ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 đầu ra sau:print_triangular_numbers(n) that prints out the first n triangular numbers. A call to print_triangular_numbers(5) would produce the following output:print_triangular_numbers(n) that prints out the first n triangular numbers. A call to print_triangular_numbers(5) would produce the following output:

    (Gợi ý: Sử dụng tìm kiếm web để tìm hiểu số hình tam giác là gì.)

  10. Viết một hàm, is_prime, có một đối số số nguyên duy nhất và trả về true khi đối số là số nguyên tố và sai. Thêm các bài kiểm tra cho các trường hợp như thế này:is_prime, which takes a single integer argument and returns True when the argument is a prime number and False otherwise. Add tests for cases like this:is_prime, which takes a single integer argument and returns True when the argument is a prime number and False otherwise. Add tests for cases like this:

    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

    Trường hợp cuối cùng có thể đại diện cho ngày sinh của bạn. Bạn sinh ra vào một ngày chính? Trong một lớp 100 học sinh, bạn nghĩ có bao nhiêu sinh viên sẽ có ngày sinh chính?

  11. Xem lại vấn đề cướp biển say xỉn từ các bài tập trong Chương 3. Lần này, cướp biển say xỉn thực hiện, và sau đó thực hiện một số bước về phía trướ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 được thực hiện sau lượt. Dữ liệu thử nghiệm của cô là [(160, 20), (-43, 10), (270, 8), (-43, 12)]. Sử dụng một con rùa để vẽ con đường được thực hiện bởi người bạn say rượu của chúng tôi.

  12. Nhiều hình dạng thú vị có thể được vẽ bởi con rùa 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 để tiến về phía trước. Thiết lập một danh sách các cặp để con rùa vẽ một ngôi nhà với một cây thánh giá xuyên qua trung tâm, như thể hiện ở đây. Điều này nên được thực hiện mà không cần vượt qua bất kỳ dòng / cạnh nào nhiều lần và không cần nâng bút của bạn.

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

    Bây giờ đọc bài viết của Wikipedia (http://en.wikipedia.org/wiki/eulerian_path) về các con đường Eulerian. Tìm hiểu làm thế nào để nói ngay lập tức bằng cách kiểm tra xem có thể tìm ra giải pháp hay không. Nếu đường dẫn là có thể, bạn cũng sẽ biết nơi đặt bút của bạn để bắt đầu vẽ, và nơi bạn nên kết thúc!

  14. Num_digits (0) sẽ trả về những gì? Sửa đổi nó để trả về 1 cho trường hợp này. Tại sao một cuộc gọi đến num_digits (-24) dẫn đến một vòng lặp vô hạn? . Thêm các bài kiểm tra sau:num_digits(0) return? Modify it to return 1 for this case. Why does a call to num_digits(-24) result in an infinite loop? (hint: -1//10 evaluates to -1) Modify num_digits so that it works correctly with any integer value. Add these tests:num_digits(0) return? Modify it to return 1 for this case. Why does a call to num_digits(-24) result in an infinite loop? (hint: -1//10 evaluates to -1) Modify num_digits so that it works correctly with any integer value. Add these tests:

    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
  15. Viết một hàm num_even_digits (n) đếm số lượng chữ số chẵn trong n. Những bài kiểm tra này sẽ vượt qua:num_even_digits(n) that counts the number of even digits in n. These tests should pass:num_even_digits(n) that counts the number of even digits in n. These tests should pass:

    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
  16. Viết một hàm sum_of_squares (xs) tính toán tổng các bình phương của các số trong danh sách xs. Ví dụ: sum_of_squares ([2,3,4]) sẽ trả về 4+9+16, đó là 29:sum_of_squares(xs) that computes the sum of the squares of the numbers in the list xs. For example, sum_of_squares([2,3,4]) should return 4+9+16 which is 29:sum_of_squares(xs) that computes the sum of the squares of the numbers in the list xs. For example, sum_of_squares([2, 3, 4]) should return 4+9+16 which is 29:

    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
  17. Bạn và bạn của bạn đang ở trong một đội để viết một trò chơi hai người chơi, con người chống lại máy tính, chẳng hạn như Tic-Tac-Toe / Noughts và 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 nhiều vòng chơi, giữ điểm, quyết định ai chơi, đầu tiên, v.v. Chương trình sẽ phù hợp với nhau và bạn đưa ra giàn giáo đơn giản này (mà bạn của bạn sẽ cải thiện sau):

    >>> w = x + 1
    Traceback (most recent call last):
      File "", line 1, in
    NameError: name 'x' is not defined
    0
    >>> w = x + 1
    Traceback (most recent call last):
      File "", line 1, in
    NameError: name 'x' is not defined
    1
    1. Viết chương trình chính liên tục gọi chức năng này để chơi trò chơi và sau mỗi vòng, nó thông báo kết quả là tôi giành chiến thắng! Sau đó, nó hỏi người chơi “Bạn có muốn chơi lại không?” và chơi một lần nữa, hoặc nói lời tạm biệt, và chấm dứt.
    2. Giữ điểm số có bao nhiêu chiến thắng mà mỗi người chơi đã có, và đã có bao nhiêu lần rút thăm. Sau mỗi vòng chơi, cũng thông báo điểm số.
    3. Thêm logic để người chơi thay phiên nhau chơi trước.
    4. Tính tỷ lệ phần trăm chiến thắng cho con người, trong số tất cả các trò chơi đã chơi. Cũng thông báo điều này vào cuối mỗi vòng.
    5. Vẽ một sơ đồ logic của bạn.

Các tuyên bố lặp lại giải thích với ví dụ là gì?

Các câu lệnh lặp lại gây ra các câu lệnh (hoặc báo cáo hỗn hợp) được thực thi bằng không hoặc nhiều lần, tuân theo một số tiêu chí chấm dứt vòng lặp. Khi các tuyên bố này là các tuyên bố ghép, chúng được thực thi theo thứ tự, ngoại trừ khi câu lệnh Break hoặc câu lệnh tiếp tục gặp phải.cause statements (or compound statements) to be executed zero or more times, subject to some loop-termination criteria. When these statements are compound statements, they are executed in order, except when either the break statement or the continue statement is encountered.cause statements (or compound statements) to be executed zero or more times, subject to some loop-termination criteria. When these statements are compound statements, they are executed in order, except when either the break statement or the continue statement is encountered.

Một tuyên bố lặp lại trong Python là gì?

Các câu lệnh lặp hoặc câu lệnh LOOP cho phép chúng tôi thực thi một khối các câu lệnh miễn là điều kiện là đúng.Các câu lệnh LOOPS được sử dụng khi chúng ta cần chạy cùng một mã, mỗi lần với một giá trị khác nhau.allow us to execute a block of statements as long as the condition is true. Loops statements are used when we need to run same code again and again, each time with a different value.allow us to execute a block of statements as long as the condition is true. Loops statements are used when we need to run same code again and again, each time with a different value.

Lặp đi lặp lại trong Python với ví dụ là gì?

Trình lặp là một đối tượng chứa số lượng giá trị có thể đếm được.Một người lặp là một đối tượng có thể được lặp lại, có nghĩa là bạn có thể đi qua tất cả các giá trị.Về mặt kỹ thuật, trong Python, một iterator là một đối tượng thực hiện giao thức iterator, bao gồm các phương thức __iter __ () và __next __ ().An iterator is an object that can be iterated upon, meaning that you can traverse through all the values. Technically, in Python, an iterator is an object which implements the iterator protocol, which consist of the methods __iter__() and __next__() .An iterator is an object that can be iterated upon, meaning that you can traverse through all the values. Technically, in Python, an iterator is an object which implements the iterator protocol, which consist of the methods __iter__() and __next__() .

Có bao nhiêu tuyên bố lặp lại trong Python?

Có hai cấu trúc lặp chính trong Python: trong khi các vòng và cho các vòng.two main iterative structures in Python: while loops and for loops.two main iterative structures in Python: while loops and for loops.