Bạn có thể khai báo một biến trong câu lệnh if không python

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 , và triển khai các cấu trúc luồng điều khiển truyền thống. 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, trong khi câu lệnh 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 thực thi

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

tổng kết

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

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

for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range
0 có thể theo sau là một
for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range
1. 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' được giải quyết trong Python bằng cách yêu cầu các câu lệnh lồng nhau đượ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 được sử dụng để thực hiện có điều kiện

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]

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 định nghĩa đúng và sai); . Nếu tất cả các biểu thức là sai, bộ mệnh đề, 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 được sử dụng để thực hiện lặp lại miễn là một biểu thức là đúng

________số 8

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

Một câu lệnh được thực hiện trong bộ đầu tiên kết thúc vòng lặp mà không thực hiện bộ của mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8. Một câu lệnh được thực hiện 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 được sử dụng để lặp qua các phần tử của chuỗi (chẳng hạn như chuỗi, bộ dữ liệu 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

if x < y < z: print(x); print(y); print(z)
36 được đánh giá một lần; . An được tạo cho iterable đó. Mục đầu tiên do iterator cung cấp sau đó đượ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 phần ) và bộ phần mềm đượ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

Một câu lệnh được thực hiện trong bộ đầu tiên kết thúc vòng lặp mà không thực hiện bộ của mệnh đề

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
8. Một câu lệnh được thực hiện trong bộ đầu tiên sẽ 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 i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range

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. Gợi ý. loại tích hợp đại diện cho các chuỗi số học bất biến của các số nguyên. Chẳng hạn, lặp lại

if x < y < z: print(x); print(y); print(z)
83 liên tiếp mang lại 0, 1 và sau đó là 2

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

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

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

8. 4. 1. ______187 mệnh đề

(Các) mệnh đề

if x < y < z: print(x); print(y); print(z)
87 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 đề, 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 đề
if x < y < z: print(x); print(y); print(z)
87 cho đến khi tìm thấy một mệnh đề phù hợp với ngoại lệ. Mệnh đề
if x < y < z: print(x); print(y); print(z)
87 không biểu thức, nếu có, phải ở cuối; . Đối với mệnh đề
if x < y < z: print(x); print(y); print(z)
87 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 đối tượng ngoại lệ hoặc một bộ chứa một mục là lớp hoặc lớp cơ sở không ảo của đối tượng ngoại lệ

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

if x < y < z: print(x); print(y); print(z)
87 nào phù hợ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.

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

if x < y < z: print(x); print(y); print(z)
87 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 đề

if x < y < z: print(x); print(y); print(z)
87 phù hợp, ngoại lệ được gán cho mục tiêu được chỉ định sau từ khóa
for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range
18 trong mệnh đề
if x < y < z: print(x); print(y); print(z)
87 đó, nếu có và bộ của mệnh đề
if x < y < z: print(x); print(y); print(z)
87 được thực thi. Tất cả các mệnh đề
if x < y < z: print(x); print(y); print(z)
87 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. (Đ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)
04, nó sẽ bị xóa ở cuối mệnh đề
if x < y < z: print(x); print(y); print(z)
87. Điều này như thể

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

đã được dịch sang

for i in range(10):
    print(i)
    i = 5             # this will not affect the for-loop
                      # because i will be overwritten with the next
                      # index in the range
1

Đ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 đề

if x < y < z: print(x); print(y); print(z)
87. 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ộ điều khoản

if x < y < z: print(x); print(y); print(z)
87 được thực thi, thông tin chi tiết về ngoại lệ được lưu trữ trong mô-đun và có thể được truy cập thông qua. 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 ) xác định điểm trong chương trình xảy ra ngoại lệ. Chi tiết về ngoại lệ được truy cập thông qua được khôi phục về giá trị trước đó khi rời khỏi trình xử lý ngoại lệ

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

8. 4. 2. ______112 mệnh đề

(Các) mệnh đề

if x < y < z: print(x); print(y); print(z)
12 được sử dụng để xử lý s. Loại ngoại lệ để so khớp được diễn giải như trong trường hợp của , 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)
12 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)
12, 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)
12 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)
12

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)
12, 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)
12 phải có loại phù hợp và loại này không thể là lớp con của. Không thể trộn lẫn và
if x < y < z: print(x); print(y); print(z)
12 trong cùng một. , và không thể xuất hiện trong mệnh đề
if x < y < z: print(x); print(y); print(z)
12

8. 4. 3. ____58 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ộ phần mềm, không có ngoại lệ nào được đưa ra và không có câu lệnh , , hoặc 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 các mệnh đề trước

8. 4. 4. ______138 mệnh đề

Nếu có

if x < y < z: print(x); print(y); print(z)
38, nó chỉ định trình xử lý 'dọn dẹp'. Mệnh đề được thực hiện, bao gồm mệnh đề any và mệnh đề. 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)
38 đượ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)
38. Nếu mệnh đề
if x < y < z: print(x); print(y); print(z)
38 đư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)
38 thực thi một câu lệnh , hoặc , 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)
38

Khi một câu lệnh , hoặc được thực hiện trong bộ câu lệnh

for_stmt ::=  "for" target_list "in" starred_list ":" suite
              ["else" ":" suite]
5…
if x < y < z: print(x); print(y); print(z)
38, thì mệnh đề
if x < y < z: print(x); print(y); print(z)
38 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 cuối cùng được thực thi. Vì mệnh đề

if x < y < z: print(x); print(y); print(z)
38 luôn thực thi nên câu lệnh
if x < y < z: print(x); print(y); print(z)
28 được thực thi trong mệnh đề
if x < y < z: print(x); print(y); print(z)
38 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 tuyên bố là bất hợp pháp trong mệnh đề

if x < y < z: print(x); print(y); print(z)
38 do có vấn đề với việc thực hiện.

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

Câu lệnh đượ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ý bối cảnh (xem phần ). Điều này cho phép đóng gói các mẫu sử dụng phổ biến để tái sử dụng thuận tiện

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

Việc thực hiện câu lệnh với một "mục" tiến hành như sau

  1. Biểu thức ngữ cảnh (biểu thức được đưa ra trong) được đánh giá để có được trình quản lý ngữ cảnh

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

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

  4. Phương thức

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

  5. Nếu một mục tiêu được bao gồm trong câu lệnh, giá trị trả về từ

    if x < y < z: print(x); print(y); print(z)
    
    71 được gán cho nó

    Ghi chú

    Câu lệnh đảm bảo rằng nếu phương thức

    if x < y < z: print(x); print(y); print(z)
    
    71 trả về mà không có lỗi, thì
    if x < y < z: print(x); print(y); print(z)
    
    72 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 7 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)
    
    72 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, thì 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)
    
    72. Mặt khác, ba đối số đượ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)
    
    72 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

    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)
    
    72 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 đượ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ụ

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
0

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

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

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
1

Ghi chú

Phần này sử dụng dấu nháy đơn để biểu thị

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)
88) và một giá trị chủ thể (theo sau
if x < y < z: print(x); print(y); print(z)
87). 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

Các từ khóa

if x < y < z: print(x); print(y); print(z)
87 và
if x < y < z: print(x); print(y); print(z)
88 là

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)
    
    92 được đánh giá và giá trị chủ đề thu được. Nếu biểu thức chủ đề chứa dấu phẩy, một bộ dữ liệu được tạo bằng cách sử dụng

  2. Mỗi mẫu trong một

    if x < y < z: print(x); print(y); print(z)
    
    93 đượ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)
      
      94 bên trong
      if x < y < z: print(x); print(y); print(z)
      
      93 được thực thi

    • Mặt khác,

      if x < y < z: print(x); print(y); print(z)
      
      93 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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
2

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

if x < y < z: print(x); print(y); print(z)
97 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ệ

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
3

Một

if x < y < z: print(x); print(y); print(z)
98 (là một phần của
if x < y < z: print(x); print(y); print(z)
88) phải thành công để mã bên trong khối
if x < y < z: print(x); print(y); print(z)
88 thực thi. Nó có dạng. theo sau là một biểu thức

Luồng logic của một khối

if x < y < z: print(x); print(y); print(z)
88 với một
if x < y < z: print(x); print(y); print(z)
98 theo sau

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

    if x < y < z: print(x); print(y); print(z)
    
    88 đã thành công chưa. Nếu mẫu không thành công,
    if x < y < z: print(x); print(y); print(z)
    
    98 không được đánh giá và khối
    if x < y < z: print(x); print(y); print(z)
    
    88 tiếp theo được chọn

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

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

    • Nếu điều kiện

      if x < y < z: print(x); print(y); print(z)
      
      98 đánh giá là đúng, thì khối trường hợp được chọn

    • Nếu điều kiện

      if x < y < z: print(x); print(y); print(z)
      
      98 đánh giá là sai, thì khối trường hợp không được chọn

    • Nếu

      if x < y < z: print(x); print(y); print(z)
      
      98 đư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ó phía bên tay trái là không thể chối cãi

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

  • 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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
14 là

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
4

Các mô tả dưới đây 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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
15. cú pháp

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
5

Chỉ mẫu con cuối cùng mới có thể là và mỗi mẫu con phải liên kết cùng một bộ 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,

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
16 sẽ cố gắng khớp với
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
17, nếu thất bại, nó sẽ cố gắng khớp với
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
18, thành công ngay lập tức nếu thành công, thất bại nếu không

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 đối với chủ đề. cú pháp

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
6

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.

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
20 không thể là một
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
21

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
22 sẽ khớp với
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
23 và khi thành công, nó sẽ đặt
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
24

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

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
7

Quy tắc

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
25 và mã thông báo
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
26 đượ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ợ. không được hỗ trợ.

Các hình thức

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
27 và
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
28 là để thể hiện ; . e. g.
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
29

Nói một cách đơn giản, ________ 230 sẽ chỉ thành công nếu ________ 231. Đối với các singletons

if x < y < z: print(x); print(y); print(z)
81,
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
33 và
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
34, toán tử đượ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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
8

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
21 không phải là một mẫu chụp (đây là những gì
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
37 thể hiện). Thay vào đó, nó được coi là một

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.

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
39 không hợp lệ trong khi
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
40 đượ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,

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
43 sẽ luôn thành công và nó sẽ thiết lập
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
24

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
9

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
21 nằ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
if x < y < z: print(x); print(y); print(z)
87 biểu thức chủ đề,
if x < y < z: print(x); print(y); print(z)
98 và khối
if x < y < z: print(x); print(y); print(z)
88

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
21 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
0

Tên chấm trong mẫu được tra cứu bằng Python tiêu chuẩn. 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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
50)

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
51 sẽ chỉ thành công nếu
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
52

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 trữ 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
1

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
53 có tác dụng tương tự như
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
23

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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
2

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.

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
55 so với
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
56 )

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.

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
57) là một. Trong khi một mẫu duy nhất được đặt trong ngoặc vuông (e. g.
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
58) 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à một chuỗi, mẫu chuỗi không thành công

  2. Nếu giá trị chủ đề là một thể hiện của

    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    59,
    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    60 hoặc
    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    61 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 (i. e. thông qua giao thức

    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    63). Độ 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ư

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
64 …
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
65 chỉ phù hợ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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
3

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. Hai khóa khác có cùng giá trị sẽ tăng a khi chạy

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

  1. Nếu giá trị chủ đề không phải là ánh xạ, 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ệ. A đượ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 thức

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
76 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
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
77 hoặc
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
78

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

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
79 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
4

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

    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    84 không phải là một thể hiện của nội dung dựng sẵn, hãy tăng

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

    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    84 (đã kiểm tra qua ), 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 , thì ngoại lệ đó sẽ nổi lên

    • Nếu điều này tăng lên, 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 trên lớp

    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    84 trước khi khớp

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

    compound_stmt ::=  if_stmt
                       | while_stmt
                       | for_stmt
                       | try_stmt
                       | with_stmt
                       | match_stmt
                       | funcdef
                       | classdef
                       | async_with_stmt
                       | async_for_stmt
                       | async_funcdef
    suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
    statement     ::=  stmt_list NEWLINE | compound_stmt
    stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
    
    93 được gọi là

    Xem thêm

    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ụ:

    if_stmt ::=  "if" assignment_expression ":" suite
                 ("elif" assignment_expression ":" suite)*
                 ["else" ":" suite]
    
    13 khớp với giá trị
    if_stmt ::=  "if" assignment_expression ":" suite
                 ("elif" assignment_expression ":" suite)*
                 ["else" ":" suite]
    
    14, nhưng không khớp với giá trị
    if_stmt ::=  "if" assignment_expression ":" suite
                 ("elif" assignment_expression ":" suite)*
                 ["else" ":" suite]
    
    15

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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
16 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

Một định nghĩa hàm định nghĩa một đối tượng hàm do người dùng định nghĩa (xem phần )

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
5

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; .

Một định nghĩa hàm có thể được bao bọc bởi một hoặc nhiều biểu thức. 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
6

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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
7

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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
24

Đã 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ỳ giá trị nào. Trước đây, ngữ pháp hạn chế hơn nhiều; .

Khi một hoặc nhiều biểu thức tham số biểu mẫu

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
26, hàm được cho là có “giá trị tham số mặc định. ” Đối với một tham số có giá trị mặc định, giá trị tương ứng có thể bị bỏ qua khi gọi, trong trường hợp đó, giá trị mặc định của tham số được thay thế. Nếu một tham số có giá trị mặc định, thì tất cả các tham số tiếp theo cho đến “
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
27” 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)
81 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
8

Ngữ nghĩa cuộc gọi chức năng được mô tả chi tiết hơn trong phần. 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 “

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
29”, 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 “
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
30”, 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 thừa nào, mặc định thành ánh xạ trống mới cùng loại. Các tham số sau “
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
27” hoặc “
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
29” 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 “
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
33” là các tham số chỉ có 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
33 có thể được sử dụng để biểu thị các tham số chỉ vị trí. Xem PEP 570 để biết chi tiết.

Các tham số có thể có dạng “

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
35” 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
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
29 hoặc
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
30. Các hàm có thể có chú thích “trả về” có dạng “
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
38” 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
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
39 của đối tượng hàm. Nếu nhập từ
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
40 được sử dụng, các chú thích được lưu giữ dưới dạng các 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. 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 “

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
42” 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 “_______642” đượ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 để 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

Một định nghĩa lớp định nghĩa một đối tượng lớp (xem phần )

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
9

Một định nghĩa lớp là một câu lệnh thực thi. Danh sách thừa kế thường đưa ra một danh sách các lớp cơ sở (xem để biết cách 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 cho phép phân lớp. 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ở;

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
0

tương đương với

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
1

Bộ của lớp sau đó được thực thi trong khung thực thi mới (xem ), sử dụng không gian tên cục bộ mới được tạo và không gian tên chung 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. 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
46. 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

Tạo lớp có thể được tùy chỉnh rất nhiều bằng cách sử dụng

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,

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
2

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

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
3

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. Lớp học có thể được trang trí bằng bất kỳ. 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
48. Cả thuộc tính lớp và đối tượng đều có thể truy cập thông qua ký hiệu “
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
49”, 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. 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. Quy trình

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

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

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
4

Việc thực thi các coroutine Python có thể bị treo và tiếp tục tại nhiều thời điểm (xem tài liệu tham khảo). biểu thức và 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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
53 luôn là các hàm coroutine, ngay cả khi chúng không chứa từ khóa
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
50 hoặc
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
55

Đó là sử dụng biểu thức

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
57 bên trong phần thân của hàm coroutine

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

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
5

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

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
55 hiện là từ khóa; .

8. 9. 2. Câu lệnh if_stmt ::= "if" assignment_expression ":" suite ("elif" assignment_expression ":" suite)* ["else" ":" suite] 51

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
6

An cung cấp một phương thức

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
61 trả về trực tiếp một , có thể gọi mã không đồng bộ trong phương thức
if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
62 của nó

Câu lệnh

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
51 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

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
7

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

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
8

Xem thêm và để biết chi tiết

Đó là sử dụng câu lệnh

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
51 bên ngoài phần thân của hàm coroutine

8. 9. 3. Câu lệnh if_stmt ::= "if" assignment_expression ":" suite ("elif" assignment_expression ":" suite)* ["else" ":" suite] 52

while_stmt ::=  "while" assignment_expression ":" suite
                ["else" ":" suite]
9

An là một cái có khả năng tạm dừng thực thi trong các phương thức nhập và xuất của nó

Đ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 và để biết chi tiết

Đó là sử dụng câu lệnh

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
52 bên ngoài phần thân của 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

Ngoại lệ được truyền tới ngăn xếp lời gọi trừ khi có một mệnh đề 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

Trong khớp mẫu, một chuỗi được định nghĩa là một trong những điều sau đây

  • một lớp kế thừa từ

  • một lớp Python đã được đăng ký là

  • một lớp dựng sẵn có bit (CPython) được đặt

  • một lớp kế thừa từ bất kỳ lớp nào ở trên

Các lớp thư viện tiêu chuẩn sau đây là các chuỗi

Ghi chú

Các giá trị chủ đề của loại

compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
59,
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
60 và
compound_stmt ::=  if_stmt
                   | while_stmt
                   | for_stmt
                   | try_stmt
                   | with_stmt
                   | match_stmt
                   | funcdef
                   | classdef
                   | async_with_stmt
                   | async_for_stmt
                   | async_funcdef
suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]
61 không khớp với các mẫu trình tự

Trong khớp mẫu, một ánh xạ được định nghĩa là một trong những điều sau đây

  • một lớp kế thừa từ

  • một lớp Python đã được đăng ký là

  • một lớp dựng sẵn có bit (CPython) được đặt

  • một lớp kế thừa từ bất kỳ lớp nào ở trên

Các lớp thư viện tiêu chuẩn và là ánh xạ

Một chuỗi ký tự xuất hiện dưới dạng câu lệnh đầu tiên trong phần thân của lớp được chuyển đổi thành mục

if_stmt ::=  "if" assignment_expression ":" suite
             ("elif" assignment_expression ":" suite)*
             ["else" ":" suite]
91 của không gian tên và do đó là mục của lớp.