Hướng dẫn define a new function in python - xác định một hàm mới trong python
Trong lập trình, một hàm là một khối mã có thể tái sử dụng thực thi một chức năng nhất định khi nó được gọi. Các chức năng là các phần không thể thiếu của mọi ngôn ngữ lập trình vì chúng giúp làm cho mã của bạn trở nên mô -đun hơn và có thể tái sử dụng. Trong bài viết này, tôi sẽ chỉ cho bạn cách xác định một chức năng trong Python và gọi nó, để bạn có thể chia mã các ứng dụng Python của bạn thành các khối nhỏ hơn. Tôi cũng sẽ chỉ cho bạn cách các đối số và từ khóa trả về hoạt động trong các hàm Python. Trong Python, bạn xác định một hàm với từ khóa Điều tiếp theo bạn phải làm là đảm bảo bạn thụt lề với một tab hoặc 4 khoảng trống, sau đó chỉ định những gì bạn muốn chức năng làm cho bạn.
Các ví dụ cơ bản về một chức năng trong PythonTheo cú pháp cơ bản ở trên, một ví dụ về chức năng Python cơ bản in ấn Hello Hello World vào thiết bị đầu cuối trông như thế này:
Để gọi chức năng này, hãy viết tên của hàm theo sau là dấu ngoặc đơn:, write the name of the function followed by parentheses:
Tiếp theo, hãy chạy mã của bạn trong thiết bị đầu cuối bằng cách nhập 20 để hiển thị những gì bạn muốn chức năng làm:Một ví dụ cơ bản khác về số Subtractig 2 trông như thế này:
Đối số trong các chức năng PythonTrong khi xác định một hàm trong Python, bạn có thể chuyển (các) đối số vào hàm bằng cách đặt chúng vào trong dấu ngoặc đơn. Cú pháp cơ bản để làm điều này trông như hình dưới đây:
Khi hàm được gọi, thì bạn cần chỉ định giá trị cho các đối số:
Đây là một ví dụ về các đối số trong hàm Python:
Trong ví dụ trên:
N.B .: Bạn có thể chỉ định bao nhiêu đối số như bạn muốn.: You can specify as many arguments as you want. Cách sử dụng từ khóa trả về trong PythonTrong Python, bạn có thể sử dụng từ khóa 22 để thoát một hàm để quay trở lại nơi được gọi. Đó là, gửi một cái gì đó ra khỏi chức năng.Câu lệnh trả về có thể chứa một biểu thức để thực thi khi hàm được gọi. Ví dụ dưới đây cho thấy cách từ khóa trả về hoạt động trong Python:
Những gì mã ở trên làm?
Sự kết luậnTrong bài viết này, bạn đã học cách xác định và gọi các chức năng trong Python. Bạn cũng đã học cách truyền các đối số vào một hàm và sử dụng từ khóa trả về, vì vậy bạn có thể sáng tạo hơn với các chức năng bạn viết. Nếu bạn thấy bài viết này hữu ích, đừng ngần ngại chia sẻ nó với bạn bè và gia đình của bạn. Học mã miễn phí. Chương trình giảng dạy nguồn mở của Freecodecamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Xác định và gọi các chức năng Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Defining and Calling Python Functions Làm thế nào để bạn tạo một chức năng mới?define your own Python function. You’ll learn when to divide your program into separate user-defined functions and what tools you’ll need to do this. Để tạo chức năng của riêng bạn, bạn cần phải làm bốn điều:.
Làm thế nào để bạn xác định một chức năng?Một định nghĩa kỹ thuật của một hàm là: Một mối quan hệ từ một tập hợp các đầu vào đến một tập hợp các đầu ra có thể trong đó mỗi đầu vào có liên quan đến chính xác một đầu ra.function. A function is a relationship or mapping between one or more inputs and a set of outputs. In mathematics, a function is typically represented like this: Cú pháp để xác định chức năng mới là gì? Cú pháp để tạo một hàm: hãy để func = hàm mới ([arg1, arg2, ... argn], functionbody); Hàm được tạo với các đối số arg1 ... argn và hàm đã cho.function is a self-contained block of code that encapsulates a specific task or related group of tasks. In previous tutorials in this series, you’ve been introduced to some of the built-in functions provided by Python. 33, for example, takes one argument and returns that object’s unique integer identifier:4 loại chức năng trong Python là gì?
Sau đây là các loại chức năng Python khác nhau:. 4 loại chức năng trong Python là gì?
Sau đây là các loại chức năng Python khác nhau:. 4 loại chức năng trong Python là gì? 0Sau đây là các loại chức năng Python khác nhau:.
Chức năng Python Lambda .. Các chức năng do người dùng Python xác định .. Khi chức năng kết thúc, thực thi trở về vị trí được gọi là hàm. Tùy thuộc vào cách bạn thiết kế giao diện chức năng, dữ liệu có thể được truyền vào khi hàm được gọi và các giá trị trả về có thể được truyền lại khi hoàn thành. Tầm quan trọng của các chức năng PythonHầu như tất cả các ngôn ngữ lập trình được sử dụng ngày nay đều hỗ trợ một hình thức các hàm do người dùng xác định, mặc dù chúng không phải là các chức năng. Trong các ngôn ngữ khác, bạn có thể thấy chúng được gọi là một trong những điều sau đây:
Vì vậy, tại sao bận tâm xác định chức năng? Có một số lý do rất tốt. Bây giờ, hãy để một vài người đi qua. Trừu tượng hóa và tái sử dụngGiả sử bạn viết một số mã làm một cái gì đó hữu ích. Khi bạn tiếp tục phát triển, bạn thấy rằng nhiệm vụ được thực hiện bởi mã đó là một nhiệm vụ bạn cần thường xuyên, ở nhiều vị trí khác nhau trong ứng dụng của bạn. Những gì bạn nên làm? Chà, bạn chỉ có thể sao chép lại mã nhiều lần, sử dụng khả năng sao chép và dán trình soạn thảo của bạn. Sau đó, bạn có thể quyết định rằng mã trong câu hỏi cần phải được sửa đổi. Bạn có thể tìm thấy một cái gì đó sai với nó cần được sửa chữa, hoặc bạn sẽ muốn nâng cao nó theo một cách nào đó. Nếu các bản sao của mã được phân tán trên tất cả các ứng dụng của bạn, thì bạn sẽ cần thực hiện các thay đổi cần thiết ở mọi vị trí. Một giải pháp tốt hơn là xác định hàm Python thực hiện nhiệm vụ. Bất cứ nơi nào trong ứng dụng của bạn mà bạn cần hoàn thành nhiệm vụ, bạn chỉ cần gọi chức năng. Xuống dòng, nếu bạn quyết định thay đổi cách thức hoạt động, thì bạn chỉ cần thay đổi mã ở một vị trí, đó là nơi xác định hàm. Các thay đổi sẽ tự động được chọn bất cứ nơi nào chức năng được gọi.define a Python function that performs the task. Anywhere in your application that you need to accomplish the task, you simply call the function. Down the line, if you decide to change how it works, then you only need to change the code in one location, which is the place where the function is defined. The changes will automatically be picked up anywhere the function is called. Sự trừu tượng của chức năng thành một định nghĩa chức năng là một ví dụ về nguyên tắc phát triển phần mềm của don Lặp lại (khô). Đây được cho là động lực mạnh nhất để sử dụng các chức năng.abstraction of functionality into a function definition is an example of the Don’t Repeat Yourself (DRY) Principle of software development. This is arguably the strongest motivation for using functions. Mô -đunCác chức năng cho phép các quy trình phức tạp được chia thành các bước nhỏ hơn. Ví dụ, hãy tưởng tượng rằng bạn có một chương trình đọc trong một tệp, xử lý nội dung tệp và sau đó ghi một tệp đầu ra. Mã của bạn có thể trông như thế này:complex processes to be broken up into smaller steps. Imagine, for example, that you have a program that reads in a file, processes the file contents, and then writes an output file. Your code could look like this: 1Trong ví dụ này, chương trình chính là một loạt các mã được nối với nhau theo một chuỗi dài, với khoảng trắng và bình luận để giúp tổ chức nó. Tuy nhiên, nếu mã trở nên dài hơn và phức tạp hơn nhiều, thì bạn sẽ có một thời gian ngày càng khó khăn khi quấn đầu xung quanh nó. Ngoài ra, bạn có thể cấu trúc mã giống như sau: 2Ví dụ này được mô đun hóa. Thay vì tất cả các mã được xâu chuỗi lại với nhau, nó đã chia thành các chức năng riêng biệt, mỗi chức năng tập trung vào một nhiệm vụ cụ thể. Những nhiệm vụ đó được đọc, xử lý và viết. Chương trình chính bây giờ chỉ cần gọi lần lượt từng người trong số này.modularized. Instead of all the code being strung together, it’s broken out into separate functions, each of which focuses on a specific task. Those tasks are read, process, and write. The main program now simply needs to call each of these in turn. Trong cuộc sống, bạn làm điều này mọi lúc, ngay cả khi bạn không nghĩ rõ ràng về nó theo cách đó. Nếu bạn muốn di chuyển một số kệ chứa đầy những thứ từ một bên trong nhà để xe của bạn, thì bạn hy vọng sẽ chỉ đứng đó và nghĩ vô mục đích, thì Oh Oh, Geez. Tôi cần phải di chuyển tất cả những thứ đó ở đó! Làm thế nào để làm điều đó???" Bạn đã chia công việc thành các bước có thể quản lý được:
Phá vỡ một nhiệm vụ lớn thành các nhiệm vụ phụ nhỏ hơn, có kích thước cắn giúp làm cho nhiệm vụ lớn dễ suy nghĩ và quản lý hơn. Khi các chương trình trở nên phức tạp hơn, nó ngày càng có lợi để mô đun hóa chúng theo cách này. Tách không gian tênMột không gian tên là một khu vực của một chương trình trong đó các định danh có ý nghĩa. Như bạn sẽ thấy bên dưới, khi một hàm Python được gọi, một không gian tên mới được tạo cho chức năng đó, một hàm khác với tất cả các không gian tên khác đã tồn tại.namespace is a region of a program in which identifiers have meaning. As you’ll see below, when a Python function is called, a new namespace is created for that function, one that is distinct from all other namespaces that already exist. 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 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 chức năng khác hoặc trong chương trình chính. Trong những trường hợp này, sẽ không có sự nhầm lẫn hoặc can thiệp vì chúng được giữ trong các không gian tên riêng biệt. Điều này có nghĩa là khi bạn viết mã trong một hàm, bạn có thể sử dụng tên và định danh biến mà không phải lo lắng về việc liệu chúng có được sử dụng ở nơi khác bên ngoài chức năng hay không. Điều này giúp giảm thiểu các lỗi trong mã đáng kể. Hy vọng rằng, bạn đã đủ thuyết phục về những đức tính của các chức năng và mong muốn tạo ra một số! Hãy để xem làm thế nào. Các cuộc gọi và định nghĩa chức năngCú pháp thông thường để xác định hàm Python như sau: 3Các thành phần của định nghĩa được giải thích trong bảng dưới đây:
Mục cuối cùng, 42, được gọi là phần thân của hàm. Cơ thể là một khối các câu lệnh sẽ được thực thi khi chức năng được gọi. Cơ thể của hàm python được xác định bằng vết lõm theo quy tắc ngoài mặt. Điều này giống như các khối mã liên quan đến cấu trúc điều khiển, như câu lệnh 44 hoặc 45.body of the function. The body is a block of statements that will be executed when the function is called. The body of a Python function is defined by indentation in accordance with the off-side rule. This is the same as code blocks associated with a control structure, like an
44 or 45 statement.Cú pháp để gọi hàm Python như sau: 4 46 là các giá trị được truyền vào hàm. Chúng tương ứng với 40 trong định nghĩa hàm Python. Bạn có thể xác định một chức năng không có bất kỳ đối số nào, nhưng dấu ngoặc đơn vẫn được yêu cầu. Cả định nghĩa hàm và lệnh gọi hàm phải luôn bao gồm dấu ngoặc đơn, ngay cả khi chúng trống rỗng.Như thường lệ, bạn sẽ bắt đầu với một ví dụ nhỏ và thêm độ phức tạp từ đó. Giữ cho truyền thống toán học được tôn vinh theo thời gian, bạn sẽ gọi chức năng Python đầu tiên của mình 48. Ở đây, một tệp tập lệnh, 49, xác định và gọi 48: 5Ở đây, cách thức hoạt động của mã này:
Trình tự thực thi (hoặc luồng điều khiển) cho 49 được hiển thị trong sơ đồ sau:control flow) for 49 is shown in the following diagram:Khi 49 được chạy từ dấu nhắc lệnh Windows, kết quả như sau: 6Thỉnh thoảng, bạn có thể muốn xác định một hàm trống không làm gì cả. Điều này được gọi là cuống, thường là trình giữ chỗ tạm thời cho chức năng Python sẽ được thực hiện đầy đủ sau đó. Giống như một khối trong cấu trúc điều khiển có thể trống rỗng, cơ thể của một chức năng cũng không thể. Để xác định chức năng sơ khai, hãy sử dụng 63Statement:stub, which is usually a temporary placeholder for a Python function that will be fully implemented at a later time. Just as a block in a
control structure can’t be empty, neither can the body of a function. To define a stub function, use the 63statement:>>> 7Như bạn có thể thấy ở trên, một cuộc gọi đến chức năng sơ khai có giá trị về mặt cú pháp nhưng không làm gì cả. Đối số thông quaCho đến nay trong hướng dẫn này, các chức năng mà bạn đã xác định thiên đường đã đưa ra bất kỳ đối số nào. Điều đó đôi khi có thể hữu ích và thỉnh thoảng bạn sẽ viết các chức năng như vậy. Tuy nhiên, thường xuyên hơn, bạn sẽ muốn truyền dữ liệu vào một chức năng để hành vi của nó có thể thay đổi từ lời mời này sang cấp khác. Hãy cùng xem cách làm điều đó.pass data into a function so that its behavior can vary from one invocation to the next. Let’s see how to do that. Lập luận vị tríCách đơn giản nhất để chuyển các đối số cho hàm Python là với các đối số vị trí (còn được gọi là đối số yêu cầu). Trong định nghĩa chức năng, bạn chỉ định danh sách các tham số được phân tách bằng dấu phẩy bên trong dấu ngoặc đơn:positional arguments (also called required arguments). In the function definition, you specify a comma-separated list of parameters inside the parentheses: >>> 8Như bạn có thể thấy ở trên, một cuộc gọi đến chức năng sơ khai có giá trị về mặt cú pháp nhưng không làm gì cả. >>> 9Như bạn có thể thấy ở trên, một cuộc gọi đến chức năng sơ khai có giá trị về mặt cú pháp nhưng không làm gì cả.variables that are defined locally to the function. When the function is called, the arguments that are passed ( 67, 68, and 69) are bound to the parameters in
order, as though by variable assignment:
Trong một số văn bản lập trình, các tham số được đưa ra trong định nghĩa hàm được gọi là các tham số chính thức và các đối số trong lệnh gọi hàm được gọi là các tham số thực tế:formal parameters, and the arguments in the function call are referred to as actual parameters: Mặc dù các đối số vị trí là cách đơn giản nhất để truyền dữ liệu cho một chức năng, nhưng chúng cũng đủ khả năng linh hoạt nhất. Đối với người mới bắt đầu, thứ tự của các đối số trong cuộc gọi phải khớp với thứ tự của các tham số trong định nghĩa. Tất nhiên, không có gì để ngăn bạn chỉ định các đối số vị trí theo thứ tự, tất nhiên:order of the arguments in the call must match the order of the parameters in the definition. There’s nothing to stop you from specifying positional arguments out of order, of course: >>> 0Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó.appropriate arguments should be, and it’s the responsibility of the user of the function to be aware of that information and abide by it. Với các đối số vị trí, các đối số trong cuộc gọi và các tham số trong định nghĩa phải đồng ý không chỉ theo thứ tự mà cả về số lượng. Đó là lý do đối số vị trí cũng được gọi là các đối số yêu cầu. Bạn có thể bỏ qua bất kỳ khi gọi chức năng:number as well. That’s the reason positional arguments are also referred to as required arguments. You can’t leave any out when calling the function: >>> 1Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. >>> 2Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. Với các đối số vị trí, các đối số trong cuộc gọi và các tham số trong định nghĩa phải đồng ý không chỉ theo thứ tự mà cả về số lượng. Đó là lý do đối số vị trí cũng được gọi là các đối số yêu cầu. Bạn có thể bỏ qua bất kỳ khi gọi chức năng:Bạn cũng không thể chỉ định thêm những cái:keyword arguments as follows: >>> 3Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. >>> 4Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. >>> 5Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. >>> 6Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. Với các đối số vị trí, các đối số trong cuộc gọi và các tham số trong định nghĩa phải đồng ý không chỉ theo thứ tự mà cả về số lượng. Đó là lý do đối số vị trí cũng được gọi là các đối số yêu cầu. Bạn có thể bỏ qua bất kỳ khi gọi chức năng: >>> 7Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. >>> 8Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. Với các đối số vị trí, các đối số trong cuộc gọi và các tham số trong định nghĩa phải đồng ý không chỉ theo thứ tự mà cả về số lượng. Đó là lý do đối số vị trí cũng được gọi là các đối số yêu cầu. Bạn có thể bỏ qua bất kỳ khi gọi chức năng: Bạn cũng không thể chỉ định thêm những cái:Các lập luận vị trí là đơn giản về mặt khái niệm để sử dụng, nhưng họ không tha thứ lắm. Bạn phải chỉ định cùng một số lượng đối số trong cuộc gọi hàm vì có các tham số trong định nghĩa và theo cùng một thứ tự. Trong các phần tiếp theo, bạn sẽ thấy một số kỹ thuật thông qua đối số giúp thư giãn những hạn chế này.default or optional parameters. An example of a function definition with default parameters is shown below: >>> 9Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. >>> 0Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó.
Từ khóa đối sốKhi bạn gọi một hàm, bạn có thể chỉ định các đối số trong mẫu 76. Trong trường hợp đó, mỗi 77 phải khớp với một tham số trong định nghĩa hàm Python. Ví dụ: hàm được xác định trước đó 48 có thể được gọi với các đối số từ khóa như sau:mutable object. Consider this Python function definition:>>> 1Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. >>> 2Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. Với các đối số vị trí, các đối số trong cuộc gọi và các tham số trong định nghĩa phải đồng ý không chỉ theo thứ tự mà cả về số lượng. Đó là lý do đối số vị trí cũng được gọi là các đối số yêu cầu. Bạn có thể bỏ qua bất kỳ khi gọi chức năng: >>> 3Chức năng thậm chí có thể vẫn chạy, như trong ví dụ trên, nhưng nó rất khó có thể tạo ra kết quả chính xác. Nó có trách nhiệm của người lập trình viên xác định chức năng để ghi lại những đối số thích hợp nên là gì và nó có trách nhiệm của người dùng chức năng để nhận thức được thông tin đó và tuân thủ thông tin đó. Với các đối số vị trí, các đối số trong cuộc gọi và các tham số trong định nghĩa phải đồng ý không chỉ theo thứ tự mà cả về số lượng. Đó là lý do đối số vị trí cũng được gọi là các đối số yêu cầu. Bạn có thể bỏ qua bất kỳ khi gọi chức năng:defined only once when the function is defined (that is, when the 19 statement is executed). The default value isn’t re-defined each time the function is called. Thus, each time you call 48 without a parameter, you’re performing 91 on the same list.Bạn có thể chứng minh điều này với 33:>>> 4Mã định danh đối tượng được hiển thị xác nhận rằng, khi 84 được phép mặc định, giá trị là cùng một đối tượng với mỗi cuộc gọi. Vì các danh sách có thể thay đổi, mỗi cuộc gọi 91 tiếp theo khiến danh sách sẽ dài hơn. Đây là một cạm bẫy phổ biến và được ghi chép khá rõ khi bạn sử dụng một đối tượng có thể thay đổi làm giá trị mặc định của tham số. Nó có khả năng dẫn đến hành vi mã khó hiểu, và có lẽ tốt nhất là tránh.object identifier displayed confirms that, when 84 is allowed
to default, the value is the same object with each call. Since lists are mutable, each subsequent 91 call causes the list to get longer. This is a common and pretty well-documented pitfall when you’re using a mutable object as a parameter’s default value. It potentially leads to confusing code behavior, and is probably best avoided.Là một cách giải quyết, hãy xem xét sử dụng giá trị đối số mặc định báo hiệu không có đối số nào được chỉ định. Hầu hết mọi giá trị sẽ hoạt động, nhưng 95 là một lựa chọn phổ biến. Khi giá trị sentinel cho biết không có đối số nào được đưa ra, hãy tạo một danh sách trống mới bên trong hàm:no argument has been specified. Most any value would work, but 95 is a common choice. When the sentinel value indicates no argument is given, create a new empty list inside the function:>>> 5Mã định danh đối tượng được hiển thị xác nhận rằng, khi 84 được phép mặc định, giá trị là cùng một đối tượng với mỗi cuộc gọi. Vì các danh sách có thể thay đổi, mỗi cuộc gọi 91 tiếp theo khiến danh sách sẽ dài hơn. Đây là một cạm bẫy phổ biến và được ghi chép khá rõ khi bạn sử dụng một đối tượng có thể thay đổi làm giá trị mặc định của tham số. Nó có khả năng dẫn đến hành vi mã khó hiểu, và có lẽ tốt nhất là tránh.Là một cách giải quyết, hãy xem xét sử dụng giá trị đối số mặc định báo hiệu không có đối số nào được chỉ định. Hầu hết mọi giá trị sẽ hoạt động, nhưng def myfunction(): print("Hello World") 95 là một lựa chọn phổ biến. Khi giá trị sentinel cho biết không có đối số nào được đưa ra, hãy tạo một danh sách trống mới bên trong hàm:Lưu ý làm thế nào điều này đảm bảo rằng 84 hiện thực sự mặc định vào một danh sách trống bất cứ khi nào 48 được gọi mà không có đối số.
Vượt qua từng giá trị: Một bản sao của đối số được chuyển đến hàm. BY-BY-PREFFEMPENT: Một tham chiếu đến đối số được chuyển đến hàm.
Đại học đại tràng: Toán tử này ( 98) được sử dụng để gán trong Pascal. Nó tương tự như dấu hiệu bình đẳng ( 99) trong Python. 6 00: Hàm này hiển thị dữ liệu cho bảng điều khiển, tương tự như Python, 60.
Dòng 7: Giá trị này được xác minh bằng câu lệnh 00 này được thực hiện ngay trước khi 48 thoát. 7Dòng 18: Quay lại môi trường gọi của chương trình chính, tuyên bố 00 này cho thấy rằng sau khi trả về 48, 30 vẫn là 04, vì trước khi gọi thủ tục.passed by value, so 48 receives only a copy. When the corresponding parameter 09 is modified, 30 is unaffected.Chạy mã này tạo ra đầu ra sau: 8Trong ví dụ này, 30 được truyền theo giá trị, do đó 48 chỉ nhận được một bản sao. Khi tham số tương ứng 09 được sửa đổi, 30 không bị ảnh hưởng.passed by reference. Changes made to the corresponding parameter 09 will also modify the argument in the calling environment.Bây giờ, so sánh điều này với ví dụ tiếp theo: 9Mã này giống hệt với ví dụ đầu tiên, với một thay đổi. Nó có sự hiện diện của từ 23 phía trước 09 trong định nghĩa về thủ tục 48 trên dòng 3. Điều đó chỉ ra rằng đối số cho 48 được truyền qua tham chiếu. Các thay đổi được thực hiện cho tham số tương ứng 09 cũng sẽ sửa đổi đối số trong môi trường gọi.Đầu ra từ mã này giống như trước đây, ngoại trừ dòng cuối cùng:
Nếu một biến được truyền theo giá trị, thì hàm có một bản sao để hoạt động, nhưng nó có thể sửa đổi giá trị ban đầu trong môi trường gọi.reference means in these languages. Variable values are stored in memory. In Pascal and similar languages, a reference is essentially the address of that memory location, as demonstrated below: Nếu một biến được truyền qua tham chiếu, thì bất kỳ thay đổi nào mà hàm thực hiện đối với tham số tương ứng sẽ ảnh hưởng đến giá trị trong môi trường gọi.passed by value, so memory for the corresponding parameter 09 is allocated in the namespace of 48, and the value of 30 is copied there. When 48 modifies 09, it’s this local copy that is changed. The value of 30 in the calling environment
remains unaffected.Trong sơ đồ bên phải, 30 được truyền qua tham chiếu. Tham số tương ứng 09 điểm vào địa chỉ thực trong không gian tên chương trình chính trong đó giá trị của 30 được lưu trữ. Khi 48 sửa đổi 09, nó sẽ sửa đổi giá trị ở vị trí đó, giống như khi chương trình chính đang sửa đổi chính 30.passed by reference. The corresponding parameter 09 points to the actual address in the main program’s namespace where the value of 30 is stored. When 48 modifies 09, it’s modifying the value in that location, just the same as if the main program were modifying 30 itself.By-by-giá trị vs Pass-Ty-TtefCác tham số trong Python Pass-By-Value hoặc Pass-Ttefer? Câu trả lời là họ cũng không, chính xác. Điều đó bởi vì một tài liệu tham khảo không có nghĩa là điều tương tự trong Python như ở Pascal. Hãy nhớ lại rằng trong Python, mỗi phần dữ liệu là một đối tượng. Một tham chiếu trỏ đến một đối tượng, không phải là một vị trí bộ nhớ cụ thể. Điều đó có nghĩa là sự phân công được giải thích theo cách tương tự trong Python như ở Pascal. Hãy xem xét cặp tuyên bố sau đây trong Pascal:object. A reference points to an object, not a specific memory location. That means assignment isn’t interpreted the same way in Python as it is in Pascal. Consider the following pair of statements in Pascal: Chúng được giải thích theo cách này:
Ngược lại, trong Python, các câu lệnh gán tương tự như sau: Các câu lệnh gán này có nghĩa sau:
Trong Python, khi bạn chuyển một đối số cho một chức năng, một sự phản hồi tương tự xảy ra. Xem xét ví dụ này:rebinding occurs. Consider this example: >>> 0Trong chương trình chính, câu lệnh 58 trên dòng 4 tạo ra một tham chiếu có tên 30 bị ràng buộc với một đối tượng có giá trị là 04. 48 sau đó được gọi trên dòng 5, với 30 như một đối số. Khi 48 bắt đầu lần đầu tiên, một tham chiếu mới có tên 09 được tạo, ban đầu chỉ vào cùng một đối tượng 04 như 30 không:Tuy nhiên, khi câu lệnh 67 trên dòng 2 được thực thi, 48 REBINDS 09 cho một đối tượng mới có giá trị là 12. Hai tài liệu tham khảo, 30 và 09, được tách rời nhau. Không có gì khác mà 48 sẽ ảnh hưởng đến 30 và khi 48 chấm dứt, 30 vẫn sẽ chỉ vào đối tượng 04, như trước khi gọi chức năng:rebinds 09 to a new object whose value is 12. The two references, 30 and 09, are uncoupled from one another. Nothing else that 48 does will affect 30, and when 48 terminates, 30 will still point to the
object 04, as it did prior to the function call:Bạn có thể xác nhận tất cả điều này bằng cách sử dụng 33. Ở đây, một phiên bản tăng cường một chút của ví dụ trên hiển thị các định danh số của các đối tượng liên quan:>>> 1Trong chương trình chính, câu lệnh 58 trên dòng 4 tạo ra một tham chiếu có tên 30 bị ràng buộc với một đối tượng có giá trị là 04. 48 sau đó được gọi trên dòng 5, với 30 như một đối số. Khi 48 bắt đầu lần đầu tiên, một tham chiếu mới có tên 09 được tạo, ban đầu chỉ vào cùng một đối tượng 04 như 30 không:Tuy nhiên, khi câu lệnh 67 trên dòng 2 được thực thi, 48 REBINDS 09 cho một đối tượng mới có giá trị là 12. Hai tài liệu tham khảo, 30 và 09, được tách rời nhau. Không có gì khác mà 48 sẽ ảnh hưởng đến 30 và khi 48 chấm dứt, 30 vẫn sẽ chỉ vào đối tượng 04, như trước khi gọi chức năng:Bạn có thể xác nhận tất cả điều này bằng cách sử dụng 33. Ở đây, một phiên bản tăng cường một chút của ví dụ trên hiển thị các định danh số của các đối tượng liên quan:>>> 2Trong chương trình chính, câu lệnh 58 trên dòng 4 tạo ra một tham chiếu có tên 30 bị ràng buộc với một đối tượng có giá trị là 04. 48 sau đó được gọi trên dòng 5, với 30 như một đối số. Khi 48 bắt đầu lần đầu tiên, một tham chiếu mới có tên 09 được tạo, ban đầu chỉ vào cùng một đối tượng 04 như 30 không:rebound, and the connection to the original
object is lost.Tuy nhiên, khi câu lệnh 67 trên dòng 2 được thực thi, 48 REBINDS 09 cho một đối tượng mới có giá trị là 12. Hai tài liệu tham khảo, 30 và 09, được tách rời nhau. Không có gì khác mà 48 sẽ ảnh hưởng đến 30 và khi 48 chấm dứt, 30 vẫn sẽ chỉ vào đối tượng 04, như trước khi gọi chức năng:>>> 3Trong chương trình chính, câu lệnh 58 trên dòng 4 tạo ra một tham chiếu có tên 30 bị ràng buộc với một đối tượng có giá trị là 04. 48 sau đó được gọi trên dòng 5, với 30 như một đối số. Khi 48 bắt đầu lần đầu tiên, một tham chiếu mới có tên 09 được tạo, ban đầu chỉ vào cùng một đối tượng 04 như 30 không:Tuy nhiên, khi câu lệnh 67 trên dòng 2 được thực thi, 48 REBINDS 09 cho một đối tượng mới có giá trị là 12. Hai tài liệu tham khảo, 30 và 09, được tách rời nhau. Không có gì khác mà 48 sẽ ảnh hưởng đến 30 và khi 48 chấm dứt, 30 vẫn sẽ chỉ vào đối tượng 04, như trước khi gọi chức năng:>>> 4Ở đây, 48 sử dụng 30 làm tài liệu tham khảo để thực hiện thay đổi bên trong 12. Sự thay đổi đó được phản ánh trong môi trường gọi sau khi 48 trả về.Đối số thông qua tóm tắtĐối số thông qua trong Python có thể được tóm tắt như sau. Vượt qua một đối tượng bất biến, như 89, 92, 16 hoặc 17, cho chức năng Python hoạt động như giá trị qua. Hàm có thể sửa đổi đối tượng trong môi trường gọi.Passing an immutable object, like an 89, 92,
16, or 17, to a Python function acts like pass-by-value. The function can’t modify the object in the calling environment.Vượt qua một đối tượng có thể thay đổi, chẳng hạn như 93,
90, or 91 acts somewhat—but not exactly—like pass-by-reference. The function can’t reassign the object wholesale, but it can change items in place within the object, and these changes will be reflected in the calling environment.Phản ứng phụVì vậy, trong Python, bạn có thể sửa đổi một đối số từ trong một hàm để sự thay đổi được phản ánh trong môi trường gọi. Nhưng bạn có nên làm điều này không? Đây là một ví dụ về những gì mà người ta đề cập trong Lập trình Lingo là một tác dụng phụ.side effect. Tổng quát hơn, một chức năng Python được cho là gây ra tác dụng phụ nếu nó sửa đổi môi trường gọi của nó theo bất kỳ cách nào. Thay đổi giá trị của một đối số chức năng chỉ là một trong những khả năng. Khi họ bị ẩn hoặc bất ngờ, các tác dụng phụ có thể dẫn đến các lỗi chương trình rất khó theo dõi. Nói chung, nó tốt nhất để tránh chúng. Tuyên bố def myfunction(): print("Hello World") 22Những gì một chức năng Python để làm sau đó? Rốt cuộc, trong nhiều trường hợp, nếu một hàm không gây ra một số thay đổi trong môi trường gọi, thì có rất nhiều điểm trong việc gọi nó. Làm thế nào một chức năng ảnh hưởng đến người gọi của nó? Vâng, một khả năng là sử dụng các giá trị trả về chức năng. Một câu lệnh 22 trong hàm Python phục vụ hai mục đích:function return values. A 22 statement in a Python function serves two purposes:
Thoát một chức năngTrong một hàm, câu lệnh 22 gây ra thoát ngay lập tức khỏi hàm Python và chuyển thực thi lại cho người gọi:>>> 5Trong ví dụ này, tuyên bố 22 thực sự là thừa. Một chức năng sẽ trở lại với người gọi khi nó rơi ra khỏi phần cuối, đó là, sau khi câu lệnh cuối cùng của cơ thể chức năng được thực thi. Vì vậy, chức năng này sẽ hoạt động giống hệt nhau mà không có câu lệnh 22.falls off the end—that is, after the last statement of the function body is executed. So, this function would behave identically without the 22 statement.Tuy nhiên, các tuyên bố 22 don don cần phải ở cuối chức năng. Chúng có thể xuất hiện bất cứ nơi nào trong một cơ thể chức năng, và thậm chí nhiều lần. Xem xét ví dụ này:>>> 6Hai cuộc gọi đầu tiên đến 48 don lồng gây ra bất kỳ đầu ra nào, bởi vì câu lệnh 22 được thực thi và chức năng thoát ra sớm, trước khi đạt được câu lệnh 60 trên dòng 6.Loại mô hình này có thể hữu ích để kiểm tra lỗi trong một hàm. Bạn có thể kiểm tra một số điều kiện lỗi khi bắt đầu chức năng, với các câu lệnh 22 được bảo lãnh nếu có vấn đề:error checking in a function. You can check several error conditions at
the start of the function, with 22 statements that bail out if there’s a problem: 7Nếu không gặp phải điều kiện lỗi nào, thì chức năng có thể tiến hành xử lý bình thường. Trả lại dữ liệu cho người gọiNgoài việc thoát một hàm, câu lệnh 22 cũng được sử dụng để chuyển dữ liệu trở lại cho người gọi. Nếu câu lệnh 22 bên trong hàm python được theo sau bởi một biểu thức, thì trong môi trường gọi, thì gọi gọi sẽ đánh giá giá trị của biểu thức đó:pass data back to the caller. If a 22 statement inside a Python function is followed by an expression, then in the calling environment, the function call evaluates to the value of that expression:>>> 8Ở đây, giá trị của biểu thức 48 trên dòng 5 là 96, sau đó được gán cho biến 35.Một hàm có thể trả về bất kỳ loại đối tượng. Trong Python, điều đó có nghĩa là khá nhiều bất cứ điều gì. Trong môi trường gọi, cuộc gọi chức năng có thể được sử dụng theo cách cú pháp theo bất kỳ cách nào có ý nghĩa đối với loại đối tượng mà hàm trả về.object. In Python, that means pretty much anything whatsoever. In the calling environment, the function call can be used syntactically in any way that makes sense for the type of object the function returns. Ví dụ: trong mã này, 48 trả về từ điển. Trong môi trường gọi sau đó, biểu thức 48 đại diện cho một từ điển và 38 là một tham chiếu chính hợp lệ vào từ điển đó:>>> 9Trong ví dụ tiếp theo, 48 trả về một chuỗi mà bạn có thể cắt như bất kỳ chuỗi nào khác:>>> 0Ở đây, 48 Trả về một danh sách có thể được lập chỉ mục hoặc cắt lát:>>> 1Nếu nhiều biểu thức được phân tách bằng dấu phẩy được chỉ định trong câu lệnh 22, thì chúng đã đóng gói và trả về dưới dạng một bộ thuật:>>> 2Khi không có giá trị trả về, hàm Python trả về giá trị Python đặc biệt 95:>>> 3Điều tương tự cũng xảy ra nếu cơ thể chức năng không chứa câu lệnh 22 và chức năng rơi ra khỏi cuối:>>> 4Hãy nhớ lại rằng 95 là giả khi được đánh giá trong bối cảnh Boolean.Vì các chức năng thoát khỏi câu lệnh 22 trần hoặc rơi ra khỏi trả về kết thúc 95, một cuộc gọi đến một hàm như vậy có thể được sử dụng trong bối cảnh boolean:>>> 5Ở đây, các cuộc gọi đến cả 48 và 48 là giả, vì vậy 49 cũng vậy và mệnh đề 50 được thực thi.Xem lại các tác dụng phụGiả sử bạn muốn viết một hàm có một đối số số nguyên và nhân đôi nó. Đó là, bạn muốn truyền một biến số nguyên cho hàm và khi hàm trở lại, giá trị của biến trong môi trường gọi phải gấp đôi so với. Trong Pascal, bạn có thể thực hiện điều này bằng cách sử dụng từng tham chiếu: 6Thực hiện mã này tạo ra đầu ra sau, xác minh rằng 51 thực sự sửa đổi 30 trong môi trường gọi điện: 7Trong Python, công việc giành chiến thắng này. Như bạn đã biết, các số nguyên Python là bất biến, do đó, một hàm Python có thể thay đổi một đối số số nguyên theo tác dụng phụ: >>> 8Ở đây, các cuộc gọi đến cả 48 và 48 là giả, vì vậy 49 cũng vậy và mệnh đề 50 được thực thi.>>> 9Ở đây, các cuộc gọi đến cả 48 và 48 là giả, vì vậy 49 cũng vậy và mệnh đề 50 được thực thi.Xem lại các tác dụng phụ >>> 0Giả sử bạn muốn viết một hàm có một đối số số nguyên và nhân đôi nó. Đó là, bạn muốn truyền một biến số nguyên cho hàm và khi hàm trở lại, giá trị của biến trong môi trường gọi phải gấp đôi so với. Trong Pascal, bạn có thể thực hiện điều này bằng cách sử dụng từng tham chiếu: Thực hiện mã này tạo ra đầu ra sau, xác minh rằng 51 thực sự sửa đổi 30 trong môi trường gọi điện:>>> 1Trong Python, công việc giành chiến thắng này. Như bạn đã biết, các số nguyên Python là bất biến, do đó, một hàm Python có thể thay đổi một đối số số nguyên theo tác dụng phụ: Tuy nhiên, bạn có thể sử dụng giá trị trả về để có được hiệu ứng tương tự. Chỉ cần viết def subtractNum(): print(34 - 4) subtractNum() # Output: 30 51 để nó có một đối số số nguyên, nhân đôi nó và trả về giá trị nhân đôi. Sau đó, người gọi chịu trách nhiệm cho việc gán sửa đổi giá trị ban đầu:Điều này được cho là thích hợp để sửa đổi bằng hiệu ứng phụ. Nó rất rõ ràng rằng 30 đang được sửa đổi trong môi trường gọi vì người gọi đang tự làm như vậy. Dù sao đi nữa, đó là lựa chọn duy nhất, bởi vì sửa đổi theo hiệu ứng phụ không hoạt động trong trường hợp này.>>> 2Tuy nhiên, ngay cả trong trường hợp có thể sửa đổi một đối số theo tác dụng phụ, sử dụng giá trị trả lại vẫn có thể rõ ràng hơn. Giả sử bạn muốn tăng gấp đôi mọi mục trong danh sách. Bởi vì các danh sách có thể thay đổi, bạn có thể xác định chức năng Python sửa đổi danh sách tại chỗ: Không giống như 51 Trong ví dụ trước, 56 thực sự hoạt động như dự định. Nếu tài liệu cho chức năng nêu rõ rằng nội dung đối số danh sách được thay đổi, thì đây có thể là một triển khai hợp lý.>>> 3Tuy nhiên, bạn cũng có thể viết 56 để chuyển danh sách mong muốn trở lại bằng giá trị trả về và cho phép người gọi thực hiện bài tập, tương tự như cách 51 được viết lại trong ví dụ trước:>>> 4Hoặc cách tiếp cận hoạt động tốt như nhau. Như thường lệ, đây là vấn đề của phong cách và sở thích cá nhân khác nhau. Tác dụng phụ aren nhất thiết phải hoàn thành cái ác, và chúng có vị trí của họ, nhưng vì hầu như mọi thứ đều có thể được trả lại từ một chức năng, điều tương tự thường có thể được thực hiện thông qua các giá trị trở lại. 5Danh sách đối số có độ dài thay đổi >>> 6Trong một số trường hợp, khi bạn xác định một chức năng, bạn có thể không biết trước đó có bao nhiêu đối số mà bạn sẽ muốn. Giả sử, ví dụ, bạn muốn viết một hàm Python tính toán trung bình của một số giá trị. Bạn có thể bắt đầu với một cái gì đó như thế này: Tất cả đều tốt nếu bạn muốn trung bình ba giá trị: >>> 7Tuy nhiên, như bạn đã thấy, khi các đối số vị trí được sử dụng, số lượng đối số được thông qua phải đồng ý với số lượng tham số được khai báo. Rõ ràng sau đó, tất cả đều không tốt với việc triển khai 59 này cho bất kỳ số lượng giá trị nào khác ngoài ba:>>> 8Bạn có thể cố gắng xác định 59 với các tham số tùy chọn:Điều này cho phép một số lượng khác nhau được chỉ định. Các cuộc gọi sau ít nhất là chính xác về mặt cú pháp: Nhưng cách tiếp cận này vẫn phải chịu một vài vấn đề. Đối với người mới bắt đầu, nó vẫn chỉ cho phép tối đa năm đối số, không phải là một số tùy ý. Tệ hơn nữa, không có cách nào để phân biệt giữa các đối số được chỉ định và các đối số được phép mặc định. Chức năng không có cách nào để biết có bao nhiêu đối số đã được thông qua, vì vậy nó không biết những gì cần chia cho:Khi một tên tham số trong định nghĩa hàm python được đi trước bởi dấu hoa thị ( 62), nó chỉ ra việc đóng gói đối số. Bất kỳ đối số tương ứng nào trong lệnh gọi hàm được đóng gói thành một bộ thuật mà hàm có thể đề cập đến tên tham số đã cho. Đây là một ví dụ:argument tuple packing. Any corresponding arguments in the function call are packed into a tuple that the function can refer to by the given
parameter name. Here’s an example:>>> 9Trong định nghĩa của 48, đặc tả tham số 65 chỉ ra đóng gói tple. Trong mỗi cuộc gọi đến 48, các đối số được đóng gói thành một bộ thuật mà hàm có thể đề cập đến tên 67. Bất kỳ tên nào cũng có thể được sử dụng, nhưng 67 thường được chọn đến mức nó thực tế là một tiêu chuẩn.Sử dụng đóng gói Tuple, bạn có thể dọn dẹp 59 như thế này:
>>> 0Trong định nghĩa của 48, đặc tả tham số 65 chỉ ra đóng gói tple. Trong mỗi cuộc gọi đến 48, các đối số được đóng gói thành một bộ thuật mà hàm có thể đề cập đến tên 67. Bất kỳ tên nào cũng có thể được sử dụng, nhưng 67 thường được chọn đến mức nó thực tế là một tiêu chuẩn.>>> 1Trong định nghĩa của 48, đặc tả tham số 65 chỉ ra đóng gói tple. Trong mỗi cuộc gọi đến 48, các đối số được đóng gói thành một bộ thuật mà hàm có thể đề cập đến tên 67. Bất kỳ tên nào cũng có thể được sử dụng, nhưng 67 thường được chọn đến mức nó thực tế là một tiêu chuẩn.Sử dụng đóng gói Tuple, bạn có thể dọn dẹp 59 như thế này:>>> 2Trong định nghĩa của 48, đặc tả tham số 65 chỉ ra đóng gói tple. Trong mỗi cuộc gọi đến 48, các đối số được đóng gói thành một bộ thuật mà hàm có thể đề cập đến tên 67. Bất kỳ tên nào cũng có thể được sử dụng, nhưng 67 thường được chọn đến mức nó thực tế là một tiêu chuẩn.Sử dụng đóng gói Tuple, bạn có thể dọn dẹp def subtractNum(): print(34 - 4) subtractNum() # Output: 30 59 như thế này:Tốt hơn hết, bạn có thể dọn dẹp nó hơn nữa bằng cách thay thế vòng lặp 70 bằng hàm Python tích hợp 71, tổng hợp các giá trị số trong bất kỳ điều kiện nào:unpacked and passed to the function as separate values:>>> 3Bây giờ, 59 được viết chính xác và hoạt động như dự định.Tuy nhiên, tùy thuộc vào cách sử dụng mã này, vẫn có thể có việc phải làm. Như đã viết, 59 sẽ tạo ra một ngoại lệ 74 nếu bất kỳ đối số nào không phải là số lượng:tuple unpacking, it doesn’t only work with tuples. The asterisk ( 62) operator can be applied to any iterable in a Python function call. For example, a list or set can be unpacked as well:>>> 4Để mạnh mẽ nhất có thể, bạn nên thêm mã để kiểm tra xem các đối số thuộc loại thích hợp. Sau đó trong loạt bài hướng dẫn này, bạn sẽ học cách bắt các ngoại lệ như 74 và xử lý chúng một cách thích hợp. Bạn cũng có thể kiểm tra các ngoại lệ Python: Giới thiệu.>>> 5Đối số tuple giải nén Một hoạt động tương tự có sẵn ở phía bên kia của phương trình trong một cuộc gọi hàm Python. Khi một đối số trong một cuộc gọi hàm được đi trước bởi dấu hoa thị (def subtractNum(): print(34 - 4) subtractNum() # Output: 30 62), nó chỉ ra rằng đối số là một tuple nên được giải nén và truyền cho hàm dưới dạng các giá trị riêng biệt:Trong ví dụ này, 77 trong lệnh gọi hàm chỉ ra rằng 78 là một tuple cần được giải nén. Các giá trị chưa đóng gói 96, 80 và 81 được gán cho các tham số 30, 31 và 32, tương ứng.dictionary packing and unpacking. Preceding a parameter in a Python function definition by a double asterisk ( 91) indicates that the corresponding arguments, which are expected to be
93 pairs, should be packed into a dictionary:>>> 6Mặc dù loại giải nén này được gọi là Tuple giải nén, nhưng nó không chỉ hoạt động với các bộ dữ liệu. Toán tử Asterisk ( 62) có thể được áp dụng cho bất kỳ điều đáng thể nào trong một cuộc gọi chức năng Python. Ví dụ, một danh sách hoặc bộ cũng có thể được giải nén:keyword args) is nearly standard. You don’t have to adhere to it, but if you do, then anyone familiar with Python coding conventions will know straightaway what you mean.Bạn thậm chí có thể sử dụng đóng gói Tuple và giải nén cùng một lúc:Ở đây, 91) precedes an argument in a Python function call, it specifies that the argument is a dictionary that should be unpacked, with the resulting items passed to the function as keyword arguments:>>> 7Đối số đóng gói từ điển >>> 8Python có một toán tử tương tự, dấu hoa thị kép ( 91), có thể được sử dụng với các tham số chức năng Python và các đối số để chỉ định đóng gói từ điển và giải nén. Trước một tham số trong định nghĩa hàm python bằng dấu hoa thị kép ( 91) chỉ ra rằng các đối số tương ứng, dự kiến sẽ là các cặp ____393, nên được đóng gói vào từ điển:>>> 9Trong trường hợp này, các đối số 94, 95 và 96 được đóng gói vào một từ điển mà hàm có thể tham chiếu theo tên 97. Một lần nữa, bất kỳ tên nào cũng có thể được sử dụng, nhưng đặc thù 97 (viết tắt của từ khóa Args) là gần như tiêu chuẩn. Bạn không cần phải tuân thủ nó, nhưng nếu bạn làm, thì bất kỳ ai quen thuộc với các quy ước mã hóa Python sẽ biết ngay ý nghĩa của bạn.Từ điển tranh luận Giải nénTừ điển đối số Giải nén là tương tự như đối số giải nén. Khi dấu hoa thị kép ( 91) đi trước một đối số trong lệnh gọi hàm python, nó chỉ định rằng đối số là một từ điển nên được giải nén, với các mục kết quả được chuyển đến hàm làm đối số từ khóa:Các mục trong Từ điển 00 được giải nén và được chuyển đến 48 dưới dạng đối số từ khóa. Vì vậy, 02 tương đương với 03:>>> 0Trong thực tế, hãy kiểm tra điều này: Nhiều gói trong một cuộc gọi chức năng PythonPython phiên bản 3.5 đã giới thiệu hỗ trợ cho việc giải nén bổ sung, như được nêu trong PEP 448. Một điều mà các cải tiến này cho phép là nhiều lần giải nén trong một cuộc gọi chức năng Python duy nhất:multiple unpackings in a single Python function call: >>> 1Bạn cũng có thể chỉ định nhiều bộ phận từ điển trong cuộc gọi chức năng Python: >>> Bạn cũng có thể chỉ định nhiều bộ phận từ điển trong cuộc gọi chức năng Python: 2>>> 3Bạn cũng có thể chỉ định nhiều bộ phận từ điển trong cuộc gọi chức năng Python: >>> s = 'foobar' >>> id(s) 56313440 2Nhân tiện, các toán tử giải nén 62 và 91 don don chỉ áp dụng cho các biến, như trong các ví dụ trên. Bạn cũng có thể sử dụng chúng với các chữ có thể hiểu được:keyword-only arguments. These are function arguments that must be specified by keyword. Let’s explore a situation where this might be beneficial.Ở đây, các danh sách theo nghĩa đen 13 và 14 được chỉ định để giải nén tple và từ điển theo nghĩa đen 15 và 16 được chỉ định để giải nén từ điển.>>> 4Bạn cũng có thể chỉ định nhiều bộ phận từ điển trong cuộc gọi chức năng Python: >>> 5Bạn cũng có thể chỉ định nhiều bộ phận từ điển trong cuộc gọi chức năng Python:
Ở đây, các danh sách theo nghĩa đen 13 và 14 được chỉ định để giải nén tple và từ điển theo nghĩa đen 15 và 16 được chỉ định để giải nén từ điển.>>> 6Bạn cũng có thể chỉ định nhiều bộ phận từ điển trong cuộc gọi chức năng Python:positional parameter, so the interpreter assumes that the first argument specified in the function call is the intended output prefix. This means there isn’t any way to omit it and obtain the default value: >>> 7Bạn cũng có thể chỉ định nhiều bộ phận từ điển trong cuộc gọi chức năng Python: >>> 8 2Nhân tiện, các toán tử giải nén 62 và 91 don don chỉ áp dụng cho các biến, như trong các ví dụ trên. Bạn cũng có thể sử dụng chúng với các chữ có thể hiểu được:>>> 9Ở đây, các danh sách theo nghĩa đen 13 và 14 được chỉ định để giải nén tple và từ điển theo nghĩa đen 15 và 16 được chỉ định để giải nén từ điển.Đối số chỉ từ khóa help solve this dilemma. In the function definition, specify 65
to indicate a variable number of positional arguments, and then specify 19 after that:>>> 0Một hàm Python trong phiên bản 3.x có thể được xác định để nó có các đối số chỉ có từ khóa. Đây là các đối số chức năng phải được chỉ định bởi từ khóa. Hãy để khám phá một tình huống mà điều này có thể có lợi. >>> 1Giả sử bạn muốn viết một hàm Python có một số lượng các đối số chuỗi khác nhau, kết hợp chúng với nhau được phân tách bằng một dấu chấm ( 17) và in chúng vào bảng điều khiển. Một cái gì đó như thế này sẽ làm để bắt đầu:Khi nó đứng, tiền tố đầu ra được mã hóa cứng cho chuỗi 18. Điều gì sẽ xảy ra nếu bạn muốn sửa đổi chức năng để chấp nhận điều này như một đối số, vì vậy người dùng có thể chỉ định một cái gì đó khác? Đây là một khả năng:options as keyword arguments. If you wanted to modify 29 so that the separator character can optionally be specified as well, then you could add an additional keyword-only argument:>>> 2Điều này hoạt động như quảng cáo, nhưng có một vài điều không mong muốn về giải pháp này: >>> 3Chuỗi 19 được gộp lại cùng với các chuỗi được nối. Chỉ cần nhìn vào cuộc gọi chức năng, rõ ràng là đối số đầu tiên được đối xử khác với phần còn lại. Để biết điều đó, bạn phải quay lại và xem xét định nghĩa chức năng.
>>> 4 19 là tùy chọn. Nó luôn luôn phải được đưa vào, và ở đó, không có cách nào để giả định giá trị mặc định.>>> 5Bạn có thể nghĩ rằng bạn có thể khắc phục vấn đề thứ hai bằng cách chỉ định một tham số có giá trị mặc định, như thế này, có lẽ: >>> 6Thật không may, điều này không hoạt động khá đúng. 19 là một tham số vị trí, do đó, trình thông dịch giả định rằng đối số đầu tiên được chỉ định trong lệnh gọi hàm là tiền tố đầu ra dự định. Điều này có nghĩa là không có cách nào để bỏ qua nó và có được giá trị mặc định:>>> 7Trong ví dụ này, đối số bổ sung không nên ở đó (như chính cuộc tranh luận đã thông báo). Thay vì lặng lẽ thành công, nó thực sự sẽ dẫn đến một lỗi. Thực tế là nó không bị ràng buộc nhất. Tệ nhất, nó có thể gây ra một kết quả xuất hiện sai lệch: Để khắc phục điều này, phiên bản 3 cho phép tham số đối số biến trong định nghĩa hàm Python chỉ là dấu hoa thị trần ( 62), với tên bị bỏ qua:variable argument parameter in a Python function definition to be just a bare asterisk ( 62), with the name omitted:>>> 8Tham số đối số biến trần 62 chỉ ra rằng không có bất kỳ tham số vị trí nào khác. Hành vi này tạo ra thông báo lỗi thích hợp nếu thêm các thông báo được chỉ định. Nó cho phép các tham số chỉ có từ khóa tuân theo.bare variable argument parameter 62 indicates
that there aren’t any more positional parameters. This behavior generates appropriate error messages if extra ones are specified. It allows keyword-only parameters to follow.Đối số chỉ có vị tríKể từ Python 3.8, các tham số chức năng cũng có thể được khai báo chỉ là vị trí, có nghĩa là các đối số tương ứng phải được cung cấp vị trí và có thể được chỉ định bởi từ khóa.positional-only, meaning the corresponding arguments must be supplied positionally and can’t be specified by keyword. Để chỉ định một số tham số là chỉ có vị trí, bạn chỉ định một dấu gạch chéo trần ( 34) trong danh sách tham số của một định nghĩa hàm. Bất kỳ tham số nào ở bên trái của dấu gạch chéo ( 34) phải được chỉ định vị trí. Ví dụ: trong định nghĩa chức năng sau, 30 và 31 là các tham số chỉ có vị trí, nhưng 32 có thể được chỉ định bằng từ khóa:>>> 9Điều này có nghĩa là các cuộc gọi sau là hợp lệ: >>> 00Tuy nhiên, cuộc gọi sau đây đến 48 không hợp lệ:>>> 01Cả hai người chỉ định chỉ có vị trí và chỉ có từ khóa có thể được sử dụng trong cùng một định nghĩa chức năng: >>> 02Trong ví dụ này:
Để biết thêm thông tin về các tham số chỉ có vị trí, hãy xem các điểm nổi bật phát hành Python 3.8. DocstringsKhi tuyên bố đầu tiên trong phần thân của hàm Python là một chuỗi theo nghĩa đen, nó được gọi là chức năng của Doc DomaString. Một tài liệu được sử dụng để cung cấp tài liệu cho một chức năng. Nó có thể chứa mục đích của chức năng, những đối số mà nó cần, thông tin về các giá trị trả về hoặc bất kỳ thông tin nào khác mà bạn nghĩ sẽ hữu ích.docstring. A docstring is used to supply documentation for a function. It can contain the function’s purpose, what arguments it takes, information about return values, or any other information you think would be useful. Sau đây là một ví dụ về định nghĩa hàm với DocString: >>> 03Về mặt kỹ thuật, Docstrings có thể sử dụng bất kỳ cơ chế trích dẫn Python nào, nhưng quy ước được đề xuất là ba lần sử dụng các ký tự trích dẫn kép ( 46), như được hiển thị ở trên. Nếu DocString phù hợp với một dòng, thì các trích dẫn đóng sẽ nằm trên cùng một dòng với các trích dẫn mở.triple-quote using double-quote characters
( 46), as shown above. If the docstring fits on one line, then the closing quotes should be on the same line as the opening quotes.Các tài liệu đa dòng được sử dụng cho tài liệu dài hơn. Một tài liệu đa dòng nên bao gồm một dòng tóm tắt, theo sau là một dòng trống, theo sau là một mô tả chi tiết hơn. Các báo giá đóng nên tự mình trên một dòng: are used for lengthier documentation. A multi-line docstring should consist of a summary line, followed by a blank line, followed by a more detailed description. The closing quotes should be on a line by themselves: >>> 04
Định dạng DocString và các quy ước ngữ nghĩa được trình bày chi tiết trong PEP 257. Khi một tài liệu được xác định, trình thông dịch Python gán nó cho một thuộc tính đặc biệt của hàm gọi là 47. Thuộc tính này là một trong những bộ định danh chuyên dụng trong Python đôi khi được gọi là thuộc tính ma thuật hoặc phương thức ma thuật vì chúng cung cấp chức năng ngôn ngữ đặc biệt.magic attributes or magic methods because they provide special language functionality. Bạn có thể truy cập vào một chức năng của DocString với biểu thức 48. Các tài liệu cho các ví dụ trên có thể được hiển thị như sau:>>> 05Trong trình thông dịch Python tương tác, bạn có thể nhập 49 để hiển thị tài liệu cho 39:>>> 06Nó đã xem xét thực hành mã hóa tốt để chỉ định một tài liệu cho từng chức năng Python mà bạn xác định. Để biết thêm về DocStrings, hãy xem tài liệu mã Python: Hướng dẫn đầy đủ. Chú thích chức năng PythonKể từ phiên bản 3.0, Python cung cấp một tính năng bổ sung để ghi lại một hàm gọi là chú thích chức năng. Các chú thích cung cấp một cách để đính kèm siêu dữ liệu vào các tham số chức năng và giá trị trả về.function annotation. Annotations provide a way to attach metadata to a function’s parameters and return value. Để thêm một chú thích vào tham số chức năng Python, chèn một dấu hai chấm ( 41) theo sau là bất kỳ biểu thức nào sau tên tham số trong định nghĩa hàm. Để thêm một chú thích vào giá trị trả về, hãy thêm các ký tự 52 và bất kỳ biểu thức nào giữa dấu ngoặc đơn của danh sách tham số và dấu hai chấm kết thúc tiêu đề hàm. Đây là một ví dụ:>>> 07Chú thích cho tham số 87 là chuỗi 54, cho 43 Chuỗi 56 và cho giá trị trả về hàm, chuỗi 57.Trình thông dịch Python tạo ra một từ điển từ các chú thích và gán chúng cho một thuộc tính Dunder đặc biệt khác của hàm gọi là 58. Các chú thích cho hàm Python 48 được hiển thị ở trên có thể được hiển thị như sau:>>> 08Các khóa cho các tham số là tên tham số. Khóa cho giá trị trả về là chuỗi 60:>>> 09Lưu ý rằng các chú thích aren giới hạn trong các giá trị chuỗi. Họ có thể là bất kỳ biểu thức hoặc đối tượng. Ví dụ: bạn có thể chú thích với các đối tượng loại: >>> 10Chú thích thậm chí có thể là một đối tượng tổng hợp như danh sách hoặc từ điển, do đó, nó có thể gắn nhiều mục siêu dữ liệu vào các tham số và giá trị trả về: >>> 11Trong ví dụ trên, một chú thích được gắn vào tham số 61 và với giá trị trả về. Mỗi chú thích là một từ điển chứa một mô tả chuỗi và một đối tượng loại.Nếu bạn muốn gán giá trị mặc định cho tham số có chú thích, thì giá trị mặc định sẽ đi sau khi chú thích: >>> 12Chú thích làm gì? Thành thật mà nói, họ không làm gì nhiều. Họ chỉ là loại ở đó. Hãy cùng xem xét một trong những ví dụ từ trên cao, nhưng với một vài sửa đổi nhỏ: >>> 13Những gì đang xảy ra ở đây? Các chú thích cho 48 chỉ ra rằng đối số đầu tiên là 89, đối số thứ hai 92 và giá trị trả về 65. Nhưng cuộc gọi tiếp theo đến 48 phá vỡ tất cả các quy tắc! Các đối số lần lượt là 92 và 65 và giá trị trả về là một tuple. Tuy nhiên, thông dịch viên cho phép tất cả trượt mà không có khiếu nại nào cả.Chú thích don lồng áp đặt bất kỳ hạn chế ngữ nghĩa nào đối với mã. Chúng chỉ đơn giản là các bit của siêu dữ liệu được gắn vào các tham số hàm Python và giá trị trả về. Python một cách nghiêm túc cất chúng trong một từ điển, gán từ điển cho chức năng của thuộc tính Dunder ____458, và đó là nó. Các chú thích là hoàn toàn tùy chọn và don lồng có bất kỳ tác động nào đến việc thực thi chức năng Python.semantic restrictions on the code whatsoever. They’re simply bits of metadata attached to the Python function parameters and return value. Python dutifully stashes them in a dictionary, assigns the dictionary to the function’s 58 dunder attribute, and that’s it. Annotations are completely optional and
don’t have any impact on Python function execution at all.Để trích dẫn Amahl ở Amahl và khách truy cập ban đêm, thì đó là những gì mà sử dụng nó sau đó? Đối với người mới bắt đầu, chú thích làm tài liệu tốt. Tất nhiên, bạn có thể chỉ định cùng một thông tin trong DocString, nhưng việc đặt nó trực tiếp vào định nghĩa chức năng thêm rõ ràng. Các loại đối số và giá trị trả về là rõ ràng trên tầm nhìn cho một tiêu đề chức năng như sau:documentation. You can specify the same information in the docstring, of course, but placing it directly in the function definition adds clarity. The types of the arguments and the return value are obvious on sight for a function header like this: 14Được cấp, thông dịch viên không thực thi tuân thủ các loại được chỉ định, nhưng ít nhất họ đã rõ ràng với ai đó đọc định nghĩa chức năng.
Có một lợi ích khác để sử dụng các chú thích là tốt. Định dạng được tiêu chuẩn hóa trong đó thông tin chú thích được lưu trữ trong thuộc tính 58 cho vay để phân tích chữ ký chức năng bằng các công cụ tự động.Khi nói đến nó, các chú thích không phải là bất cứ điều gì đặc biệt kỳ diệu. Bạn thậm chí có thể định nghĩa của riêng bạn mà không cần cú pháp đặc biệt mà Python cung cấp. Ở đây, một định nghĩa chức năng Python với các chú thích đối tượng loại được gắn vào các tham số và giá trị trả về: >>> 16Sau đây về cơ bản là cùng một chức năng, với từ điển 58 được xây dựng thủ công:>>> 17Hiệu quả giống hệt nhau trong cả hai trường hợp, nhưng lần đầu tiên hấp dẫn hơn và có thể đọc được ngay từ cái nhìn đầu tiên. Trên thực tế, thuộc tính 58 không khác biệt đáng kể so với hầu hết các thuộc tính khác của một hàm. Ví dụ, nó có thể được sửa đổi một cách động. Bạn có thể chọn sử dụng thuộc tính giá trị trả về để đếm số lần một hàm được thực thi:>>> 18Chú thích chức năng Python không gì khác hơn từ điển của siêu dữ liệu. Nó chỉ xảy ra rằng bạn có thể tạo chúng với cú pháp thuận tiện mà người được thông dịch hỗ trợ. Họ bất cứ điều gì bạn chọn để làm cho họ. Sự kết luậnKhi các ứng dụng phát triển lớn hơn, việc mô đun hóa mã ngày càng trở nên quan trọng bằng cách chia nó thành các chức năng nhỏ hơn có kích thước có thể quản lý được. Bây giờ bạn hy vọng có tất cả các công cụ bạn cần để làm điều này. Bạn đã học:
Tiếp theo trong loạt bài này là hai hướng dẫn bao gồm tìm kiếm và khớp mẫu. Bạn sẽ có một cái nhìn sâu sắc về một mô-đun Python có tên Re, trong đó chứa chức năng tìm kiếm và khớp bằng cách sử dụng cú pháp mẫu đa năng được gọi là biểu thức chính quy.searching and pattern matching. You will get an in-depth look at a Python module called re, which contains functionality for searching and matching using a versatile pattern syntax called a regular expression. Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem cùng với hướng dẫn bằng văn bản để hiểu sâu hơn về sự hiểu biết của bạn: Xác định và gọi các chức năng Python This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Defining and Calling Python Functions Làm thế nào để bạn tạo một chức năng mới?Để tạo chức năng của riêng bạn, bạn cần phải làm bốn điều:.. Viết loại trả về của hàm .. Viết tên của hàm .. Bên trong ngoặc đơn (), liệt kê bất kỳ tham số nào mà hàm mất .. Bên trong dấu ngoặc xoăn {}, viết mã sẽ chạy bất cứ khi nào chức năng được gọi.Đây được gọi là cơ thể của chức năng .. Làm thế nào để bạn xác định một chức năng?Một định nghĩa kỹ thuật của một hàm là: Một mối quan hệ từ một tập hợp các đầu vào đến một tập hợp các đầu ra có thể trong đó mỗi đầu vào có liên quan đến chính xác một đầu ra.a relation from a set of inputs to a set of possible outputs where each input is related to exactly one output.
Cú pháp để xác định chức năng mới là gì?Cú pháp để tạo một hàm: hãy để func = hàm mới ([arg1, arg2, ... argn], functionbody);Hàm được tạo với các đối số arg1 ... argn và hàm đã cho.let func = new Function ([arg1, arg2, ... argN], functionBody); The function is created with the arguments arg1... argN and the given functionBody .
4 loại chức năng trong Python là gì?Sau đây là các loại chức năng Python khác nhau:.. Chức năng tích hợp Python .. Chức năng đệ quy Python .. Chức năng Python Lambda .. Các chức năng do người dùng Python xác định .. |