Làm thế nào để bạn xác định một khoảng thời gian trong python?
Một tuyên bố đơn giản được bao gồm trong một dòng logic duy nhất. Một số câu lệnh đơ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 ::= 7. 1. Câu lệnh biểu thứcCá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à viết một giá trị hoặc (thường) để gọi một thủ tục (một hàm trả về kết quả không 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 30). Các cách sử dụng khác của câu lệnh biểu thức được cho phép và đôi khi hữu ích. Cú pháp cho một câu lệnh biểu thức là expression_stmt ::= 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) 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 30, nó sẽ được chuyển đổi thành một chuỗi bằng cách sử dụng hàm tích hợp sẵn và chuỗi kết quả được ghi vào đầu ra tiêu chuẩn trên một dòng (ngoại trừ nếu 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 30, do đó thủ tục gọi . ) 7. 2. Câu lệnh gánCác câu lệnh gán được sử dụng để (tái) 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 ::= ( (Xem phần định nghĩa cú pháp cho thuộc tính tham chiếu, đăng ký và cắt. ) 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 đơn hoặc danh sách được phân tách bằng dấu phẩy, danh sách sau mang lại một bộ) và gán đối tượng kết quả duy nhất cho từng danh sách đích, từ trái sang phải Chuyển nhượng đượ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 phép gán và quyết định về tính hợp lệ của nó và có thể đưa ra ngoại lệ nếu phép gán không được chấp nhận. Các quy tắc được tuân theo bởi các loại khác nhau và các ngoại lệ nêu ra được đưa ra cùng với định nghĩa của các loại đối tượng (xem phần ) Việc gán một đối tượng cho một danh sách đích, tùy ý đặt trong dấu ngoặc đơn hoặc dấu ngoặc vuông, được định nghĩa đệ quy như sau
Việc gán một đối tượng cho một mục tiêu được định nghĩa đệ quy như sau
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ệ sẽ 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 Mặc dù định nghĩa về phép gán ngụ ý rằng sự trùng lặp giữa bên trái và bên phải là 'đồng thời' (ví dụ: class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 305 hoán đổi hai biến), đôi khi sự trùng lặp trong tập hợp các biến được gán cho xảy ra từ trái sang phải . Chẳng hạn, chương trình sau in ra class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 306 class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 30 Xem thêm PEP 3132 - Giải nén lặp lại mở rộngThông số kỹ thuật cho tính năng class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 307 7. 2. 1. Câu lệnh gán tăng cườngPhép gán tăng cường là sự kết hợp, trong một câu lệnh, của phép toán nhị phân và câu lệnh gán class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 35 (Xem phần định nghĩa cú pháp của ba ký hiệu cuối. ) Một phép gán 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ể giải nén) và danh sách biểu thức, thực hiện thao tác nhị phân cụ thể cho loại phép 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ư class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 308 có thể được viết lại thành class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 309 để đạt được hiệu quả tương tự, nhưng không chính xác như nhau. Trong phiên bản tăng cường, class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 350 chỉ được đánh giá một lần. Ngoài ra, khi có thể, thao tác thực tế được thực hiện tại chỗ, nghĩa là thay vì tạo một đối tượng mới và gán đối tượng đó cho mục tiêu, thay vào đó, đối tượng cũ sẽ được sửa đổi Không giống như các bài tập thông thường, các bài tập tăng cường đánh giá vế trái trước khi đánh giá vế phải. Ví dụ, trước tiên, class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 351 tra cứu class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 352, sau đó đánh giá class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 353 và thực hiện phép cộng, cuối cùng, nó ghi kết quả trở lại class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 352 Ngoại trừ việc gán cho các bộ và nhiều mục tiêu trong một câu lệnh, phép gán được thực hiện bởi các câu lệnh gán tăng cường được xử lý giống như cách gán thông thường. Tương tự, ngoại trừ hành vi tại chỗ có thể xảy ra, phép toán nhị phân được thực hiện bằng phép gán tăng cường cũng giống như phép toán nhị phân thông thường Đối với các mục tiêu là tham chiếu thuộc tính, áp dụng tương tự như đối với các nhiệm vụ thông thường 7. 2. 2. Các câu lệnh gán được chú thíchphép gán là sự kết hợp, trong một câu lệnh, của một chú thích biến hoặc thuộc tính và một câu lệnh gán tùy chọn expression_stmt ::= 3Sự khác biệt so với bình thường là chỉ cho phép một mục tiêu duy nhất Đối với các tên đơn giản làm 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 mô-đun hoặc lớp đặc biệt class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 355 là ánh xạ từ điển từ các tên biến (được đọc sai nếu là riêng tư) đến các chú thích được đánh giá. Thuộc tính này có thể ghi và được tạo tự động khi bắt đầu thực thi phần thân của lớp hoặc mô-đun, nếu các chú thích được tìm thấy tĩnh Đố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 phạm vi lớp hoặc 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 chức năng, 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 phía bên tay phải xuất hiện, một phép gán có chú thích sẽ thực hiện phép gán 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ừ lệnh gọi class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 304 hoặc class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 357 cuối cùng Xem thêm PEP 526 - Cú pháp cho chú thích biếnĐề xuất đã thêm cú pháp để chú thích các loại biến (bao gồm biến lớp và biến thể hiện), thay vì thể hiện chúng thông qua nhận xét PEP 484 - Nhập gợi ýĐề xuất đã thêm mô-đun để 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ụ và IDE phân tích tĩnh Đã thay đổi trong phiên bản 3. 8. Giờ đây, các phép gán có chú thích cho phép các biểu thức giống nhau ở phía bên tay phải như các phép gán thông thường. Trước đây, một số biểu thức (như biểu thức bộ không được đặt trong ngoặc đơn) gây ra lỗi cú pháp. 7. 3. 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 59Các câu lệnh khẳng định là một cách thuận tiện để chèn các xác nhận gỡ lỗi vào chương trình expression_stmt ::= 8Dạng đơn giản, expression_stmt ::= 30, tương đương vớiclass Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 30 Dạng mở rộng, expression_stmt ::= 31, tương đương vớiclass Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 32 Những sự tương đương này giả định rằng và đề cập đến các biến tích hợp với các tên đó. Trong triển khai hiện tại, biến tích hợp là expression_stmt ::= 35 trong các trường hợp bình thường, expression_stmt ::= 36 khi yêu cầu tối ưu hóa (tùy chọn dòng lệnh). Trình tạo mã hiện tại không phát ra mã nào cho câu lệnh xác nhận khi tối ưu hóa được yêu cầu tại 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 bị lỗi trong thông báo lỗi; Chuyển nhượng 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. Câu lệnh expression_stmt ::= starred_expression 39expression_stmt ::= 0là một hoạt động null - khi nó được thực thi, không có gì xảy ra. Nó hữu ích như một trình giữ chỗ khi một câu lệnh được yêu cầu về mặt cú pháp, nhưng không cần thực thi mã nào, chẳng hạn expression_stmt ::= 17. 5. Câu lệnh expression_stmt ::= starred_expression 81expression_stmt ::= 2Việc xóa được định nghĩa đệ quy rất giống với cách xác định phép gán. Thay vì đánh vần nó một cách chi tiết, đâ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ẽ xóa ràng buộc 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 đó có xuất hiện trong một câu lệnh trong cùng một khối mã hay không. Nếu tên không bị ràng buộc, một ngoại lệ sẽ được nêu ra Việc xóa tham chiếu thuộc tính, đăng ký và cắt lát được chuyển đến đối tượng chính có liên quan; Đã thay đổi trong phiên bản 3. 2. Trước đây, việc xóa một tên khỏi không gian tên cục bộ là bất hợp pháp nếu tên đó xuất hiện dưới dạng một biến tự do trong một khối lồng nhau. 7. 6. Câu lệnh expression_stmt ::= starred_expression 84expression_stmt ::= 3chỉ có thể xảy ra lồng nhau về mặt cú pháp trong định nghĩa hàm, không phải trong định nghĩa lớp lồng nhau Nếu có một danh sách biểu thức, nó sẽ được đánh giá, nếu không thì _____10 được thay thế rời khỏi lệnh 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 30) làm giá trị trả về Khi chuyển quyền kiểm soát ra khỏi câu lệnh có mệnh đề, mệnh đề class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 301 đó được thực thi trước khi thực sự rời khỏi hàm Trong một hàm trình tạo, câu lệnh chỉ ra rằng trình tạo đã hoàn thành và sẽ được nâng lên. Giá trị trả về (nếu có) được dùng làm đối số để khởi tạo và trở thành thuộc tính class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 306 Trong hàm tạo không đồng bộ, một câu lệnh trống cho biết rằng trình tạo không đồng bộ đã hoàn thành và sẽ gây ra sự cố. Câu lệnh expression_stmt ::= 84 không trống là lỗi cú pháp trong hàm tạo không đồng bộ7. 7. 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 20expression_stmt ::= 4Một câu lệnh tương đương về mặt ngữ nghĩa với một. Câu lệnh năng suất có thể được sử dụng để bỏ qua dấu ngoặc đơn mà 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ụ, báo cáo năng suất expression_stmt ::= 5tương đương với các câu lệnh biểu thức năng suất expression_stmt ::= 6Biểu thức và câu lệnh lợi nhuận chỉ được sử dụng khi xác định hàm và chỉ được sử dụng trong phần thân của hàm tạo. Sử dụng năng suất trong định nghĩa hàm là đủ để khiến định nghĩa đó tạo hàm tạo thay vì hàm thông thường Để biết đầy đủ chi tiết về ngữ nghĩa, hãy tham khảo phần 7. 8. 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 23expression_stmt ::= 7Nếu không có biểu thức nào, hãy tăng lại ngoại lệ hiện đang được xử lý, còn được gọi là ngoại lệ đang hoạt động. Nếu hiện không có ngoại lệ đang hoạt động, một ngoại lệ sẽ xuất hiện cho biết đây là lỗi Mặt khác, đá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 của. Nếu nó là một lớp, thể hiện ngoại lệ sẽ được lấy 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 của thể hiện ngoại lệ, giá trị là chính thể hiện đó Một đối tượng truy nguyên thường được tạo tự động khi một ngoại lệ được đưa ra và gắn với nó dưới dạng thuộc tính class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 328, có thể ghi được. Bạn có thể tạo một ngoại lệ và đặt truy nguyên của riêng mình trong một bước bằng cách sử dụng phương thức ngoại lệ (trả về cùng một phiên bản ngoại lệ, với truy nguyên được đặt thành đối số của nó), như vậy expression_stmt ::= 8Mệnh đề expression_stmt ::= 00 được sử dụng cho chuỗi ngoại lệ. nếu được cung cấp, biểu thức thứ hai phải là một lớp hoặc thể hiện ngoại lệ khác. Nếu biểu thức thứ hai là một trường hợp ngoại lệ, thì nó sẽ được gắn vào ngoại lệ được nêu dưới dạng thuộc tính expression_stmt ::= 01 (có thể ghi được). Nếu biểu thức là một lớp ngoại lệ, thì lớp đó sẽ được khởi tạo và thể hiện ngoại lệ kết quả sẽ được đính kèm với ngoại lệ được nêu dưới dạng thuộc tính expression_stmt ::= 01. Nếu ngoại lệ nêu ra không được xử lý, cả hai ngoại lệ sẽ được inexpression_stmt ::= 9Một cơ chế tương tự hoạt động hoàn toàn nếu một ngoại lệ mới được đưa ra khi một ngoại lệ đã được xử lý. Một ngoại lệ có thể được xử lý khi một hoặc mệnh đề hoặc một câu lệnh được sử dụng. Sau đó, ngoại lệ trước được đính kèm dưới dạng thuộc tính expression_stmt ::= 06 của ngoại lệ mớiassignment_stmt ::= (0 Chuỗi ngoại lệ có thể bị triệt tiêu rõ ràng bằng cách chỉ định trong mệnh đề expression_stmt ::= 00assignment_stmt ::= (1 Thông tin bổ sung về các trường hợp ngoại lệ có trong phần và thông tin về cách xử lý các trường hợp ngoại lệ có trong phần Đã thay đổi trong phiên bản 3. 3. hiện được cho phép là expression_stmt ::= 10 trong expression_stmt ::= 11. Mới trong phiên bản 3. 3. Thuộc tính expression_stmt ::= 12 để chặn hiển thị tự động ngữ cảnh ngoại lệ. Đã thay đổi trong phiên bản 3. 11. Nếu truy nguyên của ngoại lệ đang hoạt động được sửa đổi trong một mệnh đề, 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 323 tiếp theo sẽ kích hoạt lại ngoại lệ với truy nguyên đã sửa đổi. Trước đây, ngoại lệ đã được đưa ra lại với truy nguyên mà nó có khi bị bắt. 7. 9. Câu lệnh expression_stmt ::= starred_expression 15assignment_stmt ::= (2 chỉ có thể xảy ra lồng nhau về mặt cú pháp trong vòng lặp hoặc, nhưng không được lồng trong định nghĩa hàm hoặc lớp trong vòng lặp đó Nó kết thúc vòng lặp kèm theo gần nhất, bỏ qua mệnh đề expression_stmt ::= 19 tùy chọn nếu vòng lặp có mộtNếu một vòng lặp bị kết thúc bởi , mục tiêu điều khiển vòng lặp sẽ giữ nguyên giá trị hiện tại của nó Khi chuyển điều khiển ra khỏi câu lệnh có mệnh đề, mệnh đề class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 301 đó được thực thi trước khi thực sự rời khỏi vòng lặp 7. 10. Câu lệnh expression_stmt ::= starred_expression 26assignment_stmt ::= (3 chỉ có thể xảy ra lồng nhau về mặt cú pháp trong vòng lặp hoặc, nhưng không được lồng trong định nghĩa hàm hoặc 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 kèm theo gần nhất Khi chuyển điều khiển ra khỏi câu lệnh có mệnh đề, mệnh đề class Cls: x = 3 # class variable inst = Cls() inst.x = inst.x + 1 # writes inst.x as 4 leaving Cls.x as 301 đó được thực thi trước khi thực sự bắt đầu chu kỳ vòng lặp tiếp theo 7. 11. Câu lệnh expression_stmt ::= starred_expression 34assignment_stmt ::= (4 Câu lệnh nhập cơ bản (không có mệnh đề) được thực hiện theo hai bước
Khi câu lệnh chứa nhiều mệnh đề (được phân tách bằng dấu phẩy), hai bước được thực hiện riêng cho từng mệnh đề, giống như thể các mệnh đề đã được tách ra thành các câu lệnh nhập riêng lẻ Chi tiết của bước đầu tiên, tìm và tải mô-đun, được mô tả chi tiết hơn trong phần trên , phần này 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 hook có thể được sử dụng để tùy chỉnh . Lưu ý rằng các lỗi trong bước này có thể cho biết không thể định vị mô-đun hoặc đã xảy ra lỗi khi khởi chạy mô-đun, bao gồm cả việc thực thi mã của mô-đun Nếu mô-đun được yêu cầu được truy xuất thành công, mô-đun đó sẽ được cung cấp trong không gian tên cục bộ theo một trong ba cách
Biểu mẫu sử dụng quy trình phức tạp hơn một chút
ví dụ assignment_stmt ::= (5 Nếu danh sách các mã định danh được thay thế bằng một dấu sao ( expression_stmt ::= 44), tất cả các tên công khai được xác định trong mô-đun sẽ bị ràng buộc trong không gian tên cục bộ cho phạm vi xảy ra câu lệnhTê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 của mô-đun để tìm một biến có tên là expression_stmt ::= 46; . Các tên được đưa ra trong expression_stmt ::= 46 đều được coi là công khai và bắt buộc phải tồn tại. Nếu expression_stmt ::= 46 không được xác định, tập hợp 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 của mô-đun không bắt đầu bằng ký tự gạch dưới (expression_stmt ::= 49). expression_stmt ::= 46 phải chứa toàn bộ API công khai. Mục đích là để 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ư mô-đun thư viện đã được nhập và sử dụng trong mô-đun)Hình thức nhập thẻ đại diện - expression_stmt ::= 51 - chỉ được phép ở cấp độ mô-đun. Việc cố gắng sử dụng nó trong các định nghĩa lớp hoặc hàm sẽ làm tăngKhi chỉ định mô-đun nào sẽ 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 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 ở đầu trong mô-đun hoặc gói được chỉ định sau khi bạn có thể chỉ định độ cao để duyệ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 dấu chấm ở đầu có nghĩa là gói hiện tại nơi mô-đun thực hiện nhập tồn tại. Hai dấu chấm có nghĩa là lên một cấp độ gói. Ba chấm là tăng hai cấp độ, v.v. Vì vậy, nếu bạn thực thi expression_stmt ::= 54 từ một mô-đun trong gói expression_stmt ::= 55 thì cuối cùng bạn sẽ nhập expression_stmt ::= 56. Nếu bạn thực hiện expression_stmt ::= 57 từ bên trong expression_stmt ::= 58, bạn sẽ nhập expression_stmt ::= 59. Thông số kỹ thuật cho nhập khẩu tương đối có trong phầnđượ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 expression_stmt ::= 34 với các đối số expression_stmt ::= 62, expression_stmt ::= 63, expression_stmt ::= 64, expression_stmt ::= 65, expression_stmt ::= 667. 11. 1. Các câu lệnh trong tương laiCâu lệnh tương lai là một chỉ thị cho trình biên dịch rằng một mô-đun cụ thể sẽ đượ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 được chỉ định trong tương lai khi tính năng này trở thành tiêu chuẩn Câu lệnh 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 đưa ra các thay đổi không tương thích đối với ngôn ngữ. Nó cho phép sử dụng các tính năng mới trên cơ sở từng mô-đun trước khi phát hành trong đó tính năng này trở thành tiêu chuẩn assignment_stmt ::= (6 Một tuyên bố trong tương lai phải xuất hiện gần đầu 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à
Tính năng duy nhất yêu cầu sử dụng câu lệnh tương lai là expression_stmt ::= 67 (xem PEP 563)Tất cả các tính năng lịch sử được kích hoạt bởi câu lệnh tương lai vẫn được Python 3 công nhận. Danh sách bao gồm expression_stmt ::= 68, expression_stmt ::= 69, expression_stmt ::= 70, expression_stmt ::= 71, expression_stmt ::= 72, expression_stmt ::= 73, expression_stmt ::= 74 và expression_stmt ::= 75. Tất cả chúng đều dư thừa vì chúng luôn được bật và chỉ được giữ để tương thích ngượcMộ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 về ngữ nghĩa của các cấu trúc lõi thường được thực hiện bằng cách tạo các mã khác nhau. Thậm chí có thể xảy ra trường hợp một tính năng mới giới thiệu cú pháp không tương thích mới (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 cú pháp mô-đun theo cách khác. Những quyết định như vậy không thể bị đẩy ra cho đến khi thời gian chạy Đối với bất kỳ bản phát hành cụ thể nào, trình biên dịch biết tên tính năng nào đã được xác định và phát sinh 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 mà nó không biết 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, được mô tả sau và nó sẽ được nhập theo cách thông thường vào thời điểm câu lệnh tương lai được thực thi 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 câu lệnh tương lai Lưu ý rằng không có gì đặc biệt về tuyên bố assignment_stmt ::= (7 Đó không phải là một tuyên bố trong tương lai; Theo mặc định, mã được biên dịch bởi các lệnh gọi đến các hàm tích hợp và xảy ra trong mô-đun expression_stmt ::= 79 có chứa câu lệnh tương lai sẽ sử dụng cú pháp hoặc ngữ nghĩa mới được liên kết với câu lệnh tương lai. Điều này có thể được kiểm soát bởi các đối số tùy chọn để — xem tài liệu về chức năng đó để biết chi tiếtMột câu lệnh trong tương lai được nhập tại dấu nhắc phiên dịch tương tác sẽ có hiệu lực trong 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, được chuyển một 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 được bắt đầu sau khi tập lệnh được thực thi Xem thêm PEP 236 - Quay lại __tương lai__Đề xuất ban đầu cho cơ chế __future__ 7. 12. 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 4assignment_stmt ::= (8 Câu lệnh là một tuyên bố giữ cho toàn bộ khối mã hiện tại. Điều đó có nghĩa là các mã định danh được liệt kê sẽ được hiểu là toàn cầu. Sẽ không thể gán cho một biến toàn cầu nếu 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 34, mặc dù các biến tự do có thể đề cập đến các biến toàn cục mà không được khai báo toàn cầu Các tên được liệt kê trong một câu lệnh không được sử dụng trong cùng một khối mã theo văn bản trướ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 34 đó Các tên được liệt kê trong câu lệnh không được định nghĩa là tham số hình thức, hoặc là đích trong câu lệnh hoặc mệnh đề, hoặc trong danh sách đích, định nghĩa, định nghĩa hàm, câu lệnh 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 quyền tự do này, vì cá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 Ghi chú của lập trình viên. 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 34. Cụ thể, 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 34 chứa trong một chuỗi hoặc đối tượng mã được cung cấp cho hàm dựng sẵn không ảnh hưởng đến khối mã chứa lệnh gọi hàm và mã chứa trong một 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 34 trong mã chứa lệnh gọi hàm. Điều tương tự cũng áp dụng cho các hàm và 7. 13. 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 5assignment_stmt ::= (9 Câu lệnh khiến các mã định danh được liệt kê tham chiếu đến 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 để liên kết là tìm kiếm không gian tên cục bộ trước. Câu lệnh cho phép mã được đóng gói để khởi động lại các biến bên ngoài phạm vi cục bộ bên cạnh phạm vi (mô-đun) toàn cầu Các tên được liệt kê trong một câu lệnh, không giống như những tên được liệt kê trong một câu lệnh, phải tham chiếu đến các liên kết có sẵn trong một phạm vi kèm theo (không thể xác định rõ ràng phạm vi trong đó một liên kết mới sẽ được tạo) Làm thế nào là một khoảng thời gian được sử dụng trong Python?Trong python, dấu chấm truy cập các phương thức (hàm) và thuộc tính (dữ liệu) của đối tượng .
Biến Python có thể có dấu chấm không?Ngoại trừ các biến phạm vi Cookie và Máy khách luôn phải là các loại biến đơn giản, thông thường bạn không thể bao gồm dấu chấm trong các tên biến đơn giản .
Dấu chấm có nghĩa là gì trong Python?Ký hiệu dấu chấm cho biết bạn đang truy cập dữ liệu hoặc hành vi cho một loại đối tượng cụ thể . Khi bạn sử dụng ký hiệu dấu chấm, bạn cho Python biết rằng bạn muốn chạy một thao tác cụ thể trên đó hoặc truy cập một thuộc tính cụ thể của một loại đối tượng.
Điều gì xảy ra nếu bạn đặt dấu chấm ở cuối câu lệnh trong Python?Vì một người trả lời khác gần như đúng, nên việc thêm dấu chấm vào cuối biểu thức Python sẽ gây ra lỗi cú pháp . Các khoảng thời gian thường được dành riêng để truy cập các phương thức/thuộc tính của một thể hiện của một lớp hoặc các hàm trong một mô-đun. |