Jacob wrote: a[[0, *[0, 0], 0]] which passes the *list* [0, 0, 0, 0] into __getitem__. In numpy, passing lists into __getitem__ does things like array([1, 10, 100])[[2, 1]] --> array([100, 10]). But I think Peter is requesting that the following work: a[0, *[0, 0], 0] (this is currently a SyntaxError) and the proposal is that it would pass the *tuple* (0, 0, 0, 0) into __getitem__, indexing into each dimension of the array. A workaround is to use a[(0, *[0, 0], 0)] -- just one extra pair of parentheses. This is a duplicate of https://bugs.python.org/issue43812 , where it was pointed out that this is currently being proposed as part of https://www.python.org/dev/peps/pep-0646/#implications , which it appears is in the queue of things for the steering council to rule on. I'll close this as a duplicate for now, but feel free to re-open if you feel something is missing from that PEP. Ghi chú cú pháp. Trong chương này và các chương tiếp theo, ký hiệu BNF mở rộng sẽ được sử dụng để mô tả cú pháp, không phải phân tích từ vựng. Khi (một thay thế của) quy tắc cú pháp có dạng Show
name ::= và không có ngữ nghĩa nào được đưa ra, ngữ nghĩa của dạng parenth_form ::= "(" [ 4 này giống như đối với parenth_form ::= "(" [ 56. 1. Chuyển đổi số họcKhi mô tả toán tử số học bên dưới sử dụng cụm từ "các đối số số được chuyển đổi thành một loại phổ biến", điều này có nghĩa là việc triển khai toán tử cho các loại tích hợp hoạt động như sau
Một số quy tắc bổ sung áp dụng cho một số nhà khai thác nhất định (e. g. , một chuỗi làm đối số bên trái cho toán tử '%'). Các tiện ích mở rộng phải xác định hành vi chuyển đổi của riêng chúng 6. 2. Nguyên tửNguyên tử là phần tử cơ bản nhất của biểu thức. Các nguyên tử đơn giản nhất là định danh hoặc chữ. Các hình thức được đặt trong ngoặc đơn, dấu ngoặc hoặc dấu ngoặc nhọn cũng được phân loại theo cú pháp là nguyên tử. Cú pháp cho các nguyên tử là atom ::= 6. 2. 1. Số nhận dạng (Tên)Một định danh xảy ra như một nguyên tử là một tên. Xem phần định nghĩa từ vựng và phần tài liệu hướng dẫn đặt tên và ràng buộc Khi tên được liên kết với một đối tượng, việc đánh giá nguyên tử sẽ mang lại đối tượng đó. Khi một tên không bị ràng buộc, một nỗ lực để đánh giá nó sẽ tạo ra một ngoại lệ xáo trộn tên riêng. Khi một mã định danh xuất hiện theo văn bản trong định nghĩa lớp bắt đầu bằng hai hoặc nhiều ký tự gạch dưới và không kết thúc bằng hai hoặc nhiều dấu gạch dưới, thì nó được coi là tên riêng của lớp đó. Tên riêng được chuyển thành dạng dài hơn trước khi tạo mã cho chúng. Phép biến đổi chèn tên lớp, loại bỏ dấu gạch dưới ở đầu và chèn một dấu gạch dưới vào trước tên. Ví dụ: định danh parenth_form ::= "(" [ 7 xuất hiện trong một lớp có tên parenth_form ::= "(" [ 8 sẽ được chuyển đổi thành parenth_form ::= "(" [ 9. Sự chuyển đổi này độc lập với ngữ cảnh cú pháp trong đó định danh được sử dụng. Nếu tên được chuyển đổi quá dài (dài hơn 255 ký tự), việc cắt bớt do triển khai xác định có thể xảy ra. Nếu tên lớp chỉ bao gồm dấu gạch dưới, thì không có chuyển đổi nào được thực hiện6. 2. 2. ChữPython hỗ trợ các chuỗi ký tự và byte cũng như các ký tự số khác nhau ________số 8_______Đánh giá một chữ tạo ra một đối tượng thuộc loại đã cho (chuỗi, byte, số nguyên, số dấu phẩy động, số phức) với giá trị đã cho. Giá trị có thể được tính gần đúng trong trường hợp dấu phẩy động và ký tự ảo (phức tạp). Xem phần để biết chi tiết Tất cả các chữ tương ứng với các loại dữ liệu bất biến và do đó, danh tính của đối tượng ít quan trọng hơn giá trị của nó. Nhiều đánh giá của các chữ có cùng giá trị (cùng một lần xuất hiện trong văn bản chương trình hoặc một lần xuất hiện khác) có thể thu được cùng một đối tượng hoặc một đối tượng khác có cùng giá trị 6. 2. 3. Biểu mẫu được đặt trong ngoặc đơnBiểu mẫu có dấu ngoặc đơn là danh sách biểu thức tùy chọn được đặt trong dấu ngoặc đơn parenth_form ::= "(" [ Danh sách biểu thức được đặt trong ngoặc đơn mang lại bất kỳ thứ gì mà danh sách biểu thức đó mang lại. nếu danh sách chứa ít nhất một dấu phẩy, thì nó tạo ra một bộ; Một cặp dấu ngoặc rỗng tạo ra một đối tượng tuple trống. Vì các bộ dữ liệu là bất biến, các quy tắc tương tự như đối với nghĩa đen được áp dụng (i. e. , hai lần xuất hiện của bộ dữ liệu trống có thể hoặc không thể mang lại cùng một đối tượng) Lưu ý rằng các bộ dữ liệu không được hình thành bởi dấu ngoặc đơn, mà bằng cách sử dụng dấu phẩy. Ngoại lệ là bộ dữ liệu trống, trong đó bắt buộc phải có dấu ngoặc đơn — việc cho phép “không có gì” không được đặt trong ngoặc đơn trong các biểu thức sẽ gây ra sự mơ hồ và cho phép các lỗi đánh máy phổ biến không được phát hiện 6. 2. 4. Hiển thị cho danh sách, bộ và từ điểnĐể xây dựng một danh sách, một tập hợp hoặc một từ điển, Python cung cấp cú pháp đặc biệt gọi là "hiển thị", mỗi cú pháp có hai loại
Các yếu tố cú pháp phổ biến để hiểu là comprehension ::= The comprehension consists of a single expression followed by at least one comprehension ::=0 clause and zero or more comprehension ::=0 or comprehension ::=2 clauses. In this case, the elements of the new container are those that would be produced by considering each of the comprehension ::=0 or comprehension ::=2 clauses a block, nesting from left to right, and evaluating the expression to produce an element each time the innermost block is reached However, aside from the iterable expression in the leftmost comprehension ::=0 clause, the comprehension is executed in a separate implicitly nested scope. This ensures that names assigned to in the target list don’t “leak” into the enclosing scope The iterable expression in the leftmost comprehension ::=0 clause is evaluated directly in the enclosing scope and then passed as an argument to the implicitly nested scope. Subsequent comprehension ::=0 clauses and any filter condition in the leftmost comprehension ::=0 clause cannot be evaluated in the enclosing scope as they may depend on the values obtained from the leftmost iterable. For example. comprehension ::=9 To ensure the comprehension always results in a container of the appropriate type, list_display ::= "[" [0 and list_display ::= "[" [1 expressions are prohibited in the implicitly nested scope Since Python 3. 6, in an function, an list_display ::= "[" [3 clause may be used to iterate over a . A comprehension in an list_display ::= "[" [2 function may consist of either a comprehension ::=0 or list_display ::= "[" [3 clause following the leading expression, may contain additional comprehension ::=0 or list_display ::= "[" [3 clauses, and may also use expressions. If a comprehension contains either list_display ::= "[" [3 clauses or list_display ::= "[" [9 expressions or other asynchronous comprehensions it is called an asynchronous comprehension. An asynchronous comprehension may suspend the execution of the coroutine function in which it appears. See also PEP 530 New in version 3. 6. Asynchronous comprehensions were introduced. Changed in version 3. 8. list_display ::= "[" [0 and list_display ::= "[" [1 prohibited in the implicitly nested scope. Changed in version 3. 11. Asynchronous comprehensions are now allowed inside comprehensions in asynchronous functions. Outer comprehensions implicitly become asynchronous. 6. 2. 5. List displaysHiển thị danh sách là một chuỗi các biểu thức có thể trống được đặt trong dấu ngoặc vuông list_display ::= "[" [ Hiển thị danh sách mang lại một đối tượng danh sách mới, nội dung được chỉ định bởi một danh sách các biểu thức hoặc một cách hiểu. Khi một danh sách các biểu thức được phân tách bằng dấu phẩy được cung cấp, các phần tử của nó được đánh giá từ trái sang phải và được đặt vào đối tượng danh sách theo thứ tự đó. Khi một sự hiểu biết được cung cấp, danh sách được xây dựng từ các yếu tố do sự hiểu biết 6. 2. 6. Đặt hiển thịHiển thị tập hợp được biểu thị bằng dấu ngoặc nhọn và có thể phân biệt với hiển thị từ điển do không có dấu hai chấm ngăn cách các khóa và giá trị set_display ::= "{" ( Một màn hình tập hợp tạo ra một đối tượng tập hợp có thể thay đổi mới, nội dung được chỉ định bởi một chuỗi các biểu thức hoặc một cách hiểu. Khi một danh sách các biểu thức được phân tách bằng dấu phẩy được cung cấp, các phần tử của nó được đánh giá từ trái sang phải và được thêm vào đối tượng đã đặt. Khi một sự hiểu biết được cung cấp, tập hợp được xây dựng từ các yếu tố do sự hiểu biết Một tập hợp rỗng không thể được xây dựng với set_display ::= "{" (4; 6. 2. 7. Hiển thị từ điểnHiển thị từ điển là một chuỗi các cặp khóa/mốc có thể trống được đặt trong dấu ngoặc nhọn dict_display ::= "{" [ Một màn hình từ điển mang lại một đối tượng từ điển mới Nếu một chuỗi các cặp khóa/dữ liệu được phân tách bằng dấu phẩy được cung cấp, chúng sẽ được đánh giá từ trái sang phải để xác định các mục nhập của từ điển. mỗi đối tượng khóa được sử dụng làm khóa vào từ điển để lưu dữ liệu tương ứng. Điều này có nghĩa là bạn có thể chỉ định cùng một khóa nhiều lần trong danh sách khóa/mốc và giá trị từ điển cuối cùng cho khóa đó sẽ là giá trị cuối cùng được cung cấp Dấu hoa thị kép set_display ::= "{" (5 biểu thị giải nén từ điển. Toán hạng của nó phải là một. Mỗi mục ánh xạ được thêm vào từ điển mới. Các giá trị sau này thay thế các giá trị đã được đặt bởi các cặp khóa/dữ liệu trước đó và các lần giải nén từ điển trước đó Mới trong phiên bản 3. 5. Giải nén vào màn hình từ điển, do PEP 448 đề xuất ban đầu. Khả năng hiểu chính tả, trái ngược với khả năng hiểu danh sách và tập hợp, cần hai biểu thức được phân tách bằng dấu hai chấm, theo sau là các mệnh đề “for” và “if” thông thường. Khi quá trình hiểu được chạy, các thành phần khóa và giá trị kết quả được chèn vào từ điển mới theo thứ tự chúng được tạo Các hạn chế về loại giá trị khóa được liệt kê trước đó trong phần. (Tóm lại, loại khóa phải là , loại trừ tất cả các đối tượng có thể thay đổi. ) Không phát hiện xung đột giữa các phím trùng lặp; Đã thay đổi trong phiên bản 3. 8. Trước Python 3. 8, trong phần hiểu chính tả, thứ tự đánh giá của khóa và giá trị không được xác định rõ. Trong CPython, giá trị được đánh giá trước khóa. Bắt đầu với 3. 8, khóa được đánh giá trước giá trị, theo đề xuất của PEP 572. 6. 2. 8. Biểu thức trình tạoBiểu thức trình tạo là một ký hiệu trình tạo nhỏ gọn trong ngoặc đơn generator_expression ::= "(" Một biểu thức trình tạo mang lại một đối tượng trình tạo mới. Cú pháp của nó giống như cú pháp để hiểu, ngoại trừ việc nó được đặt trong dấu ngoặc đơn thay vì dấu ngoặc nhọn hoặc dấu ngoặc nhọn Các biến được sử dụng trong biểu thức trình tạo được đánh giá một cách lười biếng khi phương thức được gọi cho đối tượng trình tạo (theo cách tương tự như các trình tạo thông thường). Tuy nhiên, biểu thức lặp trong mệnh đề comprehension ::=0 ngoài cùng bên trái được đánh giá ngay lập tức, do đó, một lỗi do nó tạo ra sẽ được phát ra tại điểm mà biểu thức trình tạo được xác định, thay vì tại điểm mà giá trị đầu tiên được truy xuất. Các mệnh đề comprehension ::=0 tiếp theo và bất kỳ điều kiện lọc nào trong mệnh đề comprehension ::=0 ngoài cùng bên trái không thể được đánh giá trong phạm vi kèm theo vì chúng có thể phụ thuộc vào các giá trị thu được từ lần lặp ngoài cùng bên trái. Ví dụ. dict_display ::= "{" [0 Các dấu ngoặc đơn có thể được bỏ qua trên các cuộc gọi chỉ với một đối số. Xem phần để biết chi tiết Để tránh cản trở hoạt động dự kiến của chính biểu thức trình tạo, các biểu thức list_display ::= "[" [0 và list_display ::= "[" [1 bị cấm trong trình tạo được xác định ngầm định Nếu một biểu thức trình tạo chứa các mệnh đề hoặc biểu thức list_display ::= "[" [3 thì nó được gọi là biểu thức trình tạo không đồng bộ. Một biểu thức trình tạo không đồng bộ trả về một đối tượng trình tạo không đồng bộ mới, là một trình lặp không đồng bộ (xem phần ) Mới trong phiên bản 3. 6. Các biểu thức trình tạo không đồng bộ đã được giới thiệu. Đã thay đổi trong phiên bản 3. 7. Trước Python 3. 7, các biểu thức trình tạo không đồng bộ chỉ có thể xuất hiện trong coroutines. Bắt đầu với 3. 7, bất kỳ hàm nào cũng có thể sử dụng các biểu thức trình tạo không đồng bộ. Changed in version 3. 8. list_display ::= "[" [0 and list_display ::= "[" [1 prohibited in the implicitly nested scope. 6. 2. 9. Biểu thức năng suấtyield_atom ::= "(" Biểu thức năng suất được sử dụng khi xác định hàm hoặc chức năng và do đó chỉ có thể được sử dụng trong phần thân của định nghĩa hàm. Sử dụng biểu thức năng suất trong phần thân của hàm sẽ khiến hàm đó trở thành hàm tạo và sử dụng nó trong phần thân của hàm sẽ khiến hàm coroutine đó trở thành hàm tạo không đồng bộ. Ví dụ atom ::=0 Do các tác dụng phụ của chúng đối với phạm vi chứa, các biểu thức list_display ::= "[" [0 không được phép như một phần của phạm vi được xác định ngầm được sử dụng để thực hiện các biểu thức hiểu và trình tạo Đã thay đổi trong phiên bản 3. 8. Các biểu thức lợi nhuận bị cấm trong các phạm vi lồng nhau ngầm được sử dụng để triển khai các biểu thức trình tạo và hiểu. Các chức năng của trình tạo được mô tả bên dưới, trong khi các chức năng của trình tạo không đồng bộ được mô tả riêng trong phần When a generator function is called, it returns an iterator known as a generator. Trình tạo đó sau đó điều khiển việc thực thi chức năng của trình tạo. Quá trình thực thi bắt đầu khi một trong các phương thức của trình tạo được gọi. Tại thời điểm đó, quá trình thực thi tiếp tục với biểu thức lợi nhuận đầu tiên, ở đó nó bị treo lại, trả về giá trị của cho trình gọi của trình tạo hoặc generator_expression ::= "("1 nếu bị bỏ qua. Bằng cách treo, chúng tôi muốn nói rằng tất cả trạng thái cục bộ được giữ lại, bao gồm các ràng buộc hiện tại của biến cục bộ, con trỏ lệnh, ngăn xếp đánh giá nội bộ và trạng thái của bất kỳ xử lý ngoại lệ nào. Khi thực thi được tiếp tục bằng cách gọi một trong các phương thức của trình tạo, hàm có thể tiến hành chính xác như thể biểu thức năng suất chỉ là một lệnh gọi bên ngoài khác. Giá trị của biểu thức năng suất sau khi tiếp tục phụ thuộc vào phương thức đã tiếp tục thực thi. Nếu được sử dụng (thường thông qua a hoặc nội trang) thì kết quả là. Mặt khác, nếu được sử dụng, thì kết quả sẽ là giá trị được truyền vào phương thức đó Tất cả những điều này làm cho các chức năng của trình tạo khá giống với coroutines; . Sự khác biệt duy nhất là một hàm tạo không thể kiểm soát nơi thực thi sẽ tiếp tục sau khi nó mang lại kết quả; Biểu thức năng suất được phép ở bất kỳ đâu trong cấu trúc. Nếu trình tạo không được tiếp tục trước khi nó được hoàn thiện (bằng cách đạt đến số tham chiếu bằng 0 hoặc bằng cách thu gom rác), phương thức của trình tạo-iterator sẽ được gọi, cho phép mọi mệnh đề đang chờ xử lý thực thi Khi sử dụng yield_atom ::= "("1, biểu thức được cung cấp phải là biểu thức có thể lặp lại. Các giá trị được tạo bằng cách lặp lại có thể lặp lại đó được chuyển trực tiếp đến người gọi các phương thức của trình tạo hiện tại. Mọi giá trị được truyền vào with và mọi ngoại lệ được truyền vào with đều được chuyển đến trình vòng lặp bên dưới nếu nó có các phương thức thích hợp. Nếu đây không phải là trường hợp, thì sẽ tăng hoặc , trong khi sẽ chỉ tăng ngoại lệ được thông qua ngay lập tức Khi trình vòng lặp cơ bản hoàn tất, thuộc tính yield_atom ::= "("8 của phiên bản được nâng lên sẽ trở thành giá trị của biểu thức năng suất. Nó có thể được đặt rõ ràng khi nâng cao hoặc tự động khi trình tạo phụ là trình tạo (bằng cách trả về một giá trị từ trình tạo phụ)
Dấu ngoặc đơn có thể được bỏ qua khi biểu thức năng suất là biểu thức duy nhất ở phía bên tay phải của câu lệnh gán Xem thêm PEP 255 - Máy phát điện đơn giảnĐề xuất thêm trình tạo và câu lệnh vào Python PEP 342 - Coroutines thông qua Trình tạo nâng caoĐề xuất nâng cao API và cú pháp của trình tạo, giúp chúng có thể sử dụng được như các coroutine đơn giản PEP 380 - Cú pháp ủy quyền cho Trình tạo conĐề xuất giới thiệu cú pháp atom ::=03, giúp việc ủy quyền cho các máy phát điện phụ trở nên dễ dàngPEP 525 - Máy phát điện không đồng bộ Đề xuất mở rộng trên PEP 492 bằng cách thêm các khả năng của trình tạo vào các chức năng coroutine 6. 2. 9. 1. Phương pháp trình tạo lặpTiểu mục này mô tả các phương thức của trình lặp trình tạo. Chúng có thể được sử dụng để kiểm soát việc thực hiện chức năng tạo Lưu ý rằng việc gọi bất kỳ phương thức trình tạo nào bên dưới khi trình tạo đang thực thi sẽ tạo ra một ngoại lệ máy phát điện. __next__()Bắt đầu thực hiện chức năng tạo hoặc tiếp tục nó ở biểu thức năng suất được thực hiện lần cuối. Khi một hàm tạo được tiếp tục với một phương thức, biểu thức năng suất hiện tại luôn ước tính thành. Sau đó, quá trình thực thi tiếp tục đến biểu thức lợi nhuận tiếp theo, trong đó trình tạo lại bị treo và giá trị của hàm được trả về cho người gọi. Nếu trình tạo thoát mà không mang lại giá trị khác, một ngoại lệ sẽ được đưa ra Phương pháp này thường được gọi ngầm, e. g. bởi một vòng lặp, hoặc bởi chức năng tích hợp máy phát điện. gửi(giá trị)Tiếp tục thực thi và “gửi” một giá trị vào hàm tạo. Đối số giá trị trở thành kết quả của biểu thức năng suất hiện tại. Phương thức trả về giá trị tiếp theo do trình tạo tạo ra hoặc tăng nếu trình tạo thoát mà không mang lại giá trị khác. Khi được gọi để khởi động trình tạo, nó phải được gọi với tư cách là đối số, vì không có biểu thức năng suất nào có thể nhận giá trị máy phát điện. ném(giá trị)trình tạo. ném(loại[ , value[, traceback]])Raises an exception at the point where the generator was paused, and returns the next value yielded by the generator function. Nếu trình tạo thoát mà không mang lại giá trị khác, một ngoại lệ sẽ được đưa ra. Nếu hàm tạo không bắt được ngoại lệ được truyền vào hoặc đưa ra một ngoại lệ khác, thì ngoại lệ đó sẽ lan truyền đến người gọi Trong sử dụng thông thường, điều này được gọi với một trường hợp ngoại lệ duy nhất tương tự như cách sử dụng từ khóa Tuy nhiên, để tương thích ngược, chữ ký thứ hai được hỗ trợ, tuân theo quy ước từ các phiên bản Python cũ hơn. Đối số kiểu phải là một lớp ngoại lệ và giá trị phải là một thể hiện ngoại lệ. Nếu giá trị không được cung cấp, hàm tạo kiểu được gọi để lấy một thể hiện. Nếu truy nguyên được cung cấp, thì nó được đặt theo ngoại lệ, nếu không, bất kỳ thuộc tính atom ::=18 hiện có nào được lưu trữ trong giá trị có thể bị xóamáy phát điện. đóng() Tăng a tại điểm chức năng tạo bị tạm dừng. Nếu chức năng tạo sau đó thoát ra một cách duyên dáng, đã bị đóng hoặc tăng (do không bắt ngoại lệ), đóng sẽ trả về trình gọi của nó. Nếu trình tạo mang lại một giá trị, thì a được nâng lên. Nếu trình tạo phát sinh bất kỳ ngoại lệ nào khác, nó sẽ được truyền tới người gọi. không làm gì nếu trình tạo đã thoát do ngoại lệ hoặc thoát bình thường 6. 2. 9. 2. Ví dụDưới đây là một ví dụ đơn giản thể hiện hành vi của các trình tạo và các hàm tạo atom ::=1 Để biết các ví dụ sử dụng list_display ::= "[" [1, hãy xem trong “Có gì mới trong Python. ” 6. 2. 9. 3. Hàm tạo không đồng bộSự hiện diện của biểu thức năng suất trong một hàm hoặc phương thức được xác định bằng cách sử dụng định nghĩa thêm hàm dưới dạng một hàm Khi một hàm tạo không đồng bộ được gọi, nó sẽ trả về một trình lặp không đồng bộ được gọi là đối tượng trình tạo không đồng bộ. Đối tượng đó sau đó kiểm soát việc thực hiện chức năng tạo. Một đối tượng trình tạo không đồng bộ thường được sử dụng trong một câu lệnh trong hàm coroutine tương tự như cách một đối tượng trình tạo sẽ được sử dụng trong một câu lệnh Gọi một trong các phương thức của trình tạo không đồng bộ trả về một đối tượng và quá trình thực thi bắt đầu khi đối tượng này được chờ trên. Tại thời điểm đó, quá trình thực thi sẽ chuyển sang biểu thức năng suất đầu tiên, nơi nó bị treo lại, trả về giá trị của quy trình đăng ký đang chờ. Như với một trình tạo, tạm ngưng có nghĩa là tất cả trạng thái cục bộ được giữ lại, bao gồm các liên kết hiện tại của biến cục bộ, con trỏ lệnh, ngăn xếp đánh giá nội bộ và trạng thái của bất kỳ xử lý ngoại lệ nào. Khi quá trình thực thi được tiếp tục bằng cách đợi đối tượng tiếp theo được trả về bởi các phương thức của trình tạo không đồng bộ, hàm có thể tiến hành chính xác như thể biểu thức năng suất chỉ là một lệnh gọi bên ngoài khác. Giá trị của biểu thức năng suất sau khi tiếp tục phụ thuộc vào phương thức đã tiếp tục thực thi. Nếu được sử dụng thì kết quả là. Mặt khác, nếu được sử dụng, thì kết quả sẽ là giá trị được truyền vào phương thức đó Nếu trình tạo không đồng bộ xảy ra thoát sớm trước , tác vụ của trình gọi bị hủy hoặc các trường hợp ngoại lệ khác, thì mã dọn dẹp không đồng bộ của trình tạo sẽ chạy và có thể đưa ra các ngoại lệ hoặc truy cập các biến ngữ cảnh trong ngữ cảnh không mong muốn–có thể sau thời gian tồn tại của các tác vụ tùy thuộc vào, hoặc . Để ngăn chặn điều này, người gọi phải đóng trình tạo async một cách rõ ràng bằng cách gọi phương thức để hoàn thiện trình tạo và cuối cùng tách nó khỏi vòng lặp sự kiện Trong hàm tạo không đồng bộ, biểu thức năng suất được phép ở bất kỳ đâu trong cấu trúc. Tuy nhiên, nếu trình tạo không đồng bộ không được tiếp tục lại trước khi nó được hoàn tất (bằng cách đạt đến số tham chiếu bằng 0 hoặc bằng cách thu gom rác), thì biểu thức năng suất trong cấu trúc generator_expression ::= "("8 có thể dẫn đến lỗi thực thi các mệnh đề đang chờ xử lý. Trong trường hợp này, trách nhiệm của vòng lặp sự kiện hoặc bộ lập lịch chạy trình tạo không đồng bộ là gọi phương thức của trình tạo-iterator không đồng bộ và chạy đối tượng coroutine kết quả, do đó cho phép mọi mệnh đề yield_atom ::= "("0 đang chờ xử lý thực thi Để xử lý việc hoàn thiện khi kết thúc vòng lặp sự kiện, một vòng lặp sự kiện phải xác định một hàm hoàn thiện nhận một trình lặp-trình tạo không đồng bộ và có thể gọi và thực thi coroutine. Finalizer này có thể được đăng ký bằng cách gọi. Khi được lặp lại lần đầu tiên, một trình lặp-trình tạo không đồng bộ sẽ lưu trữ trình hoàn thiện đã đăng ký để được gọi khi hoàn thiện. Để biết ví dụ tham khảo về phương pháp hoàn thiện, hãy xem triển khai của atom ::=40 trong Lib/asyncio/base_events. py Biểu thức yield_atom ::= "("1 là lỗi cú pháp khi được sử dụng trong hàm tạo không đồng bộ 6. 2. 9. 4. Các phương thức tạo-lặp không đồng bộTiểu mục này mô tả các phương thức của trình lặp trình tạo không đồng bộ, được sử dụng để kiểm soát việc thực thi hàm trình tạo quy trình đại lý. __anext__()Trả về một sự chờ đợi mà khi chạy bắt đầu thực thi trình tạo không đồng bộ hoặc tiếp tục nó ở biểu thức năng suất được thực hiện lần cuối. Khi một hàm tạo không đồng bộ được tiếp tục với một phương thức, biểu thức năng suất hiện tại luôn ước tính thành giá trị có thể chờ được trả về, mà khi chạy sẽ tiếp tục đến biểu thức năng suất tiếp theo. Giá trị của biểu thức năng suất là giá trị của ngoại lệ được đưa ra bởi quy trình hoàn thành. Nếu trình tạo không đồng bộ thoát mà không mang lại giá trị khác, thay vào đó, có thể chờ đợi sẽ đưa ra một ngoại lệ, báo hiệu rằng quá trình lặp không đồng bộ đã hoàn thành Phương thức này thường được gọi ngầm bởi một vòng lặp quy trình đại lý. asend(value)Returns an awaitable which when run resumes the execution of the asynchronous generator. As with the method for a generator, this “sends” a value into the asynchronous generator function, and the value argument becomes the result of the current yield expression. The awaitable returned by the method will return the next value yielded by the generator as the value of the raised , or raises if the asynchronous generator exits without yielding another value. Khi được gọi để khởi động trình tạo không đồng bộ, nó phải được gọi với tư cách là đối số, vì không có biểu thức năng suất nào có thể nhận giá trị quy trình đại lý. throw(loại[ , value[, traceback]])Trả về một sự chờ đợi làm tăng ngoại lệ loại atom ::=54 tại điểm mà trình tạo không đồng bộ bị tạm dừng và trả về giá trị tiếp theo do hàm trình tạo tạo ra làm giá trị của ngoại lệ đã nêu. Nếu trình tạo không đồng bộ thoát mà không mang lại giá trị khác, một ngoại lệ sẽ được đưa ra bởi lệnh chờ. Nếu hàm tạo không bắt được ngoại lệ được truyền vào hoặc đưa ra một ngoại lệ khác, thì khi lệnh có thể chờ được chạy, ngoại lệ đó sẽ lan truyền tới người gọi của lệnh có thể chờquy trình đại lý. đóng() Trả về một sự chờ đợi mà khi chạy sẽ ném một hàm vào trình tạo không đồng bộ tại điểm mà nó bị tạm dừng. Nếu chức năng tạo không đồng bộ sau đó thoát ra một cách duyên dáng, đã bị đóng hoặc tăng (do không bắt ngoại lệ), thì hàm chờ được trả về sẽ đưa ra một ngoại lệ. Bất kỳ sự chờ đợi nào khác được trả về bởi các cuộc gọi tiếp theo tới trình tạo không đồng bộ sẽ đưa ra một ngoại lệ. Nếu trình tạo không đồng bộ mang lại một giá trị, thì a được tăng lên bởi giá trị có thể chờ đợi. Nếu trình tạo không đồng bộ đưa ra bất kỳ ngoại lệ nào khác, thì nó sẽ được truyền tới người gọi của lệnh chờ. Nếu trình tạo không đồng bộ đã thoát do một ngoại lệ hoặc thoát bình thường, thì các lệnh gọi tiếp theo sẽ trả về một giá trị có thể chờ đợi mà không làm gì cả 6. 3. Các bầu cử sơ bộBầu cử sơ bộ đại diện cho các hoạt động ràng buộc chặt chẽ nhất của ngôn ngữ. cú pháp của họ là atom ::=2 6. 3. 1. Attribute referencesTham chiếu thuộc tính là thuộc tính chính theo sau là dấu chấm và tên atom ::=3 Chính phải đánh giá một đối tượng thuộc loại hỗ trợ tham chiếu thuộc tính, điều mà hầu hết các đối tượng làm. Đối tượng này sau đó được yêu cầu tạo thuộc tính có tên là định danh. Quá trình sản xuất này có thể được tùy chỉnh bằng cách ghi đè phương thức atom ::=63. Nếu thuộc tính này không có sẵn, ngoại lệ sẽ được đưa ra. Otherwise, the type and value of the object produced is determined by the object. Multiple evaluations of the same attribute reference may yield different objects 6. 3. 2. Đăng kýThe subscription of an instance of a will generally select an element from the container. Việc đăng ký một sẽ thường trả lại một đối tượng atom ::=4 Khi một đối tượng được đăng ký, trình thông dịch sẽ đánh giá danh sách chính và biểu thức Chính phải đánh giá một đối tượng hỗ trợ đăng ký. Một đối tượng có thể hỗ trợ đăng ký thông qua việc xác định một hoặc cả hai và. Khi chính được đăng ký, kết quả được đánh giá của danh sách biểu thức sẽ được chuyển đến một trong các phương thức này. Để biết thêm chi tiết về thời điểm gọi atom ::=67 thay vì atom ::=68, hãy xem Nếu danh sách biểu thức chứa ít nhất một dấu phẩy, nó sẽ đánh giá là chứa các mục của danh sách biểu thức. Nếu không, danh sách biểu thức sẽ đánh giá giá trị của thành viên duy nhất của danh sách For built-in objects, there are two types of objects that support subscription via
Cú pháp chính thức không cung cấp đặc biệt cho các chỉ số tiêu cực trong. Tuy nhiên, tất cả các trình tự dựng sẵn đều cung cấp một phương pháp diễn giải các chỉ số âm bằng cách thêm độ dài của trình tự vào chỉ mục sao cho, ví dụ: atom ::=78 chọn mục cuối cùng của atom ::=79. The resulting value must be a nonnegative integer less than the number of items in the sequence, and the subscription selects the item whose index is that value (counting from zero). Since the support for negative indices and slicing occurs in the object’s atom ::=65 method, subclasses overriding this method will need to explicitly add that support A là một loại dãy đặc biệt có các phần tử là các ký tự. A character is not a separate data type but a string of exactly one character 6. 3. 3. Cắt látMột lần cắt chọn một loạt các mục trong một đối tượng chuỗi (e. g. , một chuỗi, bộ hoặc danh sách). Slicings may be used as expressions or as targets in assignment or statements. Cú pháp cho một slice atom ::=5 Có sự mơ hồ trong cú pháp chính thức ở đây. bất cứ thứ gì trông giống như một danh sách biểu thức cũng giống như một danh sách lát, vì vậy bất kỳ đăng ký nào cũng có thể được hiểu là một lát. Thay vì làm phức tạp thêm cú pháp, điều này được làm rõ bằng cách xác định rằng trong trường hợp này, diễn giải dưới dạng đăng ký được ưu tiên hơn diễn giải dưới dạng cắt lát (đây là trường hợp nếu danh sách lát cắt không chứa lát cắt thích hợp) Ngữ nghĩa của một slice như sau. Chính được lập chỉ mục (sử dụng cùng một phương thức atom ::=65 như đăng ký bình thường) với một khóa được tạo từ danh sách lát, như sau. Nếu danh sách lát chứa ít nhất một dấu phẩy, khóa là một bộ chứa chuyển đổi của các mục lát; . Việc chuyển đổi một mục lát là một biểu thức là biểu thức đó. Việc chuyển đổi một lát cắt phù hợp là một đối tượng lát cắt (xem phần ) có các thuộc tính atom ::=84, atom ::=85 và atom ::=86 là các giá trị của các biểu thức đã cho lần lượt là giới hạn dưới, giới hạn trên và sải chân, thay thế cho các biểu thức bị thiếu generator_expression ::= "("1 6. 3. 4. Cuộc gọiMột cuộc gọi gọi một đối tượng có thể gọi được (e. g. , a ) với một loạt có thể trống atom ::=6 Dấu phẩy tùy chọn có thể xuất hiện sau các đối số vị trí và từ khóa nhưng không ảnh hưởng đến ngữ nghĩa Đối tượng chính phải đánh giá đối tượng có thể gọi được (hàm do người dùng định nghĩa, hàm tích hợp, phương thức của đối tượng tích hợp, đối tượng lớp, phương thức của thể hiện lớp và tất cả đối tượng có phương thức atom ::=88 đều có thể gọi được). Tất cả các biểu thức đối số được đánh giá trước khi thực hiện cuộc gọi. Vui lòng tham khảo phần cú pháp của danh sách chính thức Nếu có đối số từ khóa, trước tiên chúng được chuyển đổi thành đối số vị trí, như sau. Đầu tiên, một danh sách các vị trí chưa được lấp đầy được tạo cho các tham số chính thức. If there are N positional arguments, they are placed in the first N slots. Next, for each keyword argument, the identifier is used to determine the corresponding slot (if the identifier is the same as the first formal parameter name, the first slot is used, and so on). If the slot is already filled, a exception is raised. Otherwise, the argument is placed in the slot, filling it (even if the expression is generator_expression ::= "("1, it fills the slot). When all arguments have been processed, the slots that are still unfilled are filled with the corresponding default value from the function definition. (Default values are calculated, once, when the function is defined; thus, a mutable object such as a list or dictionary used as default value will be shared by all calls that don’t specify an argument value for the corresponding slot; this should usually be avoided. ) If there are any unfilled slots for which no default value is specified, a exception is raised. Otherwise, the list of filled slots is used as the argument list for the call CPython implementation detail. An implementation may provide built-in functions whose positional parameters do not have names, even if they are ‘named’ for the purpose of documentation, and which therefore cannot be supplied by keyword. In CPython, this is the case for functions implemented in C that use to parse their arguments If there are more positional arguments than there are formal parameter slots, a exception is raised, unless a formal parameter using the syntax atom ::=94 is present; in this case, that formal parameter receives a tuple containing the excess positional arguments (or an empty tuple if there were no excess positional arguments) Nếu bất kỳ đối số từ khóa nào không tương ứng với tên tham số chính thức, một ngoại lệ sẽ được đưa ra, trừ khi có tham số chính thức sử dụng cú pháp atom ::=96; Nếu cú pháp atom ::=97 xuất hiện trong lời gọi hàm, thì atom ::=98 phải đánh giá thành một. Các phần tử từ các lần lặp này được xử lý như thể chúng là các đối số vị trí bổ sung. Đối với lời gọi atom ::=99, nếu y đánh giá một dãy y1, …, yM, điều này tương đương với một lời gọi với M+4 đối số vị trí x1, x2, y1, …, yM, x3, x4 Hậu quả của việc này là mặc dù cú pháp atom ::=97 có thể xuất hiện sau các đối số từ khóa rõ ràng, nhưng nó được xử lý trước các đối số từ khóa (và bất kỳ đối số literal ::=01 nào – xem bên dưới). Vì thế atom ::=7 Việc cả đối số từ khóa và cú pháp atom ::=97 được sử dụng trong cùng một lệnh gọi là điều bất thường, vì vậy trong thực tế, sự nhầm lẫn này không thường xảy ra Nếu cú pháp literal ::=01 xuất hiện trong lệnh gọi hàm, thì atom ::=98 phải ước tính thành a , nội dung của nó được coi là đối số từ khóa bổ sung. Nếu một tham số khớp với một khóa đã được cung cấp một giá trị (bởi một đối số từ khóa rõ ràng hoặc từ một giải nén khác), một ngoại lệ sẽ được đưa ra Khi sử dụng literal ::=01, mỗi khóa trong ánh xạ này phải là một chuỗi. Mỗi giá trị từ ánh xạ được gán cho tham số chính thức đầu tiên đủ điều kiện để gán từ khóa có tên bằng với khóa. Khóa không nhất thiết phải là mã định danh Python (e. g. literal ::=07 được chấp nhận, mặc dù nó sẽ không khớp với bất kỳ tham số chính thức nào có thể được khai báo). Nếu không khớp với tham số chính thức, cặp khóa-giá trị được thu thập bởi tham số set_display ::= "{" (5, nếu có hoặc nếu không có, một ngoại lệ sẽ được đưa ra Các tham số hình thức sử dụng cú pháp atom ::=94 hoặc atom ::=96 không thể được sử dụng làm vùng đối số vị trí hoặc làm tên đối số từ khóa Đã thay đổi trong phiên bản 3. 5. Các lệnh gọi hàm chấp nhận bất kỳ số lần giải nén literal ::=12 và set_display ::= "{" (5 nào, các đối số vị trí có thể tuân theo các lần giải nén lặp lại ( literal ::=12) và các đối số từ khóa có thể tuân theo các lần giải nén từ điển ( set_display ::= "{" (5). Ban đầu được đề xuất bởi PEP 448. Một cuộc gọi luôn trả về một số giá trị, có thể là generator_expression ::= "("1, trừ khi nó đưa ra một ngoại lệ. Cách tính giá trị này tùy thuộc vào loại đối tượng có thể gọi được Nếu nó là- a user-defined functionKhối mã cho hàm được thực thi, truyền cho nó danh sách đối số. Điều đầu tiên mà khối mã sẽ thực hiện là liên kết các tham số hình thức với các đối số; . Khi khối mã thực thi một câu lệnh, câu lệnh này chỉ định giá trị trả về của lệnh gọi hàm một chức năng hoặc phương pháp tích hợpKết quả là tùy thuộc vào thông dịch viên; một đối tượng lớpMột phiên bản mới của lớp đó được trả về một phương thức thể hiện của lớpHàm do người dùng xác định tương ứng được gọi, với danh sách đối số dài hơn danh sách đối số của lệnh gọi. ví dụ trở thành đối số đầu tiên một thể hiện của lớpLớp phải định nghĩa một phương thức atom ::=88; 6. 4. Đang chờ biểu thứcTạm dừng thực hiện trên một đối tượng. Chỉ có thể được sử dụng bên trong một atom ::=8 Mới trong phiên bản 3. 5 6. 5. Người điều hành quyền lựcToán tử lũy thừa liên kết chặt chẽ hơn các toán tử đơn nguyên ở bên trái của nó; . Cú pháp là atom ::=9 Do đó, trong một chuỗi các toán tử lũy thừa và đơn nguyên không được mở ngoặc, các toán tử được đánh giá từ phải sang trái (điều này không hạn chế thứ tự đánh giá cho các toán hạng). literal ::=19 kết quả trong literal ::=20 Toán tử lũy thừa có ngữ nghĩa giống như hàm tích hợp, khi được gọi với hai đối số. nó mang lại đối số bên trái của nó được nâng lên thành sức mạnh của đối số bên phải của nó. Các đối số số trước tiên được chuyển đổi thành một loại phổ biến và kết quả là loại đó Đối với toán hạng kiểu int, kết quả có cùng kiểu với toán hạng trừ khi đối số thứ hai là số âm; . Ví dụ, literal ::=22 trả về literal ::=23, nhưng literal ::=24 trả về literal ::=25 Việc nâng literal ::=26 lên mức âm sẽ dẫn đến. Nâng một số âm lên một lũy thừa phân số dẫn đến một số. (Trong các phiên bản trước, nó đã tăng. ) Thao tác này có thể được tùy chỉnh bằng phương pháp literal ::=30 đặc biệt 6. 6. Các phép toán số học và bit đơn vịTất cả các hoạt động số học đơn phương và bitwise có cùng mức độ ưu tiên literal ::=0 Toán tử literal ::=31 (trừ) đơn nguyên mang lại phủ định cho đối số số của nó; Toán tử một ngôi literal ::=33 (cộng) mang lại đối số số của nó không thay đổi; Toán tử một ngôi literal ::=35 (đảo ngược) mang lại phép nghịch đảo bit của đối số nguyên của nó. Đảo ngược bit của atom ::=79 được định nghĩa là literal ::=37. Nó chỉ áp dụng cho các số nguyên hoặc đối tượng tùy chỉnh ghi đè phương thức đặc biệt literal ::=38 Trong cả ba trường hợp, nếu đối số không có loại thích hợp, một ngoại lệ sẽ được đưa ra 6. 7. Các phép toán số học nhị phânThe binary arithmetic operations have the conventional priority levels. Lưu ý rằng một số thao tác này cũng áp dụng cho một số loại không phải là số. Ngoài toán tử lũy thừa, chỉ có hai mức, một cho toán tử nhân và một cho toán tử cộng literal ::=1 Toán tử literal ::=12 (phép nhân) cho kết quả của các đối số của nó. Cả hai đối số phải là số hoặc một đối số phải là số nguyên và đối số kia phải là một chuỗi. Trong trường hợp trước, các số được chuyển đổi thành một loại chung và sau đó được nhân với nhau. Trong trường hợp thứ hai, việc lặp lại trình tự được thực hiện; Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt literal ::=41 và literal ::=42 Toán tử literal ::=43 (at) được dùng để nhân ma trận. No builtin Python types implement this operator Mới trong phiên bản 3. 5 Các toán tử literal ::=44 (phép chia) và literal ::=45 (phép chia tầng) mang lại thương số cho các đối số của chúng. The numeric arguments are first converted to a common type. Phép chia các số nguyên tạo ra một số float, trong khi phép chia sàn các số nguyên dẫn đến một số nguyên; . Chia cho số 0 làm tăng ngoại lệ Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt literal ::=47 và literal ::=48 Toán tử literal ::=49 (mô-đun) mang lại phần còn lại từ phép chia đối số thứ nhất cho đối số thứ hai. Các đối số số trước tiên được chuyển đổi thành một loại phổ biến. Một đối số không bên phải làm tăng ngoại lệ. The arguments may be floating point numbers, e. g. , literal ::=51 bằng literal ::=52 (vì literal ::=53 bằng literal ::=54. ) Toán tử modulo luôn mang lại kết quả có cùng dấu với toán hạng thứ hai (hoặc 0); The floor division and modulo operators are connected by the following identity. literal ::=55. Phân chia tầng và modulo cũng được kết nối với chức năng tích hợp. literal ::=57. In addition to performing the modulo operation on numbers, the literal ::=49 operator is also overloaded by string objects to perform old-style string formatting (also known as interpolation). Cú pháp định dạng chuỗi được mô tả trong phần Tham khảo thư viện Python Hoạt động modulo có thể được tùy chỉnh bằng phương pháp literal ::=59 đặc biệt Toán tử chia sàn, toán tử modulo và hàm không được xác định cho các số phức. Instead, convert to a floating point number using the function if appropriate The literal ::=33 (addition) operator yields the sum of its arguments. Các đối số phải là số hoặc cả hai là chuỗi cùng loại. Trong trường hợp trước, các số được chuyển đổi thành một loại chung và sau đó được cộng lại với nhau. Trong trường hợp sau, các chuỗi được nối Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt literal ::=63 và literal ::=64 The literal ::=31 (subtraction) operator yields the difference of its arguments. Các đối số số trước tiên được chuyển đổi thành một loại phổ biến Thao tác này có thể được tùy chỉnh bằng phương pháp literal ::=66 đặc biệt 6. 8. Thao tác dịch chuyểnCác phép toán dịch chuyển có mức độ ưu tiên thấp hơn các phép toán số học literal ::=2 Các toán tử này chấp nhận số nguyên làm đối số. Chúng dịch chuyển đối số thứ nhất sang trái hoặc phải theo số bit được cung cấp bởi đối số thứ hai Hoạt động này có thể được tùy chỉnh bằng cách sử dụng các phương pháp đặc biệt literal ::=67 và literal ::=68 Dịch chuyển sang phải n bit được định nghĩa là chia tầng cho literal ::=69. Dịch trái n bit được định nghĩa là phép nhân với literal ::=69 6. 9. Các phép toán theo bit nhị phânMỗi trong số ba hoạt động bitwise có mức độ ưu tiên khác nhau literal ::=3 Toán tử literal ::=71 mang lại AND theo bit của các đối số của nó, phải là số nguyên hoặc một trong số chúng phải là đối tượng tùy chỉnh ghi đè phương thức đặc biệt của literal ::=72 hoặc literal ::=73 Toán tử literal ::=74 tạo ra XOR bitwise (OR độc quyền) của các đối số của nó, phải là số nguyên hoặc một trong số chúng phải là đối tượng tùy chỉnh ghi đè phương thức đặc biệt của literal ::=75 hoặc ________8____76 The literal ::=77 operator yields the bitwise (inclusive) OR of its arguments, which must be integers or one of them must be a custom object overriding literal ::=78 or literal ::=79 special methods 6. 10. So sánhKhông giống như C, tất cả các phép toán so sánh trong Python đều có cùng mức độ ưu tiên, thấp hơn so với bất kỳ phép toán số học, dịch chuyển hoặc bit nào. Cũng không giống như C, các biểu thức như literal ::=80 có cách giải thích thông thường trong toán học literal ::=4 So sánh mang lại giá trị boolean. literal ::=81 hoặc literal ::=82. Các phương thức so sánh phong phú tùy chỉnh có thể trả về các giá trị không phải là boolean. Trong trường hợp này, Python sẽ gọi giá trị đó trong ngữ cảnh boolean So sánh có thể được xâu chuỗi tùy ý, e. g. , literal ::=84 tương đương với literal ::=85, ngoại trừ việc literal ::=86 chỉ được đánh giá một lần (nhưng trong cả hai trường hợp, literal ::=87 hoàn toàn không được đánh giá khi literal ::=88 bị phát hiện là sai) Về hình thức, nếu a, b, c, …, y, z là các biểu thức và op1, op2, …, opN là các toán tử so sánh, thì literal ::=89 tương đương với literal ::=90, ngoại trừ mỗi biểu thức được đánh giá nhiều nhất một lần Lưu ý rằng literal ::=91 không ngụ ý bất kỳ loại so sánh nào giữa a và c, do đó, e. g. , literal ::=92 là hoàn toàn hợp pháp (mặc dù có lẽ không đẹp) 6. 10. 1. So sánh giá trịCác toán tử literal ::=93, literal ::=94, literal ::=95, literal ::=96, literal ::=97 và literal ::=98 so sánh giá trị của hai đối tượng. Các đối tượng không cần phải có cùng loại Chương nói rằng các đối tượng có một giá trị (ngoài loại và danh tính). Giá trị của một đối tượng là một khái niệm khá trừu tượng trong Python. Ví dụ: không có phương thức truy cập chính tắc cho giá trị của đối tượng. Ngoài ra, không có yêu cầu rằng giá trị của một đối tượng phải được xây dựng theo một cách cụ thể, e. g. bao gồm tất cả các thuộc tính dữ liệu của nó. Các toán tử so sánh thực hiện một khái niệm cụ thể về giá trị của một đối tượng là gì. Người ta có thể nghĩ về chúng như là xác định giá trị của một đối tượng một cách gián tiếp, bằng cách thực hiện so sánh của chúng Bởi vì tất cả các loại đều là kiểu con (trực tiếp hoặc gián tiếp) của , nên chúng kế thừa hành vi so sánh mặc định từ. Các loại có thể tùy chỉnh hành vi so sánh của chúng bằng cách triển khai các phương pháp so sánh phong phú như parenth_form ::= "(" [ 01, được mô tả trongHành vi mặc định để so sánh đẳng thức ( literal ::=95 và literal ::=98) dựa trên danh tính của các đối tượng. Do đó, so sánh bình đẳng của các trường hợp có cùng danh tính dẫn đến bình đẳng và so sánh bình đẳng của các trường hợp có danh tính khác nhau dẫn đến bất bình đẳng. Động lực cho hành vi mặc định này là mong muốn rằng tất cả các đối tượng phải có tính phản xạ (i. e. parenth_form ::= "(" [ 04 ngụ ý parenth_form ::= "(" [ 05)So sánh đơn hàng mặc định ( literal ::=93, literal ::=94, literal ::=97, và literal ::=96) không được cung cấp; . Động lực cho hành vi mặc định này là thiếu một bất biến tương tự như đối với bình đẳng Hành vi so sánh đẳng thức mặc định, rằng các trường hợp có danh tính khác nhau luôn không bằng nhau, có thể trái ngược với loại nào sẽ cần có định nghĩa hợp lý về giá trị đối tượng và bình đẳng dựa trên giá trị. Các loại như vậy sẽ cần tùy chỉnh hành vi so sánh của chúng và trên thực tế, một số loại tích hợp đã làm được điều đó Danh sách sau đây mô tả hành vi so sánh của các loại tích hợp quan trọng nhất
Các lớp do người dùng định nghĩa tùy chỉnh hành vi so sánh của chúng phải tuân theo một số quy tắc nhất quán, nếu có thể
Python không thực thi các quy tắc nhất quán này. Trên thực tế, các giá trị không phải là số là một ví dụ cho việc không tuân theo các quy tắc này 6. 10. 2. Hoạt động kiểm tra tư cách thành viênCác nhà khai thác và kiểm tra tư cách thành viên. parenth_form ::= "(" [ 74 đánh giá thành literal ::=81 nếu x là thành viên của s và literal ::=82 nếu không. parenth_form ::= "(" [ 77 trả về phủ định của parenth_form ::= "(" [ 74. Tất cả các loại trình tự và tập hợp tích hợp đều hỗ trợ điều này cũng như từ điển, trong đó parenth_form ::= "(" [ 72 kiểm tra xem từ điển có khóa đã cho hay không. Đối với các loại vùng chứa như danh sách, bộ dữ liệu, bộ, bộ đóng băng, dict hoặc bộ sưu tập. deque, biểu thức parenth_form ::= "(" [ 80 tương đương với parenth_form ::= "(" [ 81Đối với kiểu chuỗi và byte, parenth_form ::= "(" [ 80 là literal ::=81 khi và chỉ khi x là chuỗi con của y. Một bài kiểm tra tương đương là parenth_form ::= "(" [ 84. Các chuỗi rỗng luôn được coi là chuỗi con của bất kỳ chuỗi nào khác, vì vậy, parenth_form ::= "(" [ 85 sẽ trả về literal ::=81 Đối với các lớp do người dùng định nghĩa xác định phương thức parenth_form ::= "(" [ 87, parenth_form ::= "(" [ 80 trả về literal ::=81 nếu parenth_form ::= "(" [ 90 trả về giá trị thực và ngược lại là literal ::=82 Đối với các lớp do người dùng định nghĩa không định nghĩa parenth_form ::= "(" [ 87 nhưng định nghĩa parenth_form ::= "(" [ 93, thì parenth_form ::= "(" [ 80 là literal ::=81 nếu một số giá trị literal ::=87, mà biểu thức parenth_form ::= "(" [ 97 là đúng, được tạo ra trong khi lặp lại trên literal ::=86. Nếu một ngoại lệ được đưa ra trong quá trình lặp lại, thì coi như ngoại lệ đó được đưa ra Cuối cùng, giao thức lặp kiểu cũ đã được thử. nếu một lớp định nghĩa atom ::=65, parenth_form ::= "(" [ 80 là literal ::=81 khi và chỉ khi có một chỉ số nguyên không âm i sao cho comprehension ::=03 và không có chỉ số nguyên nào thấp hơn làm tăng ngoại lệ. (Nếu có bất kỳ ngoại lệ nào khác được nêu ra, thì coi như ngoại lệ đó được nêu ra) Toán tử được định nghĩa là có giá trị chân lý nghịch đảo của 6. 10. 3. So sánh danh tínhCác toán tử và kiểm tra danh tính của một đối tượng. parenth_form ::= "(" [ 04 là đúng khi và chỉ khi x và y là cùng một đối tượng. Danh tính của Đối tượng được xác định bằng hàm. comprehension ::=12 mang lại giá trị chân lý nghịch đảo. 6. 11. Các phép toán Booleanliteral ::=5 Trong ngữ cảnh của các phép toán Boolean và cả khi các biểu thức được sử dụng bởi các câu lệnh luồng điều khiển, các giá trị sau được hiểu là sai. literal ::=82, generator_expression ::= "("1, số 0 của tất cả các loại, chuỗi và vùng chứa trống (bao gồm chuỗi, bộ dữ liệu, danh sách, từ điển, bộ và bộ đóng băng). Tất cả các giá trị khác được hiểu là đúng. Các đối tượng do người dùng xác định có thể tùy chỉnh giá trị thực của chúng bằng cách cung cấp phương thức comprehension ::=15 Toán tử mang lại literal ::=81 nếu đối số của nó là sai, literal ::=82 nếu không Biểu thức comprehension ::=19 đánh giá x đầu tiên; Biểu thức comprehension ::=20 lần đầu tiên đánh giá x; Lưu ý rằng cũng không hạn chế giá trị và loại chúng trả về literal ::=82 và literal ::=81, mà trả về đối số được đánh giá cuối cùng. Điều này đôi khi hữu ích, e. g. , nếu comprehension ::=25 là một chuỗi nên được thay thế bằng một giá trị mặc định nếu nó trống, biểu thức comprehension ::=26 sẽ mang lại giá trị mong muốn. Bởi vì phải tạo một giá trị mới, nó trả về một giá trị boolean bất kể loại đối số của nó (ví dụ: comprehension ::=28 tạo ra literal ::=82 thay vì comprehension ::=30. ) 6. 12. Biểu thức gánliteral ::=6 Một biểu thức gán (đôi khi còn được gọi là "biểu thức được đặt tên" hoặc "hải mã") gán một cho một , đồng thời trả về giá trị của Một trường hợp sử dụng phổ biến là khi xử lý các biểu thức chính quy phù hợp literal ::=7 Hoặc, khi xử lý luồng tệp theo khối literal ::=8 Các biểu thức gán phải được bao quanh bởi dấu ngoặc đơn khi được sử dụng làm biểu thức phụ trong biểu thức cắt, điều kiện, lambda, đối số từ khóa và biểu thức hiểu-nếu và trong các câu lệnh comprehension ::=34 và comprehension ::=35. Ở tất cả những nơi khác mà chúng có thể được sử dụng, dấu ngoặc đơn không bắt buộc, kể cả trong câu lệnh comprehension ::=2 và comprehension ::=37 Mới trong phiên bản 3. 8. Xem PEP 572 để biết thêm chi tiết về biểu thức gán. 6. 13. Biểu thức điều kiệnliteral ::=9 Biểu thức điều kiện (đôi khi được gọi là “toán tử bậc ba”) có mức ưu tiên thấp nhất trong tất cả các phép toán Python Biểu thức comprehension ::=38 đầu tiên đánh giá điều kiện, C chứ không phải x. Nếu C là đúng, x được đánh giá và giá trị của nó được trả về; Xem PEP 308 để biết thêm chi tiết về biểu thức điều kiện 6. 14. Lambdaparenth_form ::= "(" [ 0Biểu thức lambda (đôi khi được gọi là biểu mẫu lambda) được sử dụng để tạo hàm ẩn danh. Biểu thức comprehension ::=39 mang lại một đối tượng chức năng. Đối tượng chưa được đặt tên hoạt động giống như một đối tượng chức năng được xác định bằng parenth_form ::= "(" [ 1Xem phần cú pháp của danh sách tham số. Lưu ý rằng các hàm được tạo bằng biểu thức lambda không thể chứa câu lệnh hoặc chú thích 6. 15. Danh sách biểu thứcparenth_form ::= "(" [ 2Ngoại trừ khi là một phần của danh sách hoặc tập hợp hiển thị, danh sách biểu thức chứa ít nhất một dấu phẩy sẽ tạo ra một bộ. Độ dài của bộ dữ liệu là số biểu thức trong danh sách. Các biểu thức được đánh giá từ trái sang phải Dấu hoa thị literal ::=12 biểu thị quá trình giải nén có thể lặp lại. Toán hạng của nó phải là một. Iterable được mở rộng thành một chuỗi các mục, được bao gồm trong bộ, danh sách hoặc bộ mới, tại vị trí giải nén Mới trong phiên bản 3. 5. Giải nén lặp lại trong danh sách biểu thức, do PEP 448 đề xuất ban đầu. Dấu phẩy ở cuối chỉ được yêu cầu để tạo một bộ đơn (a. k. a. một người độc thân); . Một biểu thức duy nhất không có dấu phẩy ở cuối không tạo ra một bộ dữ liệu, mà mang lại giá trị của biểu thức đó. (Để tạo một bộ trống, hãy sử dụng một cặp dấu ngoặc đơn trống. comprehension ::=41. ) 6. 16. Trình tự đánh giáPython đánh giá các biểu thức từ trái sang phải. Lưu ý rằng trong khi đánh giá một bài tập, phía bên tay phải được đánh giá trước phía bên trái Trong các dòng sau, các biểu thức sẽ được đánh giá theo thứ tự số học của các hậu tố của chúng parenth_form ::= "(" [ 36. 17. Thứ tự ưu tiên của toán tửBảng sau đây tóm tắt mức độ ưu tiên của toán tử trong Python, từ mức độ ưu tiên cao nhất (liên kết nhiều nhất) đến mức độ ưu tiên thấp nhất (ít ràng buộc nhất). Các toán tử trong cùng một hộp có cùng quyền ưu tiên. Trừ khi cú pháp được đưa ra rõ ràng, các toán tử là nhị phân. Các toán tử trong cùng một hộp nhóm từ trái sang phải (trừ biểu thức lũy thừa và biểu thức điều kiện nhóm từ phải sang trái) Lưu ý rằng các phép so sánh, kiểm tra tư cách thành viên và kiểm tra danh tính, tất cả đều có cùng mức độ ưu tiên và có tính năng xâu chuỗi từ trái sang phải như được mô tả trong phần Nhà điều hành Sự miêu tả comprehension ::=42, comprehension ::=43, comprehension ::=44, comprehension ::=45 Biểu thức ràng buộc hoặc trong ngoặc đơn, hiển thị danh sách, hiển thị từ điển, hiển thị tập hợp comprehension ::=46, comprehension ::=47, comprehension ::=48, comprehension ::=49 Đăng ký, cắt, gọi, tham chiếu thuộc tính chờ đợi biểu hiện set_display ::= "{" (5 lũy thừa comprehension ::=52, comprehension ::=53, comprehension ::=54 Tích cực, tiêu cực, bitwise KHÔNG literal ::=12, literal ::=43, literal ::=44, literal ::=45, literal ::=49 Phép nhân, phép nhân ma trận, phép chia, phép chia tầng, phần dư literal ::=33, literal ::=31 Cộng và trừ comprehension ::=62, comprehension ::=63 Ca làm việc literal ::=71 Bitwise AND literal ::=74 Bitwise XOR literal ::=77 Bitwise HOẶC , , , , literal ::=93, literal ::=97, literal ::=94, literal ::=96, literal ::=98, literal ::=95 So sánh, bao gồm kiểm tra tư cách thành viên và kiểm tra danh tính Boolean KHÔNG Boolean AND Boolean HOẶC – comprehension ::=81 Biểu thức điều kiện biểu thức lambda comprehension ::=83 biểu thức gán chú thích Mặc dù comprehension ::=84 đúng về mặt toán học, nhưng đối với số float, nó có thể không đúng về mặt số do làm tròn. Ví dụ: và giả sử một nền tảng trên đó Python float là số có độ chính xác kép IEEE 754, để comprehension ::=85 có cùng dấu với comprehension ::=86, thì kết quả được tính toán là comprehension ::=87, chính xác bằng số với comprehension ::=86. Thay vào đó, hàm trả về một kết quả có dấu khớp với dấu của đối số đầu tiên và do đó trả về comprehension ::=90 trong trường hợp này. Cách tiếp cận nào phù hợp hơn tùy thuộc vào ứng dụng Nếu x rất gần với một bội số nguyên chính xác của y, thì có thể comprehension ::=91 lớn hơn một lần so với comprehension ::=92 do làm tròn. Trong những trường hợp như vậy, Python trả về kết quả cuối cùng, để đảm bảo rằng comprehension ::=93 rất gần với atom ::=79 Tiêu chuẩn Unicode phân biệt giữa các điểm mã (e. g. U+0041) và ký tự trừu tượng (e. g. “CHỮ VỐN LATIN A”). Trong khi hầu hết các ký tự trừu tượng trong Unicode chỉ được biểu diễn bằng một điểm mã, ngoài ra còn có một số ký tự trừu tượng có thể được biểu diễn bằng một chuỗi gồm nhiều hơn một điểm mã. Ví dụ: ký tự trừu tượng “CHỮ VỐN LATIN C VỚI CEDILLA” có thể được biểu diễn dưới dạng một ký tự được soạn trước duy nhất tại vị trí mã U+00C7 hoặc dưới dạng một chuỗi ký tự cơ sở tại vị trí mã U+0043 (CHỮ IN HOA LATIN C), Các toán tử so sánh trên các chuỗi so sánh ở mức điểm mã Unicode. Điều này có thể phản trực giác với con người. Ví dụ: comprehension ::=95 là literal ::=82, mặc dù cả hai chuỗi đại diện cho cùng một ký tự trừu tượng “CHỮ VỐN LATIN C VỚI CEDILLA” Để so sánh các chuỗi ở cấp ký tự trừu tượng (nghĩa là theo cách trực quan đối với con người), hãy sử dụng Do tính năng thu gom rác tự động, danh sách miễn phí và tính chất động của bộ mô tả, bạn có thể nhận thấy hành vi có vẻ bất thường trong một số cách sử dụng nhất định của toán tử, chẳng hạn như những hành vi liên quan đến so sánh giữa các phương thức mẫu hoặc hằng số. Kiểm tra tài liệu của họ để biết thêm thông tin Toán tử lũy thừa set_display ::= "{" (5 liên kết ít chặt chẽ hơn toán tử một ngôi số học hoặc bitwise ở bên phải của nó, nghĩa là, list_display ::= "[" [00 là list_display ::= "[" [01 Biểu thức được gắn dấu sao trong Python là gì?Biểu thức được gắn dấu sao ra lệnh cho python giữ tất cả các mục danh sách khác lại với nhau thành một tham số .
Các biểu thức được gắn dấu sao được sử dụng ở đâu trong Python?Bài tập được gắn dấu sao
. Việc gán có gắn dấu sao này được thực hiện bằng cách đặt một * ở bên trái tên biến trong một phép gán nhiều lần và bằng cách có bất kỳ lần lặp nào ở bên phải của phép gán .
Dấu hoa thị có nghĩa là gì trong hàm Python?Dưới đây là các cách sử dụng khác nhau của toán tử dấu hoa thị (*) trong Python. Phép nhân. Trong Phép nhân, chúng ta nhân hai số bằng cách sử dụng Dấu hoa thị / Toán tử dấu sao làm trung tố của Toán tử .
Các ví dụ về biểu thức trong Python là gì?Một biểu thức trong Python là sự kết hợp của toán tử và toán hạng. Một ví dụ về biểu thức có thể là. x = x + 1 0 x = x + 10 x=x+10 . Trong biểu thức này, 1 0 10 10 đầu tiên được thêm vào biến x. Sau khi phép cộng được thực hiện, kết quả được gán cho biến x. |