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 Show
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 ::= 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 range0 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 range1. 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] 2Câu lệnh được sử dụng để thực hiện có điều kiện if_stmt ::= "if" 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] 3Câ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"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] 4Câ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" 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"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"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"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] 5Câu lệnh for_stmt ::= "for"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"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 range18 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"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 range1 Đ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"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"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"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] 6Câ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
Đ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 ::=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) 87Mớ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 ::=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à
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
8. 6. 1. Tổng quanDưới đây là tổng quan về luồng logic của câu lệnh so khớp
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 ::=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 ::=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
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
8. 6. 4. MẫuGhi 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 ::=14 là compound_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ẶCMẫu OR là hai hoặc nhiều mẫu được phân tách bằng các thanh dọc compound_stmt ::=15. cú pháp compound_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 ::=16 sẽ cố gắng khớp với compound_stmt ::=17, nếu thất bại, nó sẽ cố gắng khớp với compound_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 ASMẫ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 ::=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 ::=20 không thể là một compound_stmt ::=21 Nói một cách đơn giản, compound_stmt ::=22 sẽ khớp với compound_stmt ::=23 và khi thành công, nó sẽ đặt compound_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 ::=7 Quy tắc compound_stmt ::=25 và mã thông báo compound_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 ::=27 và compound_stmt ::=28 là để thể hiện ; . e. g. compound_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 ::=33 và compound_stmt ::=34, toán tử được sử dụng 8. 6. 4. 4. Chụp mẫuMột mẫu chụp liên kết giá trị chủ đề với một tên. cú pháp compound_stmt ::=8 Một dấu gạch dưới duy nhất compound_stmt ::=21 không phải là một mẫu chụp (đây là những gì compound_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 ::=39 không hợp lệ trong khi compound_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 ::=43 sẽ luôn thành công và nó sẽ thiết lập compound_stmt ::=24 8. 6. 4. 5. Mẫu ký tự đại diệnMẫ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 ::=9 compound_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 ::=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"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 ::=50) Nói một cách đơn giản, compound_stmt ::=51 sẽ chỉ thành công nếu compound_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ómMẫ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"1 Nói một cách đơn giản, compound_stmt ::=53 có tác dụng tương tự như compound_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"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 ::=55 so với compound_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 ::=57) là một. Trong khi một mẫu duy nhất được đặt trong ngoặc vuông (e. g. compound_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ủ đề
Nói một cách đơn giản, compound_stmt ::=64 … compound_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"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ể
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 ::=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 ::=77 hoặc compound_stmt ::=78 Nói một cách đơn giản, compound_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ớpMộ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"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ủ đề
Nói một cách đơn giản, if_stmt ::= "if"16 chỉ khớp nếu điều sau đây xảy ra
Xem thêm
8. 7. Định nghĩa hàmMộ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"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"6 gần tương đương với if_stmt ::= "if"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"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"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"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"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"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"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"27” hoặc “ if_stmt ::= "if"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"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"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"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"29 hoặc if_stmt ::= "if"30. Các hàm có thể có chú thích “trả về” có dạng “ if_stmt ::= "if"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"39 của đối tượng hàm. Nếu nhập từ if_stmt ::= "if"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"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ăngThô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ếnKhả 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íchHỗ 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ớpMột định nghĩa lớp định nghĩa một đối tượng lớp (xem phần ) if_stmt ::= "if"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"0 tương đương với while_stmt ::= "while"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"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"2 gần tương đương với while_stmt ::= "while"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"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"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ìnhMới trong phiên bản 3. 5 8. 9. 1. Định nghĩa hàm coroutinewhile_stmt ::= "while"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"53 luôn là các hàm coroutine, ngay cả khi chúng không chứa từ khóa if_stmt ::= "if"50 hoặc if_stmt ::= "if"55 Đó là sử dụng biểu thức if_stmt ::= "if"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"5 Đã thay đổi trong phiên bản 3. 7. ______650 và if_stmt ::= "if"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] 51while_stmt ::= "while"6 An cung cấp một phương thức if_stmt ::= "if"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"62 của nó Câu lệnh if_stmt ::= "if"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"7 Là ngữ nghĩa tương đương với while_stmt ::= "while"8 Xem thêm và để biết chi tiết Đó là sử dụng câu lệnh if_stmt ::= "if"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] 52while_stmt ::= "while"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"0 về mặt ngữ nghĩa tương đương với for_stmt ::= "for"1 Xem thêm và để biết chi tiết Đó là sử dụng câu lệnh if_stmt ::= "if"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
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 ::=59, compound_stmt ::=60 và compound_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
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"91 của không gian tên và do đó là mục của lớp. |