Hướng dẫn what are the three types of statements in python? - ba loại báo cáo trong python là gì?

Một tuyên bố đơn giản được bao gồm trong một dòng logic duy nhất. Một số tuyên bố đơn giản có thể xảy ra trên một dòng được phân tách bằng dấu chấm phẩy. Cú pháp cho các câu lệnh đơn giản là:

Show
simple_stmt ::=  expression_stmt
                 | assert_stmt
                 | assignment_stmt
                 | augmented_assignment_stmt
                 | annotated_assignment_stmt
                 | pass_stmt
                 | del_stmt
                 | return_stmt
                 | yield_stmt
                 | raise_stmt
                 | break_stmt
                 | continue_stmt
                 | import_stmt
                 | future_stmt
                 | global_stmt
                 | nonlocal_stmt

7.1. Tuyên bố biểu thức JoExpression statements¶

Các câu lệnh biểu thức được sử dụng (chủ yếu là tương tác) để tính toán và ghi một giá trị, hoặc (thường) để gọi một thủ tục (một hàm trả về không có kết quả có ý nghĩa; trong Python, các thủ tục trả về giá trị

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0). Việc sử dụng các câu lệnh biểu thức khác được cho phép và đôi khi hữu ích. Cú pháp cho câu lệnh biểu thức là:

expression_stmt ::=  starred_expression

Một câu lệnh biểu thức đánh giá danh sách biểu thức (có thể là một biểu thức duy nhất).

Trong chế độ tương tác, nếu giá trị không phải là

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0, nó được chuyển đổi thành một chuỗi bằng hàm
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
2 tích hợp và chuỗi kết quả được ghi thành đầu ra tiêu chuẩn trên một dòng (trừ khi kết quả là
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0 không gây ra bất kỳ đầu ra nào.)

7.2. Báo cáo chuyển nhượng JoAssignment statements¶

Các câu lệnh gán được sử dụng để (re) liên kết tên với các giá trị và để sửa đổi các thuộc tính hoặc mục của các đối tượng có thể thay đổi:

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target

.Primaries for the syntax definitions for attributeref, subscription, and slicing.)

Một câu lệnh gán đánh giá danh sách biểu thức (hãy nhớ rằng đây có thể là một biểu thức duy nhất hoặc danh sách được phân tách bằng dấu phẩy, phần sau mang lại một tuple) và gán đối tượng kết quả duy nhất cho từng danh sách mục tiêu, từ trái sang phải.

Bài tập được xác định đệ quy tùy thuộc vào hình thức của mục tiêu (danh sách). Khi mục tiêu là một phần của đối tượng có thể thay đổi (tham chiếu thuộc tính, đăng ký hoặc cắt), đối tượng có thể thay đổi cuối cùng phải thực hiện bài tập và quyết định về tính hợp lệ của nó và có thể tăng một ngoại lệ nếu không thể chấp nhận được. Các quy tắc được quan sát bởi nhiều loại khác nhau và các ngoại lệ được nêu ra với định nghĩa của các loại đối tượng (xem phần phân cấp loại tiêu chuẩn).The standard type hierarchy).

Việc gán một đối tượng cho một danh sách đích, tùy chọn được đặt trong ngoặc đơn hoặc dấu ngoặc vuông, được định nghĩa đệ quy như sau.

  • Nếu danh sách đích là một mục tiêu duy nhất không có dấu phẩy kéo dài, tùy chọn trong ngoặc đơn, đối tượng được gán cho mục tiêu đó.

  • Else:

    • Nếu danh sách mục tiêu chứa một tiền tố mục tiêu với dấu hoa thị, được gọi là mục tiêu được đóng vai chính của người dùng: đối tượng phải là một mục tiêu có thể có ít nhất nhiều mục như có mục tiêu trong danh sách mục tiêu, trừ một mục tiêu. Các mục đầu tiên của Itable được gán, từ trái sang phải, cho đến các mục tiêu trước mục tiêu được đóng vai chính. Các mục cuối cùng của ITEBLE được gán cho các mục tiêu sau khi mục tiêu được đánh dấu sao. Một danh sách các mục còn lại trong ITEBREBLE sau đó được gán cho mục tiêu được đánh dấu sao (danh sách có thể trống).

    • Khác: Đối tượng phải là một số lượng có cùng số lượng mục như có mục tiêu trong danh sách mục tiêu và các mục được gán, từ trái sang phải, đến các mục tiêu tương ứng.

Việc gán một đối tượng cho một mục tiêu duy nhất được định nghĩa đệ quy như sau.

  • Nếu mục tiêu là một định danh (tên):

    • Nếu tên không xảy ra trong câu lệnh

      class Cls:
          x = 3             # class variable
      inst = Cls()
      inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
      
      4 hoặc
      class Cls:
          x = 3             # class variable
      inst = Cls()
      inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
      
      5 trong khối mã hiện tại: tên được liên kết với đối tượng trong không gian tên cục bộ hiện tại.

    • Mặt khác: Tên được liên kết với đối tượng trong không gian tên toàn cầu hoặc không gian tên bên ngoài được xác định bởi

      class Cls:
          x = 3             # class variable
      inst = Cls()
      inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
      
      5, tương ứng.

    Tên được bật lại nếu nó đã bị ràng buộc. Điều này có thể khiến số lượng tham chiếu cho đối tượng trước đó liên kết với tên sẽ đạt đến 0, khiến đối tượng bị phân loại và bộ hủy diệt của nó (nếu nó có một) được gọi.

  • Nếu mục tiêu là một tham chiếu thuộc tính: biểu thức chính trong tham chiếu được đánh giá. Nó sẽ mang lại một đối tượng với các thuộc tính có thể gán; Nếu đây không phải là trường hợp,

    class Cls:
        x = 3             # class variable
    inst = Cls()
    inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
    
    7 được nâng lên. Đối tượng đó sau đó được yêu cầu gán đối tượng được gán cho thuộc tính đã cho; Nếu nó không thể thực hiện bài tập, nó sẽ tăng một ngoại lệ (thường nhưng không nhất thiết là
    class Cls:
        x = 3             # class variable
    inst = Cls()
    inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
    
    8).

    Lưu ý: Nếu đối tượng là một thể hiện lớp và tham chiếu thuộc tính xảy ra ở cả hai phía của toán tử gán, biểu thức bên phải,

    class Cls:
        x = 3             # class variable
    inst = Cls()
    inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
    
    9 có thể truy cập thuộc tính thể hiện hoặc (nếu không có thuộc tính thể hiện tồn tại) thuộc tính lớp. Mục tiêu phía bên trái
    class Cls:
        x = 3             # class variable
    inst = Cls()
    inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
    
    9 luôn được đặt làm thuộc tính thể hiện, tạo nó nếu cần thiết. Do đó, hai lần xuất hiện của
    class Cls:
        x = 3             # class variable
    inst = Cls()
    inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
    
    9 không nhất thiết phải đề cập đến cùng một thuộc tính: nếu biểu thức bên phải đề cập đến thuộc tính lớp, phía bên trái sẽ tạo một thuộc tính thể hiện mới là mục tiêu của bài tập:

    class Cls:
        x = 3             # class variable
    inst = Cls()
    inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
    

    Mô tả này không nhất thiết áp dụng cho các thuộc tính mô tả, chẳng hạn như các thuộc tính được tạo bằng

    x = [0, 1]
    i = 0
    i, x[i] = 1, 2         # i is updated, then x[i] is updated
    print(x)
    
    2.

  • Nếu mục tiêu là một thuê bao: biểu thức chính trong tham chiếu được đánh giá. Nó sẽ mang lại một đối tượng chuỗi có thể thay đổi (chẳng hạn như danh sách) hoặc một đối tượng ánh xạ (như từ điển). Tiếp theo, biểu thức phụ được đánh giá.

    Nếu chính là một đối tượng chuỗi có thể thay đổi (như danh sách), chỉ số phải mang lại một số nguyên. Nếu nó là âm, độ dài trình tự của Lừa được thêm vào nó. Giá trị kết quả phải là một số nguyên không âm ít hơn độ dài của chuỗi và trình tự được yêu cầu gán đối tượng được gán cho mục của nó với chỉ mục đó. Nếu chỉ mục nằm ngoài phạm vi,

    x = [0, 1]
    i = 0
    i, x[i] = 1, 2         # i is updated, then x[i] is updated
    print(x)
    
    3 sẽ được nâng lên (gán cho chuỗi được đăng ký không thể thêm các mục mới vào danh sách).

    Nếu chính là một đối tượng ánh xạ (chẳng hạn như từ điển), chỉ số phải có loại tương thích với loại khóa ánh xạ và bản đồ sau đó được yêu cầu tạo một cặp khóa/mốc ánh xạ chỉ số cho đối tượng được gán. Điều này có thể thay thế một cặp khóa/giá trị hiện có bằng cùng một giá trị khóa hoặc chèn một cặp khóa/giá trị mới (nếu không có khóa có cùng giá trị tồn tại).

    Đối với các đối tượng do người dùng xác định, phương thức

    x = [0, 1]
    i = 0
    i, x[i] = 1, 2         # i is updated, then x[i] is updated
    print(x)
    
    4 được gọi với các đối số thích hợp.

  • Nếu mục tiêu là một sự cắt lát: biểu thức chính trong tham chiếu được đánh giá. Nó sẽ mang lại một đối tượng chuỗi có thể thay đổi (như một danh sách). Đối tượng được gán phải là một đối tượng chuỗi cùng loại. Tiếp theo, các biểu thức giới hạn dưới và trên được đánh giá, trong chừng mực chúng có mặt; Mặc định bằng không và độ dài chuỗi. Các giới hạn nên đánh giá cho các số nguyên. Nếu một trong hai giới hạn là âm, độ dài trình tự được thêm vào nó. Các giới hạn kết quả được cắt để nằm giữa 0 và độ dài trình tự, bao gồm. Cuối cùng, đối tượng trình tự được yêu cầu thay thế lát cắt bằng các mục của chuỗi được gán. Độ dài của lát cắt có thể khác với độ dài của chuỗi được gán, do đó thay đổi độ dài của chuỗi đích, nếu chuỗi đích cho phép.

Chi tiết triển khai CPYThon: Trong quá trình triển khai hiện tại, cú pháp cho các mục tiêu được coi là giống như đối với các biểu thức và cú pháp không hợp lệ bị từ chối trong giai đoạn tạo mã, gây ra các thông báo lỗi ít chi tiết hơn. In the current implementation, the syntax for targets is taken to be the same as for expressions, and invalid syntax is rejected during the code generation phase, causing less detailed error messages.

Mặc dù định nghĩa về gán ngụ ý rằng sự chồng chéo giữa phía bên trái và phía bên phải là 'đồng thời' (ví dụ

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)
5 hoán đổi hai biến), nhưng sự chồng chéo trong bộ sưu tập các biến được gán xảy ra dẫn đến nhầm lẫn. Chẳng hạn, chương trình sau đây in
x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)
6:

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)

Xem thêm

PEP 3132 - Khả năng giải nén có thể mở rộng - Extended Iterable Unpacking

Thông số kỹ thuật cho tính năng

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)
7.

7.2.1. Tuyên bố phân công tăng cườngAugmented assignment statements¶

Bài tập tăng cường là sự kết hợp, trong một tuyên bố duy nhất của một hoạt động nhị phân và một câu lệnh gán:

augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="

(Xem phần Nguyên thủy cho các định nghĩa cú pháp của ba ký hiệu cuối cùng.)Primaries for the syntax definitions of the last three symbols.)

Một phân công tăng cường đánh giá mục tiêu (không giống như các câu lệnh gán thông thường, không thể là một giải nén) và danh sách biểu thức, thực hiện hoạt động nhị phân cụ thể cho loại gán trên hai toán hạng và gán kết quả cho mục tiêu ban đầu. Mục tiêu chỉ được đánh giá một lần.

Một biểu thức gán tăng cường như

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)
8 có thể được viết lại dưới dạng
x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)
9 để đạt được hiệu ứng tương tự, nhưng không chính xác. Trong phiên bản tăng cường,
augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
0 chỉ được đánh giá một lần. Ngoài ra, khi có thể, hoạt động thực tế được thực hiện tại chỗ, có nghĩa là thay vì tạo một đối tượng mới và gán nó cho mục tiêu, đối tượng cũ được sửa đổi thay thế.

Không giống như các bài tập bình thường, các bài tập tăng cường đánh giá phía bên trái trước khi đánh giá phía bên phải. Ví dụ:

augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
1 nhìn lên đầu tiên
augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
2, sau đó nó đánh giá
augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
3 và thực hiện bổ sung, và cuối cùng, nó ghi kết quả trở lại
augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
2.

Ngoại trừ việc gán cho các bộ dữ liệu và nhiều mục tiêu trong một câu lệnh duy nhất, bài tập được thực hiện bằng các câu lệnh gán tăng cường được xử lý giống như các bài tập bình thường. Tương tự, ngoại trừ hành vi tại chỗ có thể, hoạt động nhị phân được thực hiện bằng cách gán tăng cường giống như các hoạt động nhị phân bình thường.

Đối với các mục tiêu là tài liệu tham khảo thuộc tính, cùng một cảnh báo về các thuộc tính lớp và thể hiện được áp dụng như đối với các bài tập thông thường.caveat about class and instance attributes applies as for regular assignments.

7.2.2. Báo cáo gán chú thích JorAnnotated assignment statements¶

Bài tập chú thích là sự kết hợp, trong một câu lệnh, của chú thích biến hoặc thuộc tính và câu lệnh gán tùy chọn: assignment is the combination, in a single statement, of a variable or attribute annotation and an optional assignment statement:

annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]

Sự khác biệt so với các câu lệnh gán thông thường là chỉ được phép một mục tiêu.Assignment statements is that only a single target is allowed.

Đối với các tên đơn giản là mục tiêu gán, nếu trong phạm vi lớp hoặc mô -đun, các chú thích được đánh giá và lưu trữ trong một thuộc tính lớp hoặc mô -đun đặc biệt

augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
5 là ánh xạ từ điển từ các tên biến (được xua tan nếu riêng tư) để đánh giá. Thuộc tính này có thể ghi và được tạo tự động khi bắt đầu thực hiện cơ thể lớp hoặc mô -đun, nếu các chú thích được tìm thấy một cách thống trị.

Đối với các biểu thức là mục tiêu gán, các chú thích được đánh giá nếu trong lớp hoặc phạm vi mô -đun, nhưng không được lưu trữ.

Nếu một tên được chú thích trong một phạm vi hàm, thì tên này là cục bộ cho phạm vi đó. Chú thích không bao giờ được đánh giá và lưu trữ trong phạm vi chức năng.

Nếu mặt bên phải có mặt, một nhiệm vụ được chú thích sẽ thực hiện bài tập thực tế trước khi đánh giá các chú thích (nếu có). Nếu phía bên tay phải không có mặt cho mục tiêu biểu thức, thì trình thông dịch sẽ đánh giá mục tiêu ngoại trừ cuộc gọi

x = [0, 1]
i = 0
i, x[i] = 1, 2         # i is updated, then x[i] is updated
print(x)
4 hoặc
augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
7 cuối cùng.

Xem thêm

PEP 526 - Cú pháp để chú thích biến - Syntax for Variable Annotations

Đề xuất đã thêm cú pháp để chú thích các loại biến (bao gồm các biến lớp và biến thể hiện), thay vì biểu thị chúng thông qua các bình luận.

PEP 484 - Loại gợi ý - Type hints

Đề xuất đã thêm mô -đun

augmented_assignment_stmt ::=  augtarget augop (expression_list | yield_expression)
augtarget                 ::=  identifier | attributeref | subscription | slicing
augop                     ::=  "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="
                               | ">>=" | "<<=" | "&=" | "^=" | "|="
8 để cung cấp cú pháp tiêu chuẩn cho các chú thích loại có thể được sử dụng trong các công cụ phân tích tĩnh và IDE.

Thay đổi trong phiên bản 3.8: Các bài tập được chú thích hiện cho phép các biểu thức tương tự ở phía bên phải như các bài tập thông thường. Trước đây, một số biểu thức (như các biểu thức tuple không được đặt) đã gây ra lỗi cú pháp.Now annotated assignments allow the same expressions in the right hand side as regular assignments. Previously, some expressions (like un-parenthesized tuple expressions) caused a syntax error.

7.3. Tuyên bố augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression) augtarget ::= identifier | attributeref | subscription | slicing augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" | ">>=" | "<<=" | "&=" | "^=" | "|=" 9The augmented_assignment_stmt ::= augtarget augop (expression_list | yield_expression) augtarget ::= identifier | attributeref | subscription | slicing augop ::= "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" | ">>=" | "<<=" | "&=" | "^=" | "|=" 9 statement¶

Khẳng định các câu lệnh là một cách thuận tiện để chèn các xác nhận gỡ lỗi vào một chương trình:

assert_stmt ::=  "assert" expression ["," expression]

Hình thức đơn giản,

annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
0, tương đương với

if __debug__:
    if not expression: raise AssertionError

Mẫu mở rộng,

annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
1, tương đương với

if __debug__:
    if not expression1: raise AssertionError(expression2)

Các tương đương này giả định rằng

annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
2 và
annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
3 đề cập đến các biến tích hợp với các tên đó. Trong quá trình triển khai hiện tại, biến tích hợp
annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
2 là
annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
5 trong các trường hợp bình thường,
annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
6 khi yêu cầu tối ưu hóa (tùy chọn dòng lệnh
annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
7). Trình tạo mã hiện tại phát ra không có mã nào cho một câu lệnh ASPER khi tối ưu hóa được yêu cầu vào thời điểm biên dịch. Lưu ý rằng không cần thiết phải bao gồm mã nguồn cho biểu thức không thành công trong thông báo lỗi; Nó sẽ được hiển thị như một phần của dấu vết ngăn xếp.

Nhiệm vụ cho

annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
2 là bất hợp pháp. Giá trị cho biến tích hợp được xác định khi trình thông dịch bắt đầu.

7.4. Tuyên bố annotated_assignment_stmt ::= augtarget ":" expression ["=" (starred_expression | yield_expression)] 9The annotated_assignment_stmt ::= augtarget ":" expression ["=" (starred_expression | yield_expression)] 9 statement¶

expression_stmt ::=  starred_expression
0

annotated_assignment_stmt ::=  augtarget ":" expression
                               ["=" (starred_expression | yield_expression)]
9 là một hoạt động null - khi nó được thực hiện, không có gì xảy ra. Nó rất hữu ích như một trình giữ chỗ khi cần phải có câu lệnh, nhưng không cần phải thực thi mã, ví dụ:

expression_stmt ::=  starred_expression
1

7.5. Tuyên bố assert_stmt ::= "assert" expression ["," expression] 1The assert_stmt ::= "assert" expression ["," expression] 1 statement¶

expression_stmt ::=  starred_expression
2

Việc xóa được định nghĩa đệ quy rất giống với cách xác định gán. Thay vì đánh vần nó trong chi tiết đầy đủ, đây là một số gợi ý.

Xóa danh sách mục tiêu xóa đệ quy từng mục tiêu, từ trái sang phải.

Việc xóa tên sẽ loại bỏ liên kết của tên đó khỏi không gian tên cục bộ hoặc toàn cầu, tùy thuộc vào việc tên xảy ra trong câu lệnh

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 trong cùng một khối mã. Nếu tên không bị ràng buộc, ngoại lệ
assert_stmt ::=  "assert" expression ["," expression]
3 sẽ được nêu ra.

Việc xóa các tài liệu tham khảo thuộc tính, đăng ký và glicings được chuyển đến đối tượng chính liên quan; Việc xóa cắt lát nói chung tương đương với việc gán một lát trống thuộc loại đúng (nhưng ngay cả điều này được xác định bởi đối tượng cắt lát).

Đã thay đổi trong phiên bản 3.2: Trước đây, việc xóa tên khỏi không gian tên cục bộ là bất hợp pháp nếu nó xảy ra như một biến miễn phí trong một khối lồng nhau.Previously it was illegal to delete a name from the local namespace if it occurs as a free variable in a nested block.

7.6. Tuyên bố assert_stmt ::= "assert" expression ["," expression] 4The assert_stmt ::= "assert" expression ["," expression] 4 statement¶

expression_stmt ::=  starred_expression
3

assert_stmt ::=  "assert" expression ["," expression]
4 chỉ có thể xảy ra được lồng về mặt cú pháp trong một định nghĩa hàm, không phải trong định nghĩa lớp lồng nhau.

Nếu một danh sách biểu thức có mặt, nó được đánh giá, khác

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0 được thay thế.

assert_stmt ::=  "assert" expression ["," expression]
4 để lại cuộc gọi hàm hiện tại với danh sách biểu thức (hoặc
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0) là giá trị trả về.

Khi

assert_stmt ::=  "assert" expression ["," expression]
4 chuyển quyền kiểm soát ra khỏi câu lệnh
if __debug__:
    if not expression: raise AssertionError
0 với mệnh đề
if __debug__:
    if not expression: raise AssertionError
1, mệnh đề
if __debug__:
    if not expression: raise AssertionError
1 đó được thực thi trước khi thực sự rời khỏi chức năng.

Trong hàm máy phát, câu lệnh

assert_stmt ::=  "assert" expression ["," expression]
4 chỉ ra rằng trình tạo được thực hiện và sẽ khiến
if __debug__:
    if not expression: raise AssertionError
4 được nâng lên. Giá trị trả về (nếu có) được sử dụng làm đối số để xây dựng
if __debug__:
    if not expression: raise AssertionError
4 và trở thành thuộc tính
if __debug__:
    if not expression: raise AssertionError
6.

Trong hàm tạo không đồng bộ, một câu lệnh

assert_stmt ::=  "assert" expression ["," expression]
4 trống chỉ ra rằng trình tạo không đồng bộ được thực hiện và sẽ khiến
if __debug__:
    if not expression: raise AssertionError
8 được nâng lên. Câu lệnh không trống
assert_stmt ::=  "assert" expression ["," expression]
4 là lỗi cú pháp trong hàm tạo không đồng bộ.

7.7. Tuyên bố if __debug__: if not expression1: raise AssertionError(expression2) 0The if __debug__: if not expression1: raise AssertionError(expression2) 0 statement¶

expression_stmt ::=  starred_expression
4

Một tuyên bố

if __debug__:
    if not expression1: raise AssertionError(expression2)
0 tương đương về mặt ngữ nghĩa với biểu thức năng suất. Câu lệnh năng suất có thể được sử dụng để bỏ qua các dấu ngoặc đơn nếu không sẽ được yêu cầu trong câu lệnh biểu thức năng suất tương đương. Ví dụ: các báo cáo năng suấtyield expression. The yield statement can be used to omit the parentheses that would otherwise be required in the equivalent yield expression statement. For example, the yield statements

expression_stmt ::=  starred_expression
5

tương đương với các câu lệnh biểu thức năng suất

expression_stmt ::=  starred_expression
6

Các biểu thức và câu lệnh năng suất chỉ được sử dụng khi xác định hàm máy phát và chỉ được sử dụng trong phần thân của hàm máy phát. Sử dụng năng suất trong một định nghĩa chức năng là đủ để gây ra định nghĩa đó để tạo hàm máy phát thay vì hàm bình thường.generator function, and are only used in the body of the generator function. Using yield in a function definition is sufficient to cause that definition to create a generator function instead of a normal function.

Để biết chi tiết đầy đủ của ngữ nghĩa

if __debug__:
    if not expression1: raise AssertionError(expression2)
0, hãy tham khảo phần Biểu thức năng suất.Yield expressions section.

7.8. Tuyên bố if __debug__: if not expression1: raise AssertionError(expression2) 3The if __debug__: if not expression1: raise AssertionError(expression2) 3 statement¶

expression_stmt ::=  starred_expression
7

Nếu không có biểu thức nào có mặt,

if __debug__:
    if not expression1: raise AssertionError(expression2)
3 tái cấu trúc ngoại lệ hiện đang được xử lý, còn được gọi là ngoại lệ hoạt động. Nếu hiện tại có một ngoại lệ hoạt động, một ngoại lệ
if __debug__:
    if not expression1: raise AssertionError(expression2)
5 được nêu ra cho thấy rằng đây là một lỗi.

Mặt khác,

if __debug__:
    if not expression1: raise AssertionError(expression2)
3 đánh giá biểu thức đầu tiên là đối tượng ngoại lệ. Nó phải là một lớp con hoặc một thể hiện là
if __debug__:
    if not expression1: raise AssertionError(expression2)
7. Nếu đó là một lớp, trường hợp ngoại lệ sẽ có được khi cần bằng cách khởi tạo lớp mà không có đối số.

Loại ngoại lệ là lớp thể hiện ngoại lệ, giá trị là chính trường hợp.

Một đối tượng Traceback thường được tạo tự động khi một ngoại lệ được nâng lên và gắn vào nó dưới dạng thuộc tính

if __debug__:
    if not expression1: raise AssertionError(expression2)
8, có thể ghi được. Bạn có thể tạo một ngoại lệ và đặt TraceBack của riêng mình trong một bước bằng phương thức ngoại lệ
if __debug__:
    if not expression1: raise AssertionError(expression2)
9 (trả về cùng một trường hợp ngoại lệ, với Traceback được đặt thành đối số của nó), như vậy:

expression_stmt ::=  starred_expression
8

Điều khoản

expression_stmt ::=  starred_expression
00 được sử dụng cho chuỗi ngoại lệ: nếu được đưa ra, biểu thức thứ hai phải là một loại hoặc một trường hợp ngoại lệ khác. Nếu biểu thức thứ hai là một thể hiện ngoại lệ, nó sẽ được gắn vào ngoại lệ được nâng lên dưới dạng thuộc tính
expression_stmt ::=  starred_expression
01 (có thể ghi). Nếu biểu thức là một lớp ngoại lệ, lớp sẽ được khởi tạo và trường hợp ngoại lệ kết quả sẽ được gắn vào ngoại lệ được nâng lên dưới dạng thuộc tính
expression_stmt ::=  starred_expression
01. Nếu ngoại lệ được nâng lên không được xử lý, cả hai trường hợp ngoại lệ sẽ được in:

expression_stmt ::=  starred_expression
9

Một cơ chế tương tự hoạt động ngầm nếu một ngoại lệ mới được nâng lên khi một ngoại lệ đã được xử lý. Một ngoại lệ có thể được xử lý khi mệnh đề

expression_stmt ::=  starred_expression
03 hoặc
if __debug__:
    if not expression: raise AssertionError
1 hoặc câu lệnh
expression_stmt ::=  starred_expression
05, được sử dụng. Ngoại lệ trước đó sau đó được đính kèm là thuộc tính ngoại lệ mới ____ ____106:

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
0

Chuỗi ngoại lệ có thể được đàn áp rõ ràng bằng cách chỉ định

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0 trong mệnh đề
expression_stmt ::=  starred_expression
00:

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
1

Thông tin bổ sung về các ngoại lệ có thể được tìm thấy trong các ngoại lệ và thông tin về các ngoại lệ xử lý là trong phần Tuyên bố thử.Exceptions, and information about handling exceptions is in section The try statement.

Đã thay đổi trong phiên bản 3.3:

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0 hiện được phép là
expression_stmt ::=  starred_expression
10 trong
expression_stmt ::=  starred_expression
11.
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
0 is now permitted as
expression_stmt ::=  starred_expression
10 in
expression_stmt ::=  starred_expression
11.

Mới trong phiên bản 3.3: Thuộc tính

expression_stmt ::=  starred_expression
12 để triệt tiêu hiển thị tự động của bối cảnh ngoại lệ.The
expression_stmt ::=  starred_expression
12 attribute to suppress automatic display of the exception context.

Đã thay đổi trong phiên bản 3.11: Nếu dấu vết của ngoại lệ hoạt động được sửa đổi trong mệnh đề

expression_stmt ::=  starred_expression
03, thì câu lệnh
if __debug__:
    if not expression1: raise AssertionError(expression2)
3 tiếp theo sẽ tái tạo ngoại lệ với TraceBack đã sửa đổi. Trước đây, ngoại lệ đã được nêu lại với dấu vết của nó khi nó bị bắt.If the traceback of the active exception is modified in an
expression_stmt ::=  starred_expression
03 clause, a subsequent
if __debug__:
    if not expression1: raise AssertionError(expression2)
3 statement re-raises the exception with the modified traceback. Previously, the exception was re-raised with the traceback it had when it was caught.

7.9. Tuyên bố expression_stmt ::= starred_expression 15The expression_stmt ::= starred_expression 15 statement¶

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
2

expression_stmt ::=  starred_expression
15 chỉ có thể xảy ra được lồng về mặt cú pháp trong vòng lặp
expression_stmt ::=  starred_expression
17 hoặc
expression_stmt ::=  starred_expression
18, nhưng không được lồng trong một hàm hoặc định nghĩa lớp trong vòng lặp đó.

Nó chấm dứt vòng lặp bao quanh gần nhất, bỏ qua mệnh đề

expression_stmt ::=  starred_expression
19 tùy chọn nếu vòng lặp có một.

Nếu vòng lặp

expression_stmt ::=  starred_expression
17 bị chấm dứt bởi
expression_stmt ::=  starred_expression
15, mục tiêu điều khiển vòng giữ giữ giá trị hiện tại của nó.

Khi

expression_stmt ::=  starred_expression
15 chuyển quyền kiểm soát ra khỏi câu lệnh
if __debug__:
    if not expression: raise AssertionError
0 với mệnh đề
if __debug__:
    if not expression: raise AssertionError
1, mệnh đề
if __debug__:
    if not expression: raise AssertionError
1 đó được thực thi trước khi thực sự rời khỏi vòng lặp.

7.10. Tuyên bố expression_stmt ::= starred_expression 26The expression_stmt ::= starred_expression 26 statement¶

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
3

expression_stmt ::=  starred_expression
26 chỉ có thể xảy ra được lồng về mặt cú pháp trong vòng lặp
expression_stmt ::=  starred_expression
17 hoặc
expression_stmt ::=  starred_expression
18, nhưng không được lồng trong một hàm hoặc định nghĩa lớp trong vòng lặp đó. Nó tiếp tục với chu kỳ tiếp theo của vòng lặp bao quanh gần nhất.

Khi

expression_stmt ::=  starred_expression
26 chuyển quyền kiểm soát ra khỏi câu lệnh
if __debug__:
    if not expression: raise AssertionError
0 với mệnh đề
if __debug__:
    if not expression: raise AssertionError
1, mệnh đề
if __debug__:
    if not expression: raise AssertionError
1 đó được thực thi trước khi thực sự bắt đầu chu kỳ vòng lặp tiếp theo.

7.11. Tuyên bố expression_stmt ::= starred_expression 34The expression_stmt ::= starred_expression 34 statement¶

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
4

Tuyên bố nhập cơ bản (Điều khoản không

expression_stmt ::=  starred_expression
00) được thực thi trong hai bước:

  1. Tìm một mô -đun, tải và khởi tạo nó nếu cần thiết

  2. Xác định tên hoặc tên trong không gian tên cục bộ cho phạm vi nơi tuyên bố

    expression_stmt ::=  starred_expression
    
    34 xảy ra.

Khi tuyên bố chứa nhiều mệnh đề (cách nhau bằng dấu phẩy), hai bước được thực hiện riêng cho mỗi mệnh đề, giống như các điều khoản đã được tách ra thành các báo cáo nhập khẩu riêng lẻ.

Các chi tiết về bước đầu tiên, tìm kiếm và tải các mô -đun, được mô tả chi tiết hơn trong phần trên hệ thống nhập, cũng mô tả các loại gói và mô -đun khác nhau có thể được nhập, cũng như tất cả các móc có thể được sử dụng Để tùy chỉnh hệ thống nhập. Lưu ý rằng các lỗi trong bước này có thể chỉ ra rằng không thể định vị được mô -đun hoặc lỗi xảy ra trong khi khởi tạo mô -đun, bao gồm thực thi mã mô -đun.import system, which also describes the various types of packages and modules that can be imported, as well as all the hooks that can be used to customize the import system. Note that failures in this step may indicate either that the module could not be located, or that an error occurred while initializing the module, which includes execution of the module’s code.

Nếu mô -đun được yêu cầu được truy xuất thành công, nó sẽ được cung cấp trong không gian tên địa phương theo một trong ba cách:

  • Nếu tên mô -đun được theo sau bởi

    expression_stmt ::=  starred_expression
    
    37, thì tên sau
    expression_stmt ::=  starred_expression
    
    37 bị ràng buộc trực tiếp với mô -đun đã nhập.

  • Nếu không có tên nào khác được chỉ định và mô -đun được nhập là mô -đun cấp cao nhất, tên mô -đun được liên kết trong không gian tên cục bộ làm tham chiếu đến mô -đun nhập khẩu

  • Nếu mô -đun được nhập không phải là mô -đun cấp cao nhất, thì tên của gói cấp cao nhất chứa mô -đun được liên kết trong không gian tên cục bộ như một tham chiếu đến gói cấp cao nhất. Mô -đun đã nhập phải được truy cập bằng cách sử dụng tên đủ điều kiện của nó thay vì trực tiếp

Mẫu

expression_stmt ::=  starred_expression
00 sử dụng quy trình phức tạp hơn một chút:

  1. Tìm mô -đun được chỉ định trong mệnh đề

    expression_stmt ::=  starred_expression
    
    00, tải và khởi tạo nó nếu cần thiết;

  2. Đối với mỗi định danh được chỉ định trong các mệnh đề

    expression_stmt ::=  starred_expression
    
    34:

    1. kiểm tra xem mô -đun đã nhập có thuộc tính bằng tên đó không

    2. Nếu không, hãy cố gắng nhập một mô hình con với tên đó và sau đó kiểm tra lại mô -đun đã nhập cho thuộc tính đó

    3. Nếu không tìm thấy thuộc tính,

      expression_stmt ::=  starred_expression
      
      42 sẽ được nâng lên.

    4. Mặt khác, một tham chiếu đến giá trị đó được lưu trữ trong không gian tên cục bộ, sử dụng tên trong mệnh đề

      expression_stmt ::=  starred_expression
      
      37 nếu nó có mặt, nếu không thì sử dụng tên thuộc tính

Examples:

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
5

Nếu danh sách các định danh được thay thế bằng một ngôi sao (

expression_stmt ::=  starred_expression
44), tất cả các tên công khai được xác định trong mô -đun đều được ràng buộc trong không gian tên cục bộ cho phạm vi trong đó câu lệnh
expression_stmt ::=  starred_expression
34 xảy ra.

Các tên công khai được xác định bởi một mô -đun được xác định bằng cách kiểm tra không gian tên mô -đun cho một biến có tên

expression_stmt ::=  starred_expression
46; Nếu được xác định, nó phải là một chuỗi các chuỗi được xác định hoặc nhập bởi mô -đun đó. Các tên được đặt trong
expression_stmt ::=  starred_expression
46 đều được coi là công khai và được yêu cầu tồn tại. Nếu
expression_stmt ::=  starred_expression
46 không được xác định, tập hợp các tên công khai bao gồm tất cả các tên được tìm thấy trong không gian tên mô -đun không bắt đầu với ký tự dấu gạch dưới (
expression_stmt ::=  starred_expression
49).
expression_stmt ::=  starred_expression
46 nên chứa toàn bộ API công khai. Nó được dự định để tránh vô tình xuất các mục không phải là một phần của API (chẳng hạn như các mô -đun thư viện được nhập và sử dụng trong mô -đun).

Mẫu thẻ hoang dã của nhập khẩu -

expression_stmt ::=  starred_expression
51 - chỉ được phép ở cấp độ mô -đun. Cố gắng sử dụng nó trong các định nghĩa của lớp hoặc chức năng sẽ tăng
expression_stmt ::=  starred_expression
52.

Khi chỉ định mô -đun nào để nhập, bạn không phải chỉ định tên tuyệt đối của mô -đun. Khi một mô -đun hoặc gói được chứa trong một gói khác, có thể thực hiện nhập tương đối trong cùng một gói hàng đầu mà không cần phải đề cập đến tên gói. Bằng cách sử dụng các dấu chấm hàng đầu trong mô -đun hoặc gói được chỉ định sau

expression_stmt ::=  starred_expression
00, bạn có thể chỉ định mức độ cao để vượt qua hệ thống phân cấp gói hiện tại mà không cần chỉ định tên chính xác. Một chấm hàng đầu có nghĩa là gói hiện tại nơi mô -đun tạo ra nhập. Hai dấu chấm có nghĩa là lên một cấp gói. Ba chấm đã tăng hai cấp độ, v.v. Vì vậy, nếu bạn thực thi
expression_stmt ::=  starred_expression
54 từ một mô -đun trong gói
expression_stmt ::=  starred_expression
55 thì cuối cùng bạn sẽ nhập
expression_stmt ::=  starred_expression
56. Nếu bạn thực thi
expression_stmt ::=  starred_expression
57 từ trong vòng
expression_stmt ::=  starred_expression
58, bạn sẽ nhập
expression_stmt ::=  starred_expression
59. Thông số kỹ thuật cho nhập khẩu tương đối được chứa trong phần nhập khẩu tương đối.Package Relative Imports section.

expression_stmt ::=  starred_expression
60 được cung cấp để hỗ trợ các ứng dụng xác định động các mô -đun sẽ được tải.

Tăng một sự kiện kiểm toán

expression_stmt ::=  starred_expression
34 với các đối số
expression_stmt ::=  starred_expression
62,
expression_stmt ::=  starred_expression
63,
expression_stmt ::=  starred_expression
64,
expression_stmt ::=  starred_expression
65,
expression_stmt ::=  starred_expression
66.auditing event
expression_stmt ::=  starred_expression
34 with arguments
expression_stmt ::=  starred_expression
62,
expression_stmt ::=  starred_expression
63,
expression_stmt ::=  starred_expression
64,
expression_stmt ::=  starred_expression
65,
expression_stmt ::=  starred_expression
66.

7.11.1. Tuyên bố trong tương lai lorFuture statements¶

Một tuyên bố trong tương lai là một chỉ thị cho trình biên dịch rằng một mô -đun cụ thể nên được biên dịch bằng cú pháp hoặc ngữ nghĩa sẽ có sẵn trong một bản phát hành Python trong tương lai trong tương lai nơi tính năng trở thành tiêu chuẩn.

Tuyên bố trong tương lai nhằm mục đích dễ dàng di chuyển sang các phiên bản Python trong tương lai giới thiệu những thay đổi không tương thích cho ngôn ngữ. Nó cho phép sử dụng các tính năng mới trên cơ sở mỗi mô-đun trước khi phát hành trong đó tính năng trở thành tiêu chuẩn.

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
6

Một tuyên bố trong tương lai phải xuất hiện gần đỉnh của mô -đun. Các dòng duy nhất có thể xuất hiện trước một tuyên bố trong tương lai là:

  • các mô -đun DocString (nếu có),

  • comments,

  • các dòng trống, và

  • những tuyên bố trong tương lai khác.

Tính năng duy nhất yêu cầu sử dụng câu lệnh trong tương lai là

expression_stmt ::=  starred_expression
67 (xem PEP 563).PEP 563).

Tất cả các tính năng lịch sử được kích hoạt bởi tuyên bố trong tương lai vẫn được Python 3. Danh sách bao gồm

expression_stmt ::=  starred_expression
68,
expression_stmt ::=  starred_expression
69,
expression_stmt ::=  starred_expression
70,
expression_stmt ::=  starred_expression
71,
expression_stmt ::=  starred_expression
72,
expression_stmt ::=  starred_expression
73,
expression_stmt ::=  starred_expression
74 và
expression_stmt ::=  starred_expression
75. Tất cả đều dư thừa vì chúng luôn được bật và chỉ được giữ để tương thích ngược.

Một tuyên bố trong tương lai được công nhận và xử lý đặc biệt tại thời điểm biên dịch: các thay đổi đối với ngữ nghĩa của các cấu trúc cốt lõi thường được thực hiện bằng cách tạo mã khác nhau. Nó thậm chí có thể là trường hợp một tính năng mới giới thiệu cú pháp mới không tương thích (chẳng hạn như một từ dành riêng mới), trong trường hợp đó, trình biên dịch có thể cần phân tích mô -đun khác nhau. Những quyết định như vậy không thể được đẩy ra cho đến khi chạy.

Đối với bất kỳ bản phát hành nhất định nào, trình biên dịch biết tên tính năng nào đã được xác định và nêu ra lỗi thời gian biên dịch nếu một câu lệnh trong tương lai chứa một tính năng không được biết đến.

Các ngữ nghĩa thời gian chạy trực tiếp giống như đối với bất kỳ câu lệnh nhập nào: Có một mô -đun tiêu chuẩn

expression_stmt ::=  starred_expression
76, được mô tả sau và nó sẽ được nhập theo cách thông thường tại thời điểm tuyên bố trong tương lai được thực thi.

Các ngữ nghĩa thời gian chạy thú vị phụ thuộc vào tính năng cụ thể được kích hoạt bởi tuyên bố trong tương lai.

Lưu ý rằng không có gì đặc biệt về tuyên bố:

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
7

Đó không phải là một tuyên bố trong tương lai; Nó là một tuyên bố nhập khẩu thông thường không có hạn chế ngữ nghĩa hoặc cú pháp đặc biệt.

Mã được biên dịch bởi các cuộc gọi đến các chức năng tích hợp

expression_stmt ::=  starred_expression
77 và
expression_stmt ::=  starred_expression
78 xảy ra trong một mô-đun
expression_stmt ::=  starred_expression
79 chứa một câu lệnh trong tương lai, theo mặc định, sẽ sử dụng cú pháp mới hoặc ngữ nghĩa liên quan đến tuyên bố trong tương lai. Điều này có thể được kiểm soát bởi các đối số tùy chọn đến
expression_stmt ::=  starred_expression
78 - xem tài liệu của hàm đó để biết chi tiết.

Một tuyên bố trong tương lai được gõ tại một dấu nhắc thông dịch tương tác sẽ có hiệu lực cho phần còn lại của phiên phiên dịch. Nếu một trình thông dịch được bắt đầu với tùy chọn

expression_stmt ::=  starred_expression
81, được chuyển tên tập lệnh để thực thi và tập lệnh bao gồm một câu lệnh trong tương lai, nó sẽ có hiệu lực trong phiên tương tác bắt đầu sau khi tập lệnh được thực thi.

Xem thêm

PEP 236 - Quay lại __future__ - Back to the __future__

Đề xuất ban đầu cho cơ chế __future__.

7.12. Tuyên bố class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3 4The class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3 4 statement¶

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
8

Tuyên bố

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 là một tuyên bố giữ cho toàn bộ khối mã hiện tại. Nó có nghĩa là các định danh được liệt kê sẽ được hiểu là toàn cầu. Không thể gán cho một biến toàn cầu mà không có
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4, mặc dù các biến miễn phí có thể đề cập đến Globals mà không được tuyên bố toàn cầu.

Tên được liệt kê trong câu lệnh

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 không được sử dụng trong cùng một khối mã trước khi tuyên bố
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4.

Các tên được liệt kê trong một câu lệnh

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 không được định nghĩa là các tham số chính thức hoặc là mục tiêu trong các câu lệnh
expression_stmt ::=  starred_expression
05 hoặc
expression_stmt ::=  starred_expression
03 hoặc trong danh sách mục tiêu
expression_stmt ::=  starred_expression
17, định nghĩa
expression_stmt ::=  starred_expression
91, định nghĩa chức năng, câu lệnh
expression_stmt ::=  starred_expression
34 hoặc chú thích biến.

Chi tiết triển khai CPYThon: Việc triển khai hiện tại không thực thi một số hạn chế này, nhưng các chương trình không nên lạm dụng sự tự do này, vì việc triển khai trong tương lai có thể thực thi chúng hoặc âm thầm thay đổi ý nghĩa của chương trình. The current implementation does not enforce some of these restrictions, but programs should not abuse this freedom, as future implementations may enforce them or silently change the meaning of the program.

Lập trình viên Lưu ý:

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 là một chỉ thị cho trình phân tích cú pháp. Nó chỉ áp dụng cho mã được phân tích cú pháp cùng lúc với câu lệnh
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4. Cụ thể, câu lệnh
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 có trong một đối tượng chuỗi hoặc mã được cung cấp cho hàm
expression_stmt ::=  starred_expression
77 tích hợp không ảnh hưởng đến khối mã chứa lệnh gọi hàm và mã có trong chuỗi như vậy không bị ảnh hưởng bởi các câu lệnh
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 trong mã chứa hàm cuộc gọi. Điều tương tự cũng áp dụng cho các hàm
expression_stmt ::=  starred_expression
98 và
expression_stmt ::=  starred_expression
78.
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 is a directive to the parser. It applies only to code parsed at the same time as the
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 statement. In particular, a
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 statement contained in a string or code object supplied to the built-in
expression_stmt ::=  starred_expression
77 function does not affect the code block containing the function call, and code contained in such a string is unaffected by
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4 statements in the code containing the function call. The same applies to the
expression_stmt ::=  starred_expression
98 and
expression_stmt ::=  starred_expression
78 functions.

7.13. Tuyên bố class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3 5The class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 3 5 statement¶

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
9

Câu lệnh

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
5 khiến các định danh được liệt kê tham khảo các biến bị ràng buộc trước đó trong phạm vi kèm theo gần nhất không bao gồm toàn cầu. Điều này rất quan trọng vì hành vi mặc định để ràng buộc là tìm kiếm không gian tên cục bộ trước. Tuyên bố cho phép mã được đóng gói để lặp lại các biến bên ngoài phạm vi cục bộ bên cạnh phạm vi toàn cầu (mô -đun).

Các tên được liệt kê trong một tuyên bố

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
5, không giống như các tên được liệt kê trong một tuyên bố
class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
4, phải tham khảo các ràng buộc có sẵn trong một phạm vi kèm theo (phạm vi mà một ràng buộc mới nên được tạo ra không thể được xác định rõ ràng).

Tên được liệt kê trong một tuyên bố

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
5 không được va chạm với các ràng buộc có sẵn trong phạm vi địa phương.

Xem thêm

PEP 3104 - Truy cập vào tên trong phạm vi bên ngoài - Access to Names in Outer Scopes

Đặc điểm kỹ thuật cho tuyên bố

class Cls:
    x = 3             # class variable
inst = Cls()
inst.x = inst.x + 1   # writes inst.x as 4 leaving Cls.x as 3
5.

Các tuyên bố trong Python là gì?

7.1.Tuyên bố biểu hiện.....
7.2.Báo cáo chuyển nhượng.....
7.3.Tuyên bố khẳng định.....
7.4.Tuyên bố vượt qua.....
7.5.Tuyên bố Del.....
7.6.Tuyên bố trả lại.....
7.7.Tuyên bố năng suất.....
7.8.Tuyên bố nâng cao ..

Những tuyên bố đơn giản trong Python là gì?

Tuyên bố đơn giản trong Python như tên cho thấy, câu lệnh đơn giản được bao gồm trong một dòng duy nhất.Những loại tuyên bố này sẽ không bao giờ ảnh hưởng đến dòng chảy của chương trình.comprised in a one single line. These types of statements will never affect flow of program.

Hai loại câu lệnh trong tệp nguồn Python là gì?

Một câu lệnh là một hướng dẫn mà trình thông dịch Python có thể thực thi.Chúng tôi đã thấy hai loại tuyên bố: in và gán.print and assignment.

Các loại chức năng trong Python là gì?

Các loại chức năng Python Python tích hợp trong các chức năng.Chức năng đệ quy Python.Chức năng Python Lambda.Các chức năng do người dùng định nghĩa.Python Built-in Functions. Python Recursion Functions. Python Lambda Functions. Python User-defined Functions.