Cách xuống dòng trong python mà không cần chạy chương trình

Câu lệnh ghép chứa (nhóm) câu lệnh khác; . Nói chung, các câu lệnh ghép kéo dài trên nhiều dòng, mặc dù trong các phiên bản đơn giản, toàn bộ câu lệnh ghép có thể được chứa trong một dòng

Các câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
2,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
3 và
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
4 thực hiện các cấu trúc luồng điều khiển truyền thống.
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5 chỉ định các trình xử lý ngoại lệ và/hoặc mã dọn dẹp cho một nhóm câu lệnh, trong khi câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
6 cho phép thực thi mã khởi tạo và hoàn thiện xung quanh một khối mã. Các định nghĩa hàm và lớp cũng là các câu lệnh ghép về mặt cú pháp

Một câu lệnh ghép bao gồm một hoặc nhiều ‘mệnh đề. ' Một mệnh đề bao gồm một tiêu đề và một 'bộ. ' Các tiêu đề mệnh đề của một câu lệnh ghép cụ thể đều ở cùng một mức thụt đầu dòng. Mỗi tiêu đề mệnh đề bắt đầu bằng một từ khóa xác định duy nhất và kết thúc bằng dấu hai chấm. Một bộ là một nhóm các câu lệnh được điều khiển bởi một mệnh đề. Một bộ có thể là một hoặc nhiều câu lệnh đơn giản được phân tách bằng dấu chấm phẩy trên cùng một dòng với tiêu đề, theo sau dấu hai chấm của tiêu đề hoặc nó có thể là một hoặc nhiều câu lệnh thụt lề trên các dòng tiếp theo. Chỉ dạng sau của bộ mới có thể chứa các câu lệnh ghép lồng nhau;

if test1: if test2: print(x)

Cũng lưu ý rằng dấu chấm phẩy liên kết chặt chẽ hơn dấu hai chấm trong ngữ cảnh này, do đó, trong ví dụ sau, tất cả hoặc không lệnh gọi nào của

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
9 được thực thi

if x < y < z: print(x); print(y); print(z)

tổng kết

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
0

Lưu ý rằng các câu lệnh luôn kết thúc bằng

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
10 có thể theo sau là
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
11. Cũng lưu ý rằng các mệnh đề tiếp tục tùy chọn luôn bắt đầu bằng một từ khóa không thể bắt đầu một câu lệnh, do đó không có sự mơ hồ (vấn đề 'Dangling
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8' được giải quyết trong Python bằng cách yêu cầu các câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
2 lồng nhau phải được thụt vào)

Định dạng của các quy tắc ngữ pháp trong các phần sau đặt mỗi mệnh đề trên một dòng riêng biệt cho rõ ràng

8. 1. Câu lệnh for_stmt ::= "for" target_list "in" starred_list ":" suite ["else" ":" suite] 2¶

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
2 được sử dụng để thực hiện điều kiện

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
7

Nó chọn chính xác một trong các bộ bằng cách đánh giá từng biểu thức cho đến khi một biểu thức được tìm thấy là đúng (xem phần Các phép toán Boolean cho . Nếu tất cả các biểu thức là sai, bộ mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8, nếu có, được thực thi.

8. 2. Câu lệnh for_stmt ::= "for" target_list "in" starred_list ":" suite ["else" ":" suite] 3¶

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
3 được sử dụng để thực hiện lặp lại miễn là một biểu thức là đúng

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
2

Điều này lặp đi lặp lại kiểm tra biểu thức và, nếu nó đúng, sẽ thực thi bộ đầu tiên;

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
41 được thực thi trong bộ đầu tiên chấm dứt vòng lặp mà không thực thi bộ của mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8. Một câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
43 được thực thi trong bộ đầu tiên bỏ qua phần còn lại của bộ và quay lại kiểm tra biểu thức

8. 3. Câu lệnh for_stmt ::= "for" target_list "in" starred_list ":" suite ["else" ":" suite] 4¶

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
4 được sử dụng để lặp qua các phần tử của chuỗi (chẳng hạn như chuỗi, bộ hoặc danh sách) hoặc đối tượng có thể lặp khác

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]

Biểu thức

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
46 được đánh giá một lần; . Một iterable object. An iterator được tạo cho iterable đó. Sau đó, mục đầu tiên do trình vòng lặp cung cấp được gán cho danh sách đích bằng cách sử dụng các quy tắc chuẩn cho phép gán (xem Các câu lệnh gán ) và bộ được thực thi. Điều này lặp lại cho mỗi mục được cung cấp bởi iterator. Khi bộ vòng lặp cạn kiệt, bộ trong mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8, nếu có, sẽ được thực thi và vòng lặp kết thúc.

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
41 được thực thi trong bộ đầu tiên chấm dứt vòng lặp mà không thực thi bộ của mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8. Câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
43 được thực hiện trong bộ đầu tiên bỏ qua phần còn lại của bộ và tiếp tục với mục tiếp theo hoặc với mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8 nếu không có mục tiếp theo

Vòng lặp for thực hiện gán cho các biến trong danh sách đích. Thao tác này sẽ ghi đè lên tất cả các phép gán trước đó cho các biến đó, bao gồm cả các phép gán được thực hiện trong bộ vòng lặp for

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
1

Các tên trong danh sách đích không bị xóa khi vòng lặp kết thúc, nhưng nếu chuỗi trống, chúng sẽ hoàn toàn không được gán bởi vòng lặp. Dấu. hàm dựng sẵn

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
72 trả về một trình vòng lặp gồm các số nguyên phù hợp để mô phỏng hiệu ứng của
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
73 của Pascal; . g. ,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
74 trả về danh sách
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
75

Đã thay đổi trong phiên bản 3. 11. Các phần tử được gắn dấu sao hiện được cho phép trong danh sách biểu thức.

8. 4. Câu lệnh for_stmt ::= "for" target_list "in" starred_list ":" suite ["else" ":" suite] 5¶

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5 chỉ định trình xử lý ngoại lệ và/hoặc mã dọn dẹp cho một nhóm câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
4

Thông tin bổ sung về ngoại lệ có thể được tìm thấy trong phần Ngoại lệ và thông tin về cách sử dụng câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
78 để tạo ngoại lệ có thể được tìm thấy trong phần < . The raise statement.

8. 4. 1. ______379 mệnh đề¶

(Các) mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 chỉ định một hoặc nhiều trình xử lý ngoại lệ. Khi không có ngoại lệ xảy ra trong mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5, không có trình xử lý ngoại lệ nào được thực thi. Khi một ngoại lệ xảy ra trong bộ
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5, quá trình tìm kiếm một trình xử lý ngoại lệ được bắt đầu. Tìm kiếm này lần lượt kiểm tra các mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 cho đến khi tìm thấy một mệnh đề phù hợp với ngoại lệ. Mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 không biểu thức, nếu có, phải ở cuối; . Đối với mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 có biểu thức, biểu thức đó được đánh giá và mệnh đề khớp với ngoại lệ nếu đối tượng kết quả là "tương thích" với ngoại lệ. Một đối tượng tương thích với một ngoại lệ nếu đối tượng đó là lớp hoặc một lớp cơ sở không ảo của đối tượng ngoại lệ hoặc một bộ chứa một mục mà .

Nếu không có mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 nào khớp với ngoại lệ, quá trình tìm kiếm trình xử lý ngoại lệ sẽ tiếp tục trong mã xung quanh và trên ngăn xếp yêu cầu. 1

Nếu việc đánh giá một biểu thức trong tiêu đề của mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 làm phát sinh một ngoại lệ, thì tìm kiếm ban đầu cho một trình xử lý sẽ bị hủy và bắt đầu tìm kiếm ngoại lệ mới trong mã xung quanh và trên ngăn xếp cuộc gọi (nó được xử lý như thể toàn bộ

Khi tìm thấy mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 phù hợp, ngoại lệ được gán cho mục tiêu được chỉ định sau từ khóa
if x < y < z: print(x); print(y); print(z)
00 trong mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 đó, nếu có và bộ của mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 được thực thi. Tất cả các mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 phải có một khối thực thi. Khi kết thúc khối này, việc thực thi tiếp tục bình thường sau toàn bộ câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5. (Điều này có nghĩa là nếu tồn tại hai trình xử lý lồng nhau cho cùng một ngoại lệ và ngoại lệ xảy ra trong mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5 của trình xử lý bên trong, thì trình xử lý bên ngoài sẽ không xử lý ngoại lệ đó. )

Khi một ngoại lệ đã được gán bằng cách sử dụng

if x < y < z: print(x); print(y); print(z)
06, nó sẽ bị xóa ở cuối mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79. Điều này như thể

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
7

đã được dịch sang

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5

Điều này có nghĩa là ngoại lệ phải được gán cho một tên khác để có thể tham chiếu đến nó sau mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79. Các ngoại lệ bị xóa vì với truy nguyên được đính kèm, chúng tạo thành một chu kỳ tham chiếu với khung ngăn xếp, giữ cho tất cả các cục bộ trong khung đó tồn tại cho đến khi bộ sưu tập rác tiếp theo xảy ra

Trước khi bộ mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 được thực thi, thông tin chi tiết về ngoại lệ được lưu trữ trong mô-đun
if x < y < z: print(x); print(y); print(z)
10 và có thể được truy cập qua
if x < y < z: print(x); print(y); print(z)
11.
if x < y < z: print(x); print(y); print(z)
11 trả về 3-tuple bao gồm lớp ngoại lệ, thể hiện ngoại lệ và đối tượng truy nguyên (xem phần Hệ thống phân cấp loại tiêu chuẩn ) xác định điểm trong . Chi tiết về ngoại lệ được truy cập qua
if x < y < z: print(x); print(y); print(z)
11 được khôi phục về giá trị trước đó khi thoát khỏi trình xử lý ngoại lệ.

if x < y < z: print(x); print(y); print(z)
0

8. 4. 2. ______914 khoản¶

(Các) mệnh đề

if x < y < z: print(x); print(y); print(z)
14 được sử dụng để xử lý các
if x < y < z: print(x); print(y); print(z)
16. Loại ngoại lệ để khớp được hiểu như trong trường hợp của
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79, nhưng trong trường hợp nhóm ngoại lệ, chúng ta có thể khớp một phần khi loại khớp với một số ngoại lệ trong nhóm. Điều này có nghĩa là nhiều mệnh đề
if x < y < z: print(x); print(y); print(z)
14 có thể thực thi, mỗi mệnh đề xử lý một phần của nhóm ngoại lệ. Mỗi mệnh đề thực thi nhiều nhất một lần và xử lý một nhóm ngoại lệ gồm tất cả các ngoại lệ phù hợp. Mỗi ngoại lệ trong nhóm được xử lý bởi nhiều nhất một mệnh đề
if x < y < z: print(x); print(y); print(z)
14, mệnh đề đầu tiên phù hợp với nó

if x < y < z: print(x); print(y); print(z)
1

Mọi ngoại lệ còn lại không được xử lý bởi bất kỳ mệnh đề

if x < y < z: print(x); print(y); print(z)
14 nào sẽ được nêu lại ở cuối, được kết hợp thành một nhóm ngoại lệ cùng với tất cả các ngoại lệ đã được đưa ra từ trong các mệnh đề
if x < y < z: print(x); print(y); print(z)
14

Nếu ngoại lệ được đưa ra không phải là một nhóm ngoại lệ và loại của nó khớp với một trong các mệnh đề

if x < y < z: print(x); print(y); print(z)
14, thì nó sẽ bị một nhóm ngoại lệ bắt và bao bọc bằng một chuỗi thông báo trống

if x < y < z: print(x); print(y); print(z)
2

Mệnh đề

if x < y < z: print(x); print(y); print(z)
14 phải có loại phù hợp và loại này không thể là lớp con của
if x < y < z: print(x); print(y); print(z)
24. Không thể trộn lẫn
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 và
if x < y < z: print(x); print(y); print(z)
14 trong cùng một
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5.
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
41,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
43 và
if x < y < z: print(x); print(y); print(z)
30 không thể xuất hiện trong mệnh đề
if x < y < z: print(x); print(y); print(z)
14

8. 4. 3. ______08 mệnh đề¶

Mệnh đề tùy chọn

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8 được thực thi nếu luồng điều khiển rời khỏi bộ
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5, không có ngoại lệ nào được đưa ra và không có câu lệnh
if x < y < z: print(x); print(y); print(z)
30,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
43 hoặc
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
41 nào được thực thi. Các ngoại lệ trong mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8 không được xử lý bởi mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 trước đó

8. 4. 4. ____940 điều khoản¶

Nếu có

if x < y < z: print(x); print(y); print(z)
40, nó chỉ định trình xử lý 'dọn dẹp'. Mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5 được thực hiện, bao gồm mọi mệnh đề
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79 và
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8. Nếu một ngoại lệ xảy ra trong bất kỳ mệnh đề nào và không được xử lý, thì ngoại lệ đó sẽ được lưu tạm thời. Mệnh đề
if x < y < z: print(x); print(y); print(z)
40 được thực thi. Nếu có một ngoại lệ đã lưu, nó sẽ được kích hoạt lại ở cuối mệnh đề
if x < y < z: print(x); print(y); print(z)
40. Nếu mệnh đề
if x < y < z: print(x); print(y); print(z)
40 đưa ra một ngoại lệ khác, ngoại lệ đã lưu sẽ được đặt làm ngữ cảnh của ngoại lệ mới. Nếu mệnh đề
if x < y < z: print(x); print(y); print(z)
40 thực thi câu lệnh
if x < y < z: print(x); print(y); print(z)
30,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
41 hoặc
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
43, thì ngoại lệ đã lưu sẽ bị loại bỏ

if x < y < z: print(x); print(y); print(z)
3

Thông tin ngoại lệ không có sẵn cho chương trình trong khi thực hiện mệnh đề

if x < y < z: print(x); print(y); print(z)
40

Khi một câu lệnh

if x < y < z: print(x); print(y); print(z)
30,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
41 hoặc
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
43 được thực thi trong bộ
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5 của câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5…_______940, thì mệnh đề
if x < y < z: print(x); print(y); print(z)
40 cũng được thực thi ‘on the way out. ’

Giá trị trả về của hàm được xác định bởi câu lệnh

if x < y < z: print(x); print(y); print(z)
30 cuối cùng được thực thi. Vì mệnh đề
if x < y < z: print(x); print(y); print(z)
40 luôn thực thi nên câu lệnh
if x < y < z: print(x); print(y); print(z)
30 được thực thi trong mệnh đề
if x < y < z: print(x); print(y); print(z)
40 sẽ luôn là câu lệnh được thực thi cuối cùng

if x < y < z: print(x); print(y); print(z)
4

Đã thay đổi trong phiên bản 3. 8. Trước Python 3. 8, một câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
43 là bất hợp pháp trong mệnh đề
if x < y < z: print(x); print(y); print(z)
40 do có vấn đề với việc triển khai.

8. 5. Câu lệnh for_stmt ::= "for" target_list "in" starred_list ":" suite ["else" ":" suite] 6¶

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
6 được sử dụng để bọc việc thực thi một khối bằng các phương thức được xác định bởi trình quản lý ngữ cảnh (xem phần Với Trình quản lý ngữ cảnh câu lệnh ). Điều này cho phép đóng gói các kiểu sử dụng chung của
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5…______379…______940 để tái sử dụng thuận tiện.

if x < y < z: print(x); print(y); print(z)
5

Việc thực thi câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
6 với một “mục” diễn ra như sau

  1. Biểu thức ngữ cảnh (biểu thức được đưa ra trong

    if x < y < z: print(x); print(y); print(z)
    
    72) được đánh giá để có được trình quản lý ngữ cảnh

  2. if x < y < z: print(x); print(y); print(z)
    
    73 của trình quản lý ngữ cảnh được tải để sử dụng sau

  3. if x < y < z: print(x); print(y); print(z)
    
    74 của trình quản lý bối cảnh được tải để sử dụng sau

  4. Phương thức

    if x < y < z: print(x); print(y); print(z)
    
    73 của trình quản lý bối cảnh được gọi

  5. Nếu một mục tiêu được bao gồm trong câu lệnh

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    6, thì giá trị trả về từ
    if x < y < z: print(x); print(y); print(z)
    
    73 được gán cho nó

    Ghi chú

    Câu lệnh

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    6 đảm bảo rằng nếu phương thức
    if x < y < z: print(x); print(y); print(z)
    
    73 trả về mà không có lỗi, thì
    if x < y < z: print(x); print(y); print(z)
    
    74 sẽ luôn được gọi. Do đó, nếu một lỗi xảy ra trong quá trình gán cho danh sách đích, nó sẽ được xử lý giống như một lỗi xảy ra trong bộ sẽ được xử lý. Xem bước 6 bên dưới

  6. Bộ được thực hiện

  7. Phương thức

    if x < y < z: print(x); print(y); print(z)
    
    74 của trình quản lý bối cảnh được gọi. Nếu một ngoại lệ khiến bộ phần mềm bị thoát, loại, giá trị và dấu vết của nó sẽ được chuyển thành đối số cho
    if x < y < z: print(x); print(y); print(z)
    
    74. Mặt khác, ba đối số
    if x < y < z: print(x); print(y); print(z)
    
    83 được cung cấp

    Nếu bộ phần mềm đã bị thoát do một ngoại lệ và giá trị trả về từ phương thức

    if x < y < z: print(x); print(y); print(z)
    
    74 là sai, thì ngoại lệ đó sẽ được kích hoạt lại. Nếu giá trị trả về là true, ngoại lệ sẽ bị chặn và quá trình thực thi tiếp tục với câu lệnh theo sau câu lệnh
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    6

    Nếu bộ phần mềm đã bị thoát vì bất kỳ lý do nào khác ngoài ngoại lệ, thì giá trị trả về từ

    if x < y < z: print(x); print(y); print(z)
    
    74 sẽ bị bỏ qua và quá trình thực thi sẽ tiếp tục ở vị trí bình thường đối với loại lần thoát đã được thực hiện

Đoạn mã sau

if x < y < z: print(x); print(y); print(z)
6

về mặt ngữ nghĩa tương đương với

if x < y < z: print(x); print(y); print(z)
7

Với nhiều mục, trình quản lý ngữ cảnh được xử lý như thể nhiều câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
6 được lồng vào nhau

if x < y < z: print(x); print(y); print(z)
8

về mặt ngữ nghĩa tương đương với

if x < y < z: print(x); print(y); print(z)
9

Bạn cũng có thể viết trình quản lý bối cảnh nhiều mục trong nhiều dòng nếu các mục được bao quanh bởi dấu ngoặc đơn. Ví dụ

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
00

Đã thay đổi trong phiên bản 3. 1. Hỗ trợ nhiều biểu thức ngữ cảnh.

Đã thay đổi trong phiên bản 3. 10. Hỗ trợ sử dụng dấu ngoặc đơn nhóm để ngắt câu lệnh trong nhiều dòng.

Xem thêm

PEP 343 - Câu lệnh “với”

Thông số kỹ thuật, nền tảng và ví dụ cho câu lệnh Python

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
6

8. 6. Câu lệnh if x < y < z: print(x); print(y); print(z) 89¶

Mới trong phiên bản 3. 10

Câu lệnh match được sử dụng để so khớp mẫu. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
01

Ghi chú

Phần này sử dụng dấu nháy đơn để biểu thị từ khóa mềm .

Khớp mẫu lấy một mẫu làm đầu vào (theo sau

if x < y < z: print(x); print(y); print(z)
90) và một giá trị chủ thể (theo sau
if x < y < z: print(x); print(y); print(z)
89). Mẫu (có thể chứa các mẫu con) được khớp với giá trị chủ đề. kết quả là

  • Thành công hay thất bại của trận đấu (còn được gọi là thành công hay thất bại của mẫu)

  • Có thể ràng buộc các giá trị phù hợp với một tên. Các điều kiện tiên quyết cho điều này được thảo luận thêm dưới đây

Từ khóa

if x < y < z: print(x); print(y); print(z)
89 và
if x < y < z: print(x); print(y); print(z)
90 là từ khóa mềm .

Xem thêm

  • PEP 634 – So khớp mẫu cấu trúc. Sự chỉ rõ

  • PEP 636 – So khớp mẫu cấu trúc. hướng dẫn

8. 6. 1. Tổng quan¶

Dưới đây là tổng quan về luồng logic của câu lệnh so khớp

  1. Biểu thức chủ đề

    if x < y < z: print(x); print(y); print(z)
    
    94 được đánh giá và thu được giá trị chủ đề. Nếu biểu thức chủ đề chứa dấu phẩy, thì một bộ được tạo bằng cách sử dụng các quy tắc chuẩn .

  2. Mỗi mẫu trong

    if x < y < z: print(x); print(y); print(z)
    
    95 được cố gắng khớp với giá trị chủ thể. Các quy tắc cụ thể để thành công hay thất bại được mô tả dưới đây. Nỗ lực đối sánh cũng có thể liên kết một số hoặc tất cả các tên độc lập trong mẫu. Các quy tắc ràng buộc mẫu chính xác khác nhau tùy theo loại mẫu và được chỉ định bên dưới. Các liên kết tên được thực hiện trong quá trình khớp mẫu thành công tồn tại lâu hơn khối được thực thi và có thể được sử dụng sau câu lệnh khớp

    Ghi chú

    Trong quá trình khớp mẫu không thành công, một số mẫu phụ có thể thành công. Không dựa vào các ràng buộc được thực hiện cho một trận đấu không thành công. Ngược lại, đừng dựa vào các biến vẫn không thay đổi sau khi khớp không thành công. Hành vi chính xác phụ thuộc vào việc triển khai và có thể thay đổi. Đây là một quyết định có chủ ý được thực hiện để cho phép các triển khai khác nhau thêm tối ưu hóa

  3. Nếu mẫu thành công, bộ bảo vệ tương ứng (nếu có) được đánh giá. Trong trường hợp này, tất cả các ràng buộc tên được đảm bảo đã xảy ra

    • Nếu người bảo vệ đánh giá là đúng hoặc bị thiếu, thì

      if x < y < z: print(x); print(y); print(z)
      
      96 bên trong
      if x < y < z: print(x); print(y); print(z)
      
      95 được thực thi

    • Mặt khác,

      if x < y < z: print(x); print(y); print(z)
      
      95 tiếp theo được thử như mô tả ở trên

    • Nếu không có khối trường hợp nào nữa, câu lệnh so khớp được hoàn thành

Ghi chú

Người dùng thường không bao giờ nên dựa vào một mẫu được đánh giá. Tùy thuộc vào việc triển khai, trình thông dịch có thể lưu trữ các giá trị hoặc sử dụng các tối ưu hóa khác để bỏ qua các đánh giá lặp lại

Một tuyên bố đối sánh mẫu

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
02

Trong trường hợp này,

if x < y < z: print(x); print(y); print(z)
99 là một người bảo vệ. Đọc thêm về điều đó trong phần tiếp theo

8. 6. 2. Người bảo vệ¶

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
03

Một

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
000 (là một phần của ________ 990) phải thành công để mã bên trong khối ________ 990 thực thi. Nó có dạng.
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
2 theo sau là một biểu thức

Luồng hợp lý của khối ________ 990 với ________ 1000 người theo dõi

  1. Kiểm tra xem mẫu trong khối

    if x < y < z: print(x); print(y); print(z)
    
    90 đã thành công chưa. Nếu mẫu không thành công,
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    000 không được đánh giá và khối
    if x < y < z: print(x); print(y); print(z)
    
    90 tiếp theo được chọn

  2. Nếu mẫu thành công, hãy đánh giá

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    000

    • Nếu điều kiện

      for_stmt ::=  "for" target_list "in" starred_list ":" suite
                    ["else" ":" suite]
      
      000 đánh giá là đúng, thì khối trường hợp được chọn

    • Nếu điều kiện

      for_stmt ::=  "for" target_list "in" starred_list ":" suite
                    ["else" ":" suite]
      
      000 đánh giá là sai, khối trường hợp không được chọn

    • Nếu

      for_stmt ::=  "for" target_list "in" starred_list ":" suite
                    ["else" ":" suite]
      
      000 đưa ra một ngoại lệ trong quá trình đánh giá, thì ngoại lệ đó sẽ nổi lên

Các lính canh được phép có tác dụng phụ vì chúng là biểu thức. Đánh giá bảo vệ phải tiến hành từ khối trường hợp đầu tiên đến khối trường hợp cuối cùng, từng khối một, bỏ qua các khối trường hợp có (các) mẫu không phải tất cả đều thành công. (TÔI. e. , đánh giá bảo vệ phải xảy ra theo thứ tự. ) Quá trình đánh giá bảo vệ phải dừng lại sau khi khối trường hợp được chọn

8. 6. 3. Khối trường hợp không thể bác bỏ¶

Khối trường hợp không thể bác bỏ là khối trường hợp khớp tất cả. Một câu lệnh khớp có thể có nhiều nhất một khối trường hợp không thể bác bỏ và nó phải là khối cuối cùng

Một khối trường hợp được coi là không thể bác bỏ nếu nó không có bộ phận bảo vệ và mẫu của nó là không thể bác bỏ. Một mẫu được coi là không thể bác bỏ nếu chúng ta có thể chứng minh chỉ từ cú pháp của nó rằng nó sẽ luôn thành công. Chỉ có các mẫu sau là không thể chê vào đâu được

  • Các mẫu AS có vế trái không thể bác bỏ

  • Mẫu HOẶC chứa ít nhất một mẫu không thể bác bỏ

  • Chụp mẫu

  • Mẫu ký tự đại diện

  • các mẫu không thể bác bỏ trong ngoặc đơn

8. 6. 4. Mẫu¶

Ghi chú

Phần này sử dụng các ký hiệu ngữ pháp ngoài EBNF tiêu chuẩn

Cú pháp cấp cao nhất cho

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
016 là

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
04

Các mô tả bên dưới sẽ bao gồm một mô tả “bằng thuật ngữ đơn giản” về chức năng của một mẫu nhằm mục đích minh họa (ghi công cho Raymond Hettinger cho một tài liệu đã truyền cảm hứng cho hầu hết các mô tả). Lưu ý rằng những mô tả này hoàn toàn nhằm mục đích minh họa và có thể không phản ánh việc triển khai cơ bản. Hơn nữa, chúng không bao gồm tất cả các hình thức hợp lệ

8. 6. 4. 1. Mẫu HOẶC¶

Mẫu OR là hai hoặc nhiều mẫu được phân tách bằng các thanh dọc

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
017. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
05

Chỉ mẫu con cuối cùng mới có thể không thể bác bỏ và mỗi mẫu con phải liên kết cùng một nhóm tên để tránh sự mơ hồ.

Một mẫu OR lần lượt khớp từng mẫu con của nó với giá trị chủ thể, cho đến khi một mẫu thành công. Mẫu OR sau đó được coi là thành công. Mặt khác, nếu không có mẫu con nào thành công, mẫu OR sẽ thất bại

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
018 sẽ cố gắng khớp với
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
019, nếu thất bại, nó sẽ cố gắng khớp với
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
020, thành công ngay lập tức nếu thành công, nếu không thì thất bại

8. 6. 4. 2. Mẫu AS¶

Mẫu AS khớp với mẫu OR ở bên trái của từ khóa

if x < y < z: print(x); print(y); print(z)
00 đối với chủ đề. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
06

Nếu mẫu OR không thành công, mẫu AS không thành công. Mặt khác, mẫu AS liên kết chủ thể với tên ở bên phải của từ khóa as và thành công. ________ 1022 không thể là ________ 1023

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
024 sẽ khớp với
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
025 và khi thành công, nó sẽ đặt
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
026

8. 6. 4. 3. Mẫu chữ¶

Mẫu chữ tương ứng với hầu hết chữ trong Python. cú pháp.

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
07

Quy tắc

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
027 và mã thông báo
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
028 được định nghĩa trong ngữ pháp Python chuẩn . Chuỗi trích dẫn ba lần được hỗ trợ. Chuỗi thô và chuỗi byte được hỗ trợ. Chuỗi ký tự được định dạng không được hỗ trợ.

Các dạng

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
029 và
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
030 dùng để biểu thị số phức ; . e. g.
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
031.

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
032 sẽ chỉ thành công nếu
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
033. Đối với các singletons
if x < y < z: print(x); print(y); print(z)
83,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
035 và
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
036, toán tử
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
037 được sử dụng

8. 6. 4. 4. Chụp mẫu¶

Một mẫu chụp liên kết giá trị chủ đề với một tên. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
08

Một dấu gạch dưới duy nhất

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
023 không phải là một mẫu chụp (đây là những gì
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
039 thể hiện). Thay vào đó, nó được coi là một
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
040

Trong một mẫu nhất định, một tên đã cho chỉ có thể bị ràng buộc một lần. e. g.

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
041 không hợp lệ trong khi
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
042 được cho phép

Chụp mẫu luôn thành công. Liên kết tuân theo các quy tắc phạm vi được thiết lập bởi toán tử biểu thức gán trong PEP 572;

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
045 sẽ luôn thành công và nó sẽ thiết lập
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
026

8. 6. 4. 5. Mẫu ký tự đại diện¶

Mẫu ký tự đại diện luôn thành công (khớp với mọi thứ) và không liên kết tên. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
09

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
023 là một từ khóa mềm trong bất kỳ mẫu nào, nhưng chỉ trong các mẫu. Nó là một mã định danh, như thường lệ, ngay cả trong các khối
if x < y < z: print(x); print(y); print(z)
89 chủ đề, các khối
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
000 và khối
if x < y < z: print(x); print(y); print(z)
90.

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
023 sẽ luôn thành công

8. 6. 4. 6. Mẫu giá trị¶

Một mẫu giá trị đại diện cho một giá trị được đặt tên trong Python. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
70

Tên có dấu chấm trong mẫu được tra cứu bằng cách sử dụng quy tắc phân giải tên tiêu chuẩn của Python. Mẫu thành công nếu giá trị được tìm thấy so sánh bằng với giá trị chủ thể (sử dụng toán tử đẳng thức

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
052).

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
053 sẽ chỉ thành công nếu
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
054

Ghi chú

Nếu cùng một giá trị xuất hiện nhiều lần trong cùng một câu lệnh so khớp, trình thông dịch có thể lưu vào bộ đệm giá trị đầu tiên được tìm thấy và sử dụng lại thay vì lặp lại cùng một lần tra cứu. Bộ đệm này được liên kết chặt chẽ với một lần thực thi nhất định của một câu lệnh đối sánh nhất định

8. 6. 4. 7. Mẫu nhóm¶

Mẫu nhóm cho phép người dùng thêm dấu ngoặc đơn xung quanh mẫu để nhấn mạnh mục đích nhóm. Mặt khác, nó không có cú pháp bổ sung. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
71

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
055 có tác dụng tương tự như
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
025

8. 6. 4. 8. Mẫu trình tự¶

Một mẫu trình tự chứa một số mẫu con được so khớp với các phần tử trình tự. Cú pháp tương tự như giải nén danh sách hoặc bộ dữ liệu

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
72

Không có sự khác biệt nếu dấu ngoặc đơn hoặc dấu ngoặc vuông được sử dụng cho các mẫu trình tự (i. e.

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
057 so với
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
058 )

Ghi chú

Một mẫu duy nhất được đặt trong ngoặc đơn không có dấu phẩy ở cuối (e. g.

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
059) là một mẫu nhóm . Trong khi một mẫu duy nhất được đặt trong ngoặc vuông (e. g.
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
060) vẫn là một mẫu trình tự.

Nhiều nhất một mẫu con sao có thể nằm trong một mẫu trình tự. Mẫu con ngôi sao có thể xảy ra ở bất kỳ vị trí nào. Nếu không có mẫu con sao nào, thì mẫu trình tự là mẫu trình tự có độ dài cố định;

Sau đây là luồng logic để khớp một mẫu trình tự với một giá trị chủ đề

  1. Nếu giá trị chủ đề không phải là chuỗi 2, mẫu chuỗi không thành công

  2. Nếu giá trị chủ đề là một phiên bản của

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    061,
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    062 hoặc
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    063 thì mẫu trình tự không thành công

  3. Các bước tiếp theo phụ thuộc vào việc mẫu trình tự là cố định hay có độ dài thay đổi

    Nếu mẫu trình tự có độ dài cố định

    1. Nếu độ dài của chuỗi chủ đề không bằng số lượng mẫu con, thì mẫu chuỗi không thành công

    2. Các mẫu con trong mẫu trình tự được khớp với các mục tương ứng của chúng trong trình tự chủ đề từ trái sang phải. Kết hợp dừng ngay khi một mẫu con không thành công. Nếu tất cả các mẫu con thành công trong việc so khớp mục tương ứng của chúng, thì mẫu trình tự thành công

    Mặt khác, nếu mẫu trình tự có độ dài thay đổi

    1. Nếu độ dài của chuỗi chủ đề nhỏ hơn số lượng mẫu con không phải sao, thì mẫu chuỗi không thành công

    2. Các mẫu con không phải ngôi sao hàng đầu được khớp với các mục tương ứng của chúng đối với các chuỗi có độ dài cố định

    3. Nếu bước trước đó thành công, mẫu con ngôi sao khớp với danh sách được tạo thành từ các mục chủ đề còn lại, ngoại trừ các mục còn lại tương ứng với mẫu con không phải ngôi sao theo sau mẫu con ngôi sao

    4. Các mẫu con không phải dấu sao còn lại được khớp với các mục chủ đề tương ứng của chúng, như đối với chuỗi có độ dài cố định

    Ghi chú

    Độ dài của chuỗi chủ đề có được thông qua

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    064 (i. e. thông qua giao thức
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    065). Độ dài này có thể được trình thông dịch lưu vào bộ đệm theo cách tương tự như mẫu giá trị .

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
066 …
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
067 chỉ khớp nếu tất cả những điều sau đây xảy ra

8. 6. 4. 9. Mẫu ánh xạ¶

Mẫu ánh xạ chứa một hoặc nhiều mẫu khóa-giá trị. Cú pháp tương tự như việc xây dựng một từ điển. cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
73

Nhiều nhất một mẫu sao đôi có thể ở dạng ánh xạ. Mẫu sao đôi phải là mẫu phụ cuối cùng trong mẫu ánh xạ

Các khóa trùng lặp trong các mẫu ánh xạ không được phép. Các khóa chữ trùng lặp sẽ tăng

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
074. Hai khóa khác có cùng giá trị sẽ tăng
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
075 khi chạy

Sau đây là luồng logic để so khớp mẫu ánh xạ với giá trị chủ đề

  1. Nếu giá trị chủ đề không phải là ánh xạ 3, mẫu ánh xạ không thành công

  2. Nếu mọi khóa được cung cấp trong mẫu ánh xạ đều có trong ánh xạ chủ thể và mẫu cho từng khóa khớp với mục tương ứng của ánh xạ chủ thể, thì mẫu ánh xạ thành công

  3. Nếu các khóa trùng lặp được phát hiện trong mẫu ánh xạ, mẫu được coi là không hợp lệ. Một

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    074 được nâng lên cho các giá trị bằng chữ trùng lặp;

Ghi chú

Các cặp khóa-giá trị được so khớp bằng cách sử dụng dạng hai đối số của phương pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
078 của đối tượng ánh xạ. Các cặp khóa-giá trị phù hợp phải có sẵn trong ánh xạ và không được tạo nhanh chóng qua
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
079 hoặc
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
080

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
081 chỉ khớp nếu tất cả những điều sau đây xảy ra

8. 6. 4. 10. Mẫu lớp¶

Một mẫu lớp đại diện cho một lớp và các đối số từ khóa và vị trí của nó (nếu có). cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
74

Không nên lặp lại cùng một từ khóa trong các mẫu lớp

Sau đây là luồng logic để khớp một mẫu lớp với một giá trị chủ đề

  1. Nếu

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    086 không phải là một thể hiện của dựng sẵn
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    087 , hãy tăng
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    088

  2. Nếu giá trị chủ đề không phải là phiên bản của

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    086 (đã kiểm tra qua
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    090), thì mẫu lớp không thành công

  3. Nếu không có đối số mẫu, mẫu thành công. Mặt khác, các bước tiếp theo phụ thuộc vào việc có các mẫu đối số từ khóa hoặc vị trí hay không

    Đối với một số loại tích hợp sẵn (được chỉ định bên dưới), một mẫu con vị trí duy nhất được chấp nhận sẽ khớp với toàn bộ chủ đề;

    Nếu chỉ có các mẫu từ khóa, chúng sẽ được xử lý như sau, từng cái một

    I. Từ khóa được tra cứu như một thuộc tính về chủ đề

    • Nếu điều này làm phát sinh một ngoại lệ khác với

      for_stmt ::=  "for" target_list "in" starred_list ":" suite
                    ["else" ":" suite]
      
      091, thì ngoại lệ đó sẽ nổi lên

    • Nếu điều này làm tăng

      for_stmt ::=  "for" target_list "in" starred_list ":" suite
                    ["else" ":" suite]
      
      091, mẫu lớp đã thất bại

    • Mặt khác, mẫu con được liên kết với mẫu từ khóa được khớp với giá trị thuộc tính của chủ đề. Nếu điều này không thành công, mẫu lớp không thành công;

    II. Nếu tất cả các mẫu từ khóa thành công, mẫu lớp thành công

    Nếu có bất kỳ mẫu vị trí nào, chúng sẽ được chuyển đổi thành mẫu từ khóa bằng cách sử dụng thuộc tính

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    093 trên lớp
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    086 trước khi khớp

    I. Tương đương với

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    095 được gọi là

    Xem thêm

    Tùy chỉnh các đối số vị trí trong khớp mẫu lớp

    II. Khi tất cả các mẫu vị trí đã được chuyển đổi thành các mẫu từ khóa,

    trận đấu diễn ra như thể chỉ có các mẫu từ khóa

    Đối với các loại tích hợp sau, việc xử lý các mẫu con vị trí là khác nhau

    Các lớp này chấp nhận một đối số vị trí duy nhất và mẫu ở đó được so khớp với toàn bộ đối tượng chứ không phải một thuộc tính. Ví dụ:

    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    715 khớp với giá trị
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    716, nhưng không khớp với giá trị
    for_stmt ::=  "for" target_list "in" starred_list ":" suite
                  ["else" ":" suite]
    
    717

Nói một cách đơn giản,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
718 chỉ khớp nếu điều sau đây xảy ra

Xem thêm

  • PEP 634 – So khớp mẫu cấu trúc. Sự chỉ rõ

  • PEP 636 – So khớp mẫu cấu trúc. hướng dẫn

8. 7. Định nghĩa hàm¶

Định nghĩa hàm xác định đối tượng hàm do người dùng định nghĩa (xem phần Hệ thống phân cấp loại tiêu chuẩn ).

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
75

Một định nghĩa hàm là một câu lệnh thực thi. Việc thực thi của nó liên kết tên hàm trong không gian tên cục bộ hiện tại với một đối tượng hàm (một trình bao bọc xung quanh mã thực thi cho hàm). Đối tượng hàm này chứa tham chiếu đến không gian tên chung hiện tại làm không gian tên chung sẽ được sử dụng khi hàm được gọi

Định nghĩa hàm không thực thi thân hàm; . 4

Định nghĩa hàm có thể được bao bọc bởi một hoặc nhiều biểu thức trang trí . Các biểu thức trang trí được đánh giá khi hàm được xác định, trong phạm vi chứa định nghĩa hàm. Kết quả phải là một hàm có thể gọi được, được gọi với đối tượng hàm làm đối số duy nhất. Giá trị trả về được liên kết với tên hàm thay vì đối tượng hàm. Nhiều trang trí được áp dụng theo kiểu lồng nhau. Ví dụ: đoạn mã sau

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
76

gần tương đương với

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
77

ngoại trừ chức năng ban đầu không tạm thời bị ràng buộc với tên

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
726

Đã thay đổi trong phiên bản 3. 9. Các chức năng có thể được trang trí bằng bất kỳ

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
727 hợp lệ nào. Trước đây, ngữ pháp hạn chế hơn nhiều; .

Khi một hoặc nhiều tham số có biểu thức tham số hình thức

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
728, hàm được cho là có “giá trị tham số mặc định. ” Đối với thông số có giá trị mặc định, đối số tương ứng có thể bị bỏ qua trong lệnh gọi, trong trường hợp đó, giá trị mặc định của thông số được thay thế. Nếu một tham số có giá trị mặc định, thì tất cả các tham số theo sau cho đến “
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
729” cũng phải có giá trị mặc định — đây là một hạn chế về cú pháp mà ngữ pháp không thể hiện.

Các giá trị tham số mặc định được đánh giá từ trái sang phải khi định nghĩa hàm được thực thi. Điều này có nghĩa là biểu thức được đánh giá một lần, khi hàm được xác định và cùng một giá trị "được tính toán trước" được sử dụng cho mỗi lệnh gọi. Điều này đặc biệt quan trọng để hiểu khi một giá trị tham số mặc định là một đối tượng có thể thay đổi, chẳng hạn như danh sách hoặc từ điển. nếu chức năng sửa đổi đối tượng (e. g. bằng cách thêm một mục vào danh sách), giá trị tham số mặc định có hiệu lực được sửa đổi. Đây thường không phải là những gì đã được dự định. Một cách giải quyết vấn đề này là sử dụng

if x < y < z: print(x); print(y); print(z)
83 làm giá trị mặc định và kiểm tra rõ ràng nó trong phần thân của hàm, e. g

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
78

Ngữ nghĩa của lệnh gọi hàm được mô tả chi tiết hơn trong phần Lệnh gọi . Một lệnh gọi hàm luôn gán giá trị cho tất cả các tham số được đề cập trong danh sách tham số, từ đối số vị trí, từ đối số từ khóa hoặc từ giá trị mặc định. Nếu có dạng “

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
731”, nó được khởi tạo thành một bộ nhận bất kỳ tham số vị trí thừa nào, mặc định là bộ trống. Nếu có dạng “
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
732”, thì nó được khởi tạo thành ánh xạ có thứ tự mới nhận bất kỳ đối số từ khóa dư thừa nào, mặc định thành ánh xạ trống mới cùng loại. Các tham số sau “
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
729” hoặc “______1731” là các tham số chỉ dành cho từ khóa và chỉ có thể được chuyển bởi các đối số từ khóa. Các tham số trước “
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
735” là các tham số chỉ vị trí và chỉ có thể được truyền bởi các đối số vị trí.

Đã thay đổi trong phiên bản 3. 8. Cú pháp tham số hàm

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
735 có thể được sử dụng để biểu thị các tham số chỉ vị trí. Xem PEP 570 để biết chi tiết.

Tham số có thể có chú thích có dạng “

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
737” sau tên tham số. Bất kỳ tham số nào cũng có thể có chú thích, kể cả những tham số có dạng
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
731 hoặc
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
732. Các hàm có thể có chú thích “trả về” có dạng “
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
740” sau danh sách tham số. Các chú thích này có thể là bất kỳ biểu thức Python hợp lệ nào. Sự hiện diện của các chú thích không làm thay đổi ngữ nghĩa của một chức năng. Các giá trị chú thích có sẵn dưới dạng giá trị của từ điển được khóa bởi tên của tham số trong thuộc tính
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
741 của đối tượng hàm. Nếu nhập
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
742 từ
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
743 được sử dụng, các chú thích được lưu giữ dưới dạng chuỗi trong thời gian chạy, cho phép đánh giá bị trì hoãn. Mặt khác, chúng được đánh giá khi định nghĩa hàm được thực thi. Trong trường hợp này, các chú thích có thể được đánh giá theo thứ tự khác với thứ tự xuất hiện trong mã nguồn.

Cũng có thể tạo các hàm ẩn danh (các hàm không bị ràng buộc với tên), để sử dụng ngay trong các biểu thức. Điều này sử dụng các biểu thức lambda, được mô tả trong phần Lambdas . Lưu ý rằng biểu thức lambda chỉ là cách viết tắt của một định nghĩa hàm được đơn giản hóa; . Biểu mẫu “

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
744” thực sự mạnh hơn vì nó cho phép thực thi nhiều câu lệnh và chú thích.

Ghi chú của lập trình viên. Hàm là đối tượng hạng nhất. Câu lệnh “______1744” được thực thi bên trong định nghĩa hàm xác định một hàm cục bộ có thể được trả về hoặc chuyển qua. Các biến tự do được sử dụng trong hàm lồng nhau có thể truy cập các biến cục bộ của hàm chứa def. Xem phần Đặt tên và ràng buộc để biết chi tiết.

Xem thêm

PEP 3107 - Chú thích chức năng

Thông số kỹ thuật ban đầu cho các chú thích chức năng

PEP 484 - Gợi ý loại

Định nghĩa ý nghĩa tiêu chuẩn cho chú thích. gõ gợi ý

PEP 526 - Cú pháp cho chú thích biến

Khả năng nhập các khai báo biến gợi ý, bao gồm các biến lớp và biến thể hiện

PEP 563 - Hoãn Đánh giá Chú thích

Hỗ trợ cho các tham chiếu chuyển tiếp trong chú thích bằng cách lưu chú thích ở dạng chuỗi khi chạy thay vì đánh giá háo hức

8. 8. Định nghĩa lớp¶

Định nghĩa lớp xác định đối tượng lớp (xem phần Hệ thống phân cấp loại tiêu chuẩn ).

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
79

Định nghĩa lớp là một câu lệnh thực thi. Danh sách kế thừa thường đưa ra một danh sách các lớp cơ sở (xem Siêu lớp để sử dụng nâng cao hơn), vì vậy mỗi mục trong danh sách sẽ đánh giá một đối tượng lớp mà . Theo mặc định, các lớp không có danh sách kế thừa sẽ kế thừa từ lớp cơ sở

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
747;

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
20

tương đương với

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
21

Bộ của lớp sau đó được thực thi trong khung thực thi mới (xem Đặt tên và ràng buộc ), sử dụng không gian tên cục bộ mới được tạo và không gian tên ban đầu . (Thông thường, bộ này chứa hầu hết các định nghĩa hàm. ) Khi bộ của lớp kết thúc thực thi, khung thực thi của nó bị loại bỏ nhưng không gian tên cục bộ của nó được lưu. 5 Sau đó, một đối tượng lớp được tạo bằng cách sử dụng danh sách thừa kế cho các lớp cơ sở và không gian tên cục bộ đã lưu cho từ điển thuộc tính. Tên lớp được liên kết với đối tượng lớp này trong không gian tên cục bộ ban đầu.

Thứ tự mà các thuộc tính được định nghĩa trong phần thân của lớp được giữ nguyên trong lớp mới

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
748. Lưu ý rằng điều này chỉ đáng tin cậy ngay sau khi lớp được tạo và chỉ dành cho các lớp được xác định bằng cú pháp định nghĩa

Việc tạo lớp có thể được tùy chỉnh nhiều bằng cách sử dụng siêu lớp .

Các lớp học cũng có thể được trang trí. giống như khi trang trí các chức năng,

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
22

gần tương đương với

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
23

Các quy tắc đánh giá cho các biểu thức trang trí giống như đối với các hàm trang trí. Kết quả sau đó được liên kết với tên lớp

Đã thay đổi trong phiên bản 3. 9. Các lớp học có thể được trang trí bằng bất kỳ

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
727 hợp lệ nào. Trước đây, ngữ pháp hạn chế hơn nhiều; .

Ghi chú của lập trình viên. Các biến được định nghĩa trong định nghĩa lớp là các thuộc tính của lớp; . Các thuộc tính sơ thẩm có thể được đặt trong một phương thức với

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
750. Cả thuộc tính lớp và đối tượng đều có thể truy cập thông qua ký hiệu “
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
751”, và thuộc tính đối tượng ẩn thuộc tính lớp có cùng tên khi được truy cập theo cách này. Các thuộc tính lớp có thể được sử dụng làm giá trị mặc định cho các thuộc tính mẫu, nhưng việc sử dụng các giá trị có thể thay đổi có thể dẫn đến kết quả không mong muốn. Bộ mô tả có thể được sử dụng để tạo các biến thể hiện với các chi tiết triển khai khác nhau.

Xem thêm

PEP 3115 - Siêu dữ liệu trong Python 3000

Đề xuất đã thay đổi cách khai báo siêu dữ liệu thành cú pháp hiện tại và ngữ nghĩa về cách xây dựng các lớp có siêu dữ liệu

PEP 3129 - Trang trí lớp học

Đề xuất bổ sung trang trí lớp học. Trình trang trí chức năng và phương thức đã được giới thiệu trong PEP 318

8. 9. Coroutines¶

Mới trong phiên bản 3. 5

8. 9. 1. Định nghĩa hàm coroutine¶

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
24

Việc thực thi các coroutine Python có thể bị tạm dừng và tiếp tục tại nhiều thời điểm (xem coroutine ). Các biểu thức

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
752,
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
753 và
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
754 chỉ có thể được sử dụng trong phần thân của hàm coroutine.

Các hàm được xác định bằng cú pháp

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
755 luôn là các hàm coroutine, ngay cả khi chúng không chứa từ khóa
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
752 hoặc
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
757

Đó là một

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
074 để sử dụng một biểu thức
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
759 bên trong phần thân của một hàm coroutine

Một ví dụ về chức năng coroutine

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
25

Đã thay đổi trong phiên bản 3. 7. ______1752 và

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
757 hiện là từ khóa; .

8. 9. 2. Câu lệnh for_stmt ::= "for" target_list "in" starred_list ":" suite ["else" ":" suite] 753¶

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
26

Một trình lặp không đồng bộ cung cấp một phương thức

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
763 trực tiếp trả về một trình lặp không đồng bộ, which can call asynchronous code in its
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
764 method.

Câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
753 cho phép lặp lại thuận tiện trên các lần lặp không đồng bộ

Đoạn mã sau

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
27

Là ngữ nghĩa tương đương với

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
28

Xem thêm

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
766 và
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
767 để biết chi tiết

Đó là một

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
074 để sử dụng một câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
753 bên ngoài phần thân của một hàm coroutine

8. 9. 3. Câu lệnh for_stmt ::= "for" target_list "in" starred_list ":" suite ["else" ":" suite] 754¶

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
29

Một trình quản lý ngữ cảnh không đồng bộ là một trình quản lý ngữ cảnh mà .

Đoạn mã sau

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
0

về mặt ngữ nghĩa tương đương với

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
1

Xem thêm

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
771 và
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
772 để biết chi tiết

Đó là một

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
074 để sử dụng một câu lệnh
for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
754 bên ngoài phần thân của một hàm coroutine

Xem thêm

PEP 492 - Coroutines với cú pháp không đồng bộ và chờ đợi

Đề xuất làm cho coroutines trở thành một khái niệm độc lập thích hợp trong Python và thêm cú pháp hỗ trợ

chú thích

1

Ngoại lệ được truyền tới ngăn xếp lời gọi trừ khi có mệnh đề

if x < y < z: print(x); print(y); print(z)
40 xảy ra để đưa ra một ngoại lệ khác. Ngoại lệ mới đó khiến ngoại lệ cũ bị mất