Python kiểm tra xem hai chức năng có giống nhau không
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 hiện 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 bởi 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 try_stmt ::=6 đượ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 except E as N: foo3 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 try_stmt ::= 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. ______18_______7 mệnh đề(Các) mệnh đề except E as N: foo7 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 đề except E as N: foo7 cho đến khi tìm thấy một mệnh đề phù hợp với ngoại lệ. Mệnh đề except E as N: foo7 không có biểu thức, nếu có, phải ở cuối; . Đối với mệnh đề except E as N: foo7 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 đề except E as N: foo7 khớp với ngoại lệ, việc 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 lệnh gọi. Nếu việc đánh giá một biểu thức trong tiêu đề của mệnh đề except E as N: foo7 làm phát sinh một ngoại lệ, thì quá trình 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 coi như thể toàn bộ Khi tìm thấy mệnh đề except E as N: foo7 phù hợp, ngoại lệ được chỉ định cho mục tiêu được chỉ định sau từ khóa except E as N: try: foo finally: del N8 trong mệnh đề except E as N: foo7 đó, nếu có, và bộ của mệnh đề except E as N: foo7 được thực thi. Tất cả các mệnh đề except E as N: foo7 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 đề except E as N: foo7. Điều này như thể except E as N: foo đã được dịch sang except E as N: try: foo finally: del N Đ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 đề except E as N: foo7. 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 except E as N: foo7 đượ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. ______1_______12 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 Bất kỳ trường hợp ngoại lệ nào còn lại không được xử lý bởi bất kỳ điều khoản if x < y < z: print(x); print(y); print(z)12 nào sẽ được nêu lại vào 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 trường hợp ngoại lệ đã được nêu ra từ trong các điều khoản 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. ______5_______8 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ó , , hoặc câu lệnh 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. ______1_______38 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 hiện. Nếu có một ngoại lệ đã lưu, nó sẽ được nêu 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, thì ngoại lệ đã lưu đượ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 hiện ‘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 cuối cùng được thực hiện 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. Tuyên bố 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ị Đối sánh 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ủ đề (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à 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ả bên dưới sẽ bao gồm một mô tả “bằng thuật ngữ đơn giản” về chức năng của một mẫu nhằm mục đích minh họa (ghi công cho Raymond Hettinger cho một tài liệu đã truyền cảm hứng cho hầu hết các mô tả). Lưu ý rằng những mô tả này hoàn toàn nhằm mục đích minh họa và có thể không phản ánh việc triển khai cơ bản. Hơn nữa, chúng không bao gồm tất cả các hình thức hợp lệ 8. 6. 4. 1. Mẫu HOẶ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à nếu thành công, nó sẽ đặt ____2_______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 mẫu compound_stmt ::=27 và compound_stmt ::=28 là để bày tỏ ; . e. g. compound_stmt ::=29 Nói một cách đơn giản, compound_stmt ::=30 sẽ chỉ thành công nếu compound_stmt ::=31. Đố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ì mà 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 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 đị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ủ đề, các khối 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 đấu 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ỉ khớp nếu tất cả những điều sau đây xảy ra
8. 6. 4. 9. Mẫu ánh xạMẫu ánh xạ chứa một hoặc nhiều mẫu khóa-giá trị. Cú pháp tương tự như việc xây dựng một từ điển. cú pháp 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ủ đề
Ghi chú Các cặp khóa-giá trị được so khớp bằng cách sử dụng dạng hai đối số của phương pháp 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ỉ phù hợ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 tạm thời không 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 có tham số dạng 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ố theo sau 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 không được thể hiện bằng ngữ pháp 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 dư thừa nào, mặc định thành ánh xạ trống mới cùng loại. Các tham số sau “ 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ỉ 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 chức năng có thể có chú thích “trả về” ở 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 các giá trị của một từ điển được khóa bởi tên của các 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, chú thích được lưu giữ dưới dạng chuỗi trong thời gian chạy, cho phép đánh giá bị trì hoãn. Mặt khác, chúng được đánh giá khi định nghĩa hàm được thực thi. Trong trường hợp này, các chú thích có thể được đánh giá theo thứ tự khác với thứ tự xuất hiện trong mã nguồn Cũng có thể tạo các hàm ẩn danh (các hàm không bị ràng buộc với tên), để sử dụng ngay trong các biểu thức. Điều này sử dụng các biểu thức lambda, được mô tả trong phần. 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 “_______6_______42” đượ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 kế thừa thường đưa ra một danh sách các lớp cơ sở (xem để 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 các từ khóa if_stmt ::= "if"50 hoặc if_stmt ::= "if"55 Đó là sử dụng một biểu thức if_stmt ::= "if"57 bên trong phần thân của một 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. _______6_______50 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 phương thức if_stmt ::= "if"61 trả về trực tiếp an , phương thức này 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 một câu lệnh if_stmt ::= "if"51 bên ngoài phần thân của một 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 một câu lệnh if_stmt ::= "if"52 bên ngoài phần thân của một hàm coroutine Xem thêm PEP 492 - Coroutines với cú pháp không đồng bộ và chờ đợiĐề xuất làm cho coroutines trở thành một khái niệm độc lập thích hợp trong Python và thêm cú pháp hỗ trợ chú thích 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. Chúng ta có thể so sánh hai hàm trong Python không?Hàm Python - cmp()
. Nó không trả về 'true' hoặc 'false' thay vì 'true'/'false', nó trả về giá trị âm, 0 hoặc dương dựa trên đầu vào đã cho. cmp() is an in-built function in Python, it is used to compare two objects and returns value according to the given values. It does not return 'true' or 'false' instead of 'true' / 'false', it returns negative, zero or positive value based on the given input.
Làm cách nào để so sánh các hàm trong Python?Sử dụng "=="
. Toán tử này là phương pháp được sử dụng phổ biến nhất để kiểm tra đẳng thức trong python. Toán tử trả về True và False tương ứng.
Bạn có thể có hai hàm có cùng tên trong Python không?Python không hỗ trợ nạp chồng hàm . Khi chúng ta định nghĩa nhiều hàm có cùng tên, hàm sau luôn ghi đè hàm trước và do đó, trong không gian tên, sẽ luôn có một mục duy nhất đối với mỗi tên hàm.
Tôi có thể sử dụng cùng một biến trong các hàm Python khác nhau không?Kết quả thực tế của điều này là các biến có thể được xác định và sử dụng trong một hàm Python ngay cả khi chúng có cùng tên với các biến được xác định trong các hàm khác hoặc trong chương trình chính< . . |