Tương tự với mã c
Bạn đang tưởng tượng rằng
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
7 của bạn trong Python giống như mã C này:for [int i = 0; i < 10; i++]
if [i == 5]
i += 3;
Nó giống như mã C này:
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
Vì vậy, việc sửa đổi
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8 trong vòng lặp không có tác dụng bạn mong đợi.Ví dụ tháo gỡ
Bạn có thể nhìn vào việc tháo gỡ mã Python để xem điều này:
>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
Phần này tạo ra một phạm vi từ 0 đến 10 và nhận ra nó:
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
Tại thời điểm này, đỉnh của ngăn xếp chứa phạm vi.
Điều này nhận được một trình lặp trên đối tượng trên đỉnh của ngăn xếp, tức là phạm vi:
15 GET_ITER
Tại thời điểm này, đỉnh của ngăn xếp chứa một trình lặp qua phạm vi nhận ra.
For_iter bắt đầu lặp lại trên vòng lặp bằng cách sử dụng trình lặp ở đầu estack:
>> 16 FOR_ITER 36 [to 55]
Tại thời điểm này, phần trên của ngăn xếp chứa giá trị tiếp theo của trình lặp.
Và ở đây bạn có thể thấy rằng đỉnh của ngăn xếp được bật và gán cho
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8: 19 STORE_FAST 0 [i]
Vì vậy,
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8 sẽ bị ghi đè bất kể bạn làm gì trong vòng lặp.Đây là một cái nhìn tổng quan về các máy ngăn xếp nếu bạn chưa thấy điều này trước đây.
Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Đối với các vòng lặp trong Python [Lặp lại xác định] This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: For Loops in Python [Definite Iteration]
Hướng dẫn này sẽ chỉ cho bạn cách thực hiện lần lặp xác định với vòng lặp Python
15 GET_ITER
1.definite iteration with a Python 15 GET_ITER
1 loop.Trong hướng dẫn trước đây trong loạt giới thiệu này, bạn đã học được như sau:
- Việc thực hiện lặp đi lặp lại của cùng một khối mã lặp đi lặp lại được gọi là lặp.iteration.
- Có hai loại lặp:
- Lặp lại xác định, trong đó số lần lặp lại được chỉ định trước iteration, in which the number of repetitions is specified explicitly in advance
- Lặp lại không xác định, trong đó khối mã thực thi cho đến khi một số điều kiện được đáp ứng iteration, in which the code block executes until some condition is met
- Trong Python, lần lặp không xác định được thực hiện với vòng lặp
2.15 GET_ITER
Ở đây, những gì bạn bao gồm trong hướng dẫn này:
Bạn sẽ bắt đầu với việc so sánh một số mô hình khác nhau được sử dụng bởi các ngôn ngữ lập trình để thực hiện lặp lại xác định.
Sau đó, bạn sẽ tìm hiểu về Iterables và Iterators, hai khái niệm tạo thành cơ sở của việc lặp lại xác định trong Python.iterables and iterators, two concepts that form the basis of definite iteration in Python.
-
Cuối cùng, bạn sẽ gắn kết tất cả lại với nhau và tìm hiểu về các vòng lặp Python, ____41.
Một cuộc khảo sát về lặp lại xác định trong lập trình
Các vòng lặp xác định thường được gọi là các vòng
15 GET_ITER
1 vì 15 GET_ITER
1 là từ khóa được sử dụng để giới thiệu chúng trong gần như tất cả các ngôn ngữ lập trình, bao gồm cả Python. 15 GET_ITER
1 loops because 15 GET_ITER
1 is the
keyword that is used to introduce them in nearly all programming languages, including Python.Trong lịch sử, các ngôn ngữ lập trình đã cung cấp một vài hương vị của vòng lặp
15 GET_ITER
1. Đây được mô tả ngắn gọn trong các phần sau.Vòng lặp phạm vi số
Vòng lặp
15 GET_ITER
1 cơ bản nhất là một câu lệnh phạm vi số đơn giản với các giá trị bắt đầu và kết thúc. Định dạng chính xác khác nhau tùy thuộc vào ngôn ngữ nhưng thường trông giống như thế này:for i = 1 to 10
Ở đây, cơ thể của vòng lặp được thực hiện mười lần. Biến
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8 giả định giá trị 15 GET_ITER
9 trên lần lặp thứ nhất, >> 16 FOR_ITER 36 [to 55]
0 trên thứ hai, v.v. Loại vòng 15 GET_ITER
1 này được sử dụng trong các ngôn ngữ Basic, algol và pascal.Vòng lặp ba biểu hiện
Một dạng khác của vòng lặp
15 GET_ITER
1 được phổ biến bởi ngôn ngữ lập trình C chứa ba phần:- Một khởi tạo
- Một biểu thức chỉ định một điều kiện kết thúc
- Một hành động được thực hiện ở cuối mỗi lần lặp.
Loại vòng lặp này có hình thức sau:
for [i = 1; i > 16 FOR_ITER 36 [to 55]
5. 3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8 bằng 15 GET_ITER
9 sau mỗi lần lặp lại vòng lặp.Các vòng lặp ba biểu hiện
15 GET_ITER
1 rất phổ biến vì các biểu thức được chỉ định cho ba phần có thể là gần như mọi thứ, vì vậy điều này có độ linh hoạt hơn một chút so với dạng phạm vi số đơn giản hơn được hiển thị ở trên. Các vòng lặp 15 GET_ITER
1 này cũng được giới thiệu trong các ngôn ngữ C ++, Java, PHP và Perl.Vòng lặp dựa trên bộ sưu tập hoặc dựa trên vòng lặp
Loại vòng lặp này lặp lại trên một tập hợp các đối tượng, thay vì chỉ định các giá trị hoặc điều kiện số:
for i in
Mỗi lần thông qua vòng lặp, biến
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8 có giá trị của đối tượng tiếp theo trong 19 STORE_FAST 0 [i]
1. Loại vòng 15 GET_ITER
1 này được cho là tổng quát và trừu tượng nhất. Perl và PHP cũng hỗ trợ loại vòng lặp này, nhưng nó được giới thiệu bởi từ khóa 19 STORE_FAST 0 [i]
3 thay vì 15 GET_ITER
1.Vòng lặp Python 15 GET_ITER
1
15 GET_ITER
Trong số các loại vòng được liệt kê ở trên, Python chỉ thực hiện lần lặp lại cuối cùng: Lặp lại dựa trên bộ sưu tập. Lúc đầu, điều đó có vẻ như là một thỏa thuận thô, nhưng hãy yên tâm rằng việc thực hiện Python, việc lặp lại xác định rất linh hoạt đến nỗi bạn đã giành được cảm giác bị lừa!
Một thời gian ngắn, bạn sẽ đào sâu vào các ruột của Python từ
15 GET_ITER
1 một cách chi tiết. Nhưng bây giờ, hãy để bắt đầu với một nguyên mẫu và ví dụ nhanh chóng, chỉ để làm quen.Vòng lặp Python từ
15 GET_ITER
1 trông như thế này:int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
0 19 STORE_FAST 0 [i]
8 là một tập hợp các đối tượng, ví dụ, một danh sách hoặc tuple. 19 STORE_FAST 0 [i]
9 trong thân vòng được biểu thị bằng vết lõm, như với tất cả các cấu trúc điều khiển Python và được thực hiện một lần cho mỗi mục trong 19 STORE_FAST 0 [i]
8. Biến vòng lặp for i = 1 to 10
1 có giá trị của phần tử tiếp theo trong 19 STORE_FAST 0 [i]
8 mỗi lần thông qua vòng lặp.Đây là một ví dụ đại diện:
>>>
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
1Trong ví dụ này,
19 STORE_FAST 0 [i]
8 là danh sách for i = 1 to 10
4 và for i = 1 to 10
1 là biến 3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8. Mỗi lần thông qua vòng lặp, 3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
8 đảm nhận một mục liên tiếp trong for i = 1 to 10
4, do đó for i = 1 to 10
9 hiển thị các giá trị for [i = 1; i def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
0Vòng lặp này có thể được mô tả hoàn toàn theo các khái niệm bạn vừa biết. Để thực hiện lần lặp lại vòng lặp
15 GET_ITER
1 này mô tả, Python làm như sau:Gọi
for [i = 1; i >>>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
1Vòng lặp này có thể được mô tả hoàn toàn theo các khái niệm bạn vừa biết. Để thực hiện lần lặp lại vòng lặp
15 GET_ITER
1 này mô tả, Python làm như sau:>>>
>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
2Vòng lặp này có thể được mô tả hoàn toàn theo các khái niệm bạn vừa biết. Để thực hiện lần lặp lại vòng lặp
15 GET_ITER
1 này mô tả, Python làm như sau:
>>>
>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
3Vòng lặp này có thể được mô tả hoàn toàn theo các khái niệm bạn vừa biết. Để thực hiện lần lặp lại vòng lặp
15 GET_ITER
1 này mô tả, Python làm như sau:>>>
>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
4Vòng lặp này có thể được mô tả hoàn toàn theo các khái niệm bạn vừa biết. Để thực hiện lần lặp lại vòng lặp
15 GET_ITER
1 này mô tả, Python làm như sau:>>>
>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
5
Vòng lặp này có thể được mô tả hoàn toàn theo các khái niệm bạn vừa biết. Để thực hiện lần lặp lại vòng lặp 15 GET_ITER
1 này mô tả, Python làm như sau:
15 GET_ITER
Gọi
for [i = 1; i >>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
6Vòng lặp này có thể được mô tả hoàn toàn theo các khái niệm bạn vừa biết. Để thực hiện lần lặp lại vòng lặp
15 GET_ITER
1 này mô tả, Python làm như sau:Gọi
for [i = 1; i >>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
7Lưu ý rằng
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
28 trả về một đối tượng của lớp int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
38, không phải là danh sách hoặc tuple của các giá trị. Bởi vì một đối tượng int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
38 là một điều có thể đi được, bạn có thể thu được các giá trị bằng cách lặp lại chúng bằng một vòng lặp 15 GET_ITER
1:>>>
>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
8Bạn cũng có thể lấy tất cả các giá trị cùng một lúc với
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
01 hoặc int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
03. Trong một phiên thay thế, đó có thể là một cách thuận tiện để nhanh chóng hiển thị các giá trị là gì:>>>
>>> from dis import dis
>>> def foo[]:
... for i in range [0,10]:
... if i==5:
... i+=3
... print i
...
>>> dis[foo]
2 0 SETUP_LOOP 53 [to 56]
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
15 GET_ITER
>> 16 FOR_ITER 36 [to 55]
19 STORE_FAST 0 [i]
3 22 LOAD_FAST 0 [i]
25 LOAD_CONST 3 [5]
28 COMPARE_OP 2 [==]
31 POP_JUMP_IF_FALSE 47
4 34 LOAD_FAST 0 [i]
37 LOAD_CONST 4 [3]
40 INPLACE_ADD
41 STORE_FAST 0 [i]
44 JUMP_FORWARD 0 [to 47]
5 >> 47 LOAD_FAST 0 [i]
50 PRINT_ITEM
51 PRINT_NEWLINE
52 JUMP_ABSOLUTE 16
>> 55 POP_BLOCK
>> 56 LOAD_CONST 0 [None]
59 RETURN_VALUE
>>>
9Tuy nhiên, khi
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
28 được sử dụng trong mã là một phần của ứng dụng lớn hơn, nó thường được coi là thực hành kém để sử dụng int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
01 hoặc int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
03 theo cách này. Giống như trình lặp, các đối tượng int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
38 là lười biếng, các giá trị trong phạm vi được chỉ định không được tạo cho đến khi chúng được yêu cầu. Sử dụng int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
01 hoặc int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
03 trên đối tượng int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
38 buộc tất cả các giá trị sẽ được trả về cùng một lúc. Điều này hiếm khi cần thiết, và nếu danh sách dài, nó có thể lãng phí thời gian và trí nhớ.int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
50 trả về một số lượng có thể mang lại số nguyên bắt đầu bằng int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
51, cho đến nhưng không bao gồm int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
36. Nếu được chỉ định, int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
53 cho biết số lượng bỏ qua giữa các giá trị [tương tự với giá trị sải chân được sử dụng cho chuỗi và cắt danh sách]:>>>
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
0Nếu
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
53 bị bỏ qua, nó mặc định là 15 GET_ITER
9:
>>>
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
1Tất cả các tham số được chỉ định cho
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
28 phải là số nguyên, nhưng bất kỳ tham số nào có thể âm. Đương nhiên, nếu int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
51 lớn hơn int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
36, int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
53 phải âm [nếu bạn muốn có bất kỳ kết quả nào]:>>>
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
2
Thay đổi hành vi vòng lặp 15 GET_ITER
1
15 GET_ITER
Bạn đã thấy trong hướng dẫn trước đây trong loạt giới thiệu này làm thế nào việc thực hiện vòng lặp
15 GET_ITER
2 có thể bị gián đoạn với các câu lệnh int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
62 và int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
63 và được sửa đổi bằng mệnh đề int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
64. Những khả năng này cũng có sẵn với vòng lặp 15 GET_ITER
1.Các câu lệnh int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
62 và int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
63
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
62 và int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
63 hoạt động theo cùng một cách với các vòng 15 GET_ITER
1 như với các vòng 15 GET_ITER
2. int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
62 chấm dứt hoàn toàn vòng lặp và tiến hành câu lệnh đầu tiên sau vòng lặp:>>>
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
3int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
63 chấm dứt lần lặp hiện tại và tiến hành lần lặp tiếp theo:
>>>
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
4Điều khoản int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
64
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
Một vòng lặp
15 GET_ITER
1 cũng có thể có mệnh đề int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
64. Việc giải thích tương tự như vòng lặp 15 GET_ITER
2. Điều khoản int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
64 sẽ được thực thi nếu vòng lặp chấm dứt thông qua sự kiệt sức của điều đó:>>>
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
5Điều khoản
int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
64 won won được thực thi nếu danh sách bị phá vỡ bằng tuyên bố int r[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for [int j = 0; j < sizeof[r]/sizeof[r[0]]; j++] {
int i = r[j];
if [i == 5]
i += 3;
}
62:>>>
3 LOAD_GLOBAL 0 [range]
6 LOAD_CONST 1 [0]
9 LOAD_CONST 2 [10]
12 CALL_FUNCTION 2
6Sự kết luận
Hướng dẫn này đã trình bày vòng lặp
15 GET_ITER
1, công việc của sự lặp lại xác định trong Python.definite iteration in Python.Bạn cũng đã tìm hiểu về các hoạt động bên trong của các phép lặp và lặp, hai loại đối tượng quan trọng làm nền tảng cho phép lặp xác định, nhưng cũng nổi bật trong một loạt các mã Python khác.iterables and iterators, two important object types that underlie definite iteration, but also figure prominently in a wide variety of other Python code.
Trong hai hướng dẫn tiếp theo trong chuỗi giới thiệu này, bạn sẽ chuyển bánh răng một chút và khám phá cách các chương trình Python có thể tương tác với người dùng thông qua đầu vào từ bàn phím và đầu ra vào bảng điều khiển.input from the keyboard and output to the console.
Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Đối với các vòng lặp trong Python [Lặp lại xác định] This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: For Loops in Python [Definite Iteration]