Hướng dẫn inner function python - hàm bên trong python
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 nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: các chức năng bên trong của 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: Python Inner Functions Show
Nội phân chính
Nội phân chính
Nội phân chính
Các chức năng bên trong, còn được gọi là các hàm lồng nhau, là các hàm mà bạn xác định bên trong các chức năng khác. Trong Python, loại chức năng này có quyền truy cập trực tiếp vào các biến và tên được xác định trong hàm kèm theo. Các chức năng bên trong có nhiều cách sử dụng, đáng chú ý nhất là các nhà máy đóng cửa và chức năng trang trí., also known as nested functions, are functions that you define inside other functions. In Python, this kind of function has direct access to variables and names defined in the enclosing function. Inner functions have many uses, most notably as closure factories and decorator functions. Trong hướng dẫn này, bạn sẽ học cách:
Tạo các chức năng bên trong PythonMột hàm được xác định bên trong một hàm khác được gọi là hàm bên trong hoặc hàm lồng nhau. Trong Python, loại chức năng này có thể truy cập tên trong hàm kèm theo. Ở đây, một ví dụ về cách tạo chức năng bên trong trong Python:inner function or a nested function. In Python, this kind of function can access names in the enclosing function. Here’s an example of how to create an inner function in Python: >>>
Trong mã này, bạn xác định 6 bên trong 7 để in thông báo 8 lên màn hình. Để làm điều đó, bạn gọi 6 trên dòng cuối cùng của 7. Đây là cách nhanh nhất để viết một chức năng bên trong trong Python. Tuy nhiên, các chức năng bên trong cung cấp rất nhiều khả năng thú vị ngoài những gì bạn thấy trong ví dụ này.Tính năng cốt lõi của các hàm bên trong là khả năng truy cập các biến và đối tượng từ chức năng kèm theo của chúng ngay cả sau khi chức năng này đã trở lại. Hàm kèm theo cung cấp một không gian tên có thể truy cập vào hàm bên trong: >>>
Trong mã này, bạn xác định 6 bên trong 7 để in thông báo 8 lên màn hình. Để làm điều đó, bạn gọi 6 trên dòng cuối cùng của 7. Đây là cách nhanh nhất để viết một chức năng bên trong trong Python. Tuy nhiên, các chức năng bên trong cung cấp rất nhiều khả năng thú vị ngoài những gì bạn thấy trong ví dụ này.nonlocal names. They are nonlocal from the 6 point of view.Tính năng cốt lõi của các hàm bên trong là khả năng truy cập các biến và đối tượng từ chức năng kèm theo của chúng ngay cả sau khi chức năng này đã trở lại. Hàm kèm theo cung cấp một không gian tên có thể truy cập vào hàm bên trong: >>>
Trong mã này, bạn xác định 6 bên trong 7 để in thông báo 8 lên màn hình. Để làm điều đó, bạn gọi 6 trên dòng cuối cùng của 7. Đây là cách nhanh nhất để viết một chức năng bên trong trong Python. Tuy nhiên, các chức năng bên trong cung cấp rất nhiều khả năng thú vị ngoài những gì bạn thấy trong ví dụ này.Tính năng cốt lõi của các hàm bên trong là khả năng truy cập các biến và đối tượng từ chức năng kèm theo của chúng ngay cả sau khi chức năng này đã trở lại. Hàm kèm theo cung cấp một không gian tên có thể truy cập vào hàm bên trong: Sử dụng các chức năng bên trong: những điều cơ bảnBây giờ bạn có thể chuyển một chuỗi dưới dạng đối số cho 7 và 6 sẽ truy cập vào đối số đó thông qua tên 3. Tên này, tuy nhiên, được xác định trong phạm vi địa phương là 7. Các tên mà bạn xác định trong phạm vi cục bộ của một hàm bên ngoài được gọi là tên không thuộc địa. Chúng không thuộc về quan điểm 6.Cung cấp đóng góiMột trường hợp sử dụng phổ biến của các hàm bên trong phát sinh khi bạn cần bảo vệ hoặc ẩn, một chức năng nhất định khỏi mọi thứ xảy ra bên ngoài để chức năng được ẩn hoàn toàn khỏi phạm vi toàn cầu. Loại hành vi này thường được gọi là đóng gói.encapsulation. Ở đây, một ví dụ làm nổi bật khái niệm đó: >>>
Trong ví dụ này, bạn có thể truy cập trực tiếp vào 9. Nếu bạn cố gắng làm điều đó, thì bạn sẽ nhận được một 0. Điều đó vì 1 hoàn toàn ẩn 9, ngăn bạn truy cập nó khỏi phạm vi toàn cầu.Xây dựng các chức năng bên trong của người trợ giúpĐôi khi bạn có một chức năng thực hiện cùng một đoạn mã ở một số nơi trong cơ thể của nó. Ví dụ: giả sử bạn muốn viết một chức năng để xử lý tệp CSV chứa thông tin về các điểm nóng Wi-Fi ở thành phố New York. Để tìm tổng số điểm nóng ở New York cũng như công ty cung cấp hầu hết trong số họ, bạn tạo ra tập lệnh sau:
Ở đây, 3 lấy 4 làm đối số. Hàm kiểm tra xem 4 là đường dẫn dựa trên chuỗi đến tệp vật lý hoặc đối tượng tệp. Sau đó, nó gọi hàm bên trong trợ giúp 6, lấy một đối tượng tệp và thực hiện các hoạt động sau:
Nếu bạn chạy chức năng, thì bạn sẽ nhận được đầu ra sau: >>>
Trong ví dụ này, bạn có thể truy cập trực tiếp vào 9. Nếu bạn cố gắng làm điều đó, thì bạn sẽ nhận được một 0. Điều đó vì 1 hoàn toàn ẩn 9, ngăn bạn truy cập nó khỏi phạm vi toàn cầu.Xây dựng các chức năng bên trong của người trợ giúpĐôi khi bạn có một chức năng thực hiện cùng một đoạn mã ở một số nơi trong cơ thể của nó. Ví dụ: giả sử bạn muốn viết một chức năng để xử lý tệp CSV chứa thông tin về các điểm nóng Wi-Fi ở thành phố New York. Để tìm tổng số điểm nóng ở New York cũng như công ty cung cấp hầu hết trong số họ, bạn tạo ra tập lệnh sau: Ở đây, 3 lấy 4 làm đối số. Hàm kiểm tra xem 4 là đường dẫn dựa trên chuỗi đến tệp vật lý hoặc đối tượng tệp. Sau đó, nó gọi hàm bên trong trợ giúp 6, lấy một đối tượng tệp và thực hiện các hoạt động sau:Đọc nội dung tệp vào một trình tạo mang lại từ điển bằng cách sử dụng 7.Tạo một danh sách các nhà cung cấp Wi-Fi.Đếm số lượng điểm nóng Wi-Fi trên mỗi nhà cung cấp bằng đối tượng 8.In một tin nhắn với thông tin được truy xuất.Higher-order functions are functions that operate on other functions by taking them as arguments, returning them, or both. Nếu bạn chạy chức năng, thì bạn sẽ nhận được đầu ra sau: Cho dù bạn gọi 3 với đường dẫn tệp dựa trên chuỗi hoặc với đối tượng tệp, bạn sẽ nhận được kết quả tương tự.closure factory functions. Closures are dynamically created functions that are returned by other functions. Their main feature is that they have full access to the variables and names defined in the local namespace where the closure was created, even
though the enclosing function has returned and finished executing.Sử dụng các chức năng của người trợ giúp bên trong và bên trong
Giữ lại trạng thái với các chức năng bên trong: Đóng cửaretaining state between function calls. Trong Python, các chức năng là công dân hạng nhất. Điều này có nghĩa là họ ngang hàng với bất kỳ đối tượng nào khác, chẳng hạn như số, chuỗi, danh sách, bộ dữ liệu, mô -đun, v.v. Bạn có thể tự động tạo hoặc phá hủy chúng, lưu trữ chúng trong các cấu trúc dữ liệu, truyền chúng dưới dạng đối số cho các chức năng khác, sử dụng chúng làm giá trị trả về, v.v.Bạn cũng có thể tạo các chức năng bậc cao trong Python. Các chức năng bậc cao là các hàm hoạt động trên các chức năng khác bằng cách coi chúng làm đối số, trả lại chúng hoặc cả hai. Xem xét ví dụ sau:
Ở đây, những gì mà xảy ra trong chức năng này:
3 nhận được giá trị của 8 từ đâu? Đây là nơi đóng cửa đi vào chơi. Trong ví dụ này, 3 nhận được giá trị của 8 từ hàm bên ngoài, 2. Ở đây, những gì Python làm khi bạn gọi 2:
Bằng cách này, khi bạn gọi phiên bản của 3 được trả về bởi 2, bạn sẽ thấy rằng hàm này nhớ lại giá trị của 8:>>>
Trong các ví dụ này, 1 nhớ rằng 2 và 3 nhớ rằng 4. Lưu ý rằng cả hai đóng cửa đều nhớ 8 tương ứng giữa các cuộc gọi.Bây giờ hãy xem xét một ví dụ khác: >>>
Trong các ví dụ này, 1 nhớ rằng 2 và 3 nhớ rằng 4. Lưu ý rằng cả hai đóng cửa đều nhớ 8 tương ứng giữa các cuộc gọi.Bây giờ hãy xem xét một ví dụ khác: Hàm bên trong kiểm tra xem một người dùng nhất định có quyền truy cập chính xác để truy cập một trang nhất định. Bạn có thể nhanh chóng sửa đổi điều này để lấy người dùng trong phiên để kiểm tra xem họ có thông tin đăng nhập chính xác để truy cập một tuyến đường nhất định không.static enclosing state, as you saw in the above examples. However, you can also create closures that modify their enclosing state by using mutable objects, such as dictionaries, sets, or lists. Thay vì kiểm tra xem người dùng có bằng 6 hay không, bạn có thể truy vấn cơ sở dữ liệu SQL để kiểm tra quyền và sau đó trả về chế độ xem chính xác tùy thuộc vào việc thông tin đăng nhập có chính xác hay không.>>>
Trong các ví dụ này, 1 nhớ rằng 2 và 3 nhớ rằng 4. Lưu ý rằng cả hai đóng cửa đều nhớ 8 tương ứng giữa các cuộc gọi.Bây giờ hãy xem xét một ví dụ khác:Hàm bên trong kiểm tra xem một người dùng nhất định có quyền truy cập chính xác để truy cập một trang nhất định. Bạn có thể nhanh chóng sửa đổi điều này để lấy người dùng trong phiên để kiểm tra xem họ có thông tin đăng nhập chính xác để truy cập một tuyến đường nhất định không.getter and setter inner functions for them: >>> 0Trong các ví dụ này, 1 nhớ rằng 2 và 3 nhớ rằng 4. Lưu ý rằng cả hai đóng cửa đều nhớ 8 tương ứng giữa các cuộc gọi.
Bây giờ hãy xem xét một ví dụ khác: Hàm bên trong kiểm tra xem một người dùng nhất định có quyền truy cập chính xác để truy cập một trang nhất định. Bạn có thể nhanh chóng sửa đổi điều này để lấy người dùng trong phiên để kiểm tra xem họ có thông tin đăng nhập chính xác để truy cập một tuyến đường nhất định không.Thay vì kiểm tra xem người dùng có bằng 6 hay không, bạn có thể truy vấn cơ sở dữ liệu SQL để kiểm tra quyền và sau đó trả về chế độ xem chính xác tùy thuộc vào việc thông tin đăng nhập có chính xác hay không.Decorators are higher-order functions that take a callable (function, method, class) as an argument and return another callable.Bạn thường tạo ra các đóng cửa mà don không thể sửa đổi trạng thái bao quanh của chúng hoặc đóng cửa với trạng thái bao quanh tĩnh, như bạn đã thấy trong các ví dụ trên. Tuy nhiên, bạn cũng có thể tạo các đóng cửa sửa đổi trạng thái kèm theo của chúng bằng cách sử dụng các đối tượng có thể thay đổi, chẳng hạn như từ điển, bộ hoặc danh sách. Giả sử bạn cần tính giá trị trung bình của bộ dữ liệu. Dữ liệu đi kèm trong một luồng các phép đo liên tiếp của tham số được phân tích và bạn cần chức năng của mình để giữ lại các phép đo trước đó giữa các cuộc gọi. Trong trường hợp này, bạn có thể mã hóa chức năng đóng cửa của nhà máy như thế này: Việc đóng cửa được gán cho 7 giữ lại trạng thái của 8 giữa các cuộc gọi liên tiếp. Mặc dù bạn xác định 8 trong 0, nhưng nó vẫn có sẵn trong việc đóng cửa, vì vậy bạn có thể sửa đổi nó. Trong trường hợp này, 8 hoạt động như một loại trạng thái kèm theo động. 1Sửa đổi trạng thái đóng cửa 2Dưới đây, một ví dụ về cách xây dựng chức năng trang trí để thêm chức năng mới vào một chức năng hiện có: >>> 3Trong trường hợp này, bạn sử dụng 9 để trang trí 0. Điều này thêm chức năng mới cho chức năng được trang trí. Bây giờ khi bạn gọi 0, thay vì chỉ in 8, chức năng của bạn in hai tin nhắn mới.Các trường hợp sử dụng cho trang trí Python rất đa dạng. Dưới đây là một số trong số họ:
Một thông lệ phổ biến để gỡ lỗi mã Python là chèn các cuộc gọi vào 3 để kiểm tra các giá trị của các biến, để xác nhận rằng một khối mã được thực thi, v.v. Thêm và xóa các cuộc gọi vào 3 có thể gây khó chịu và bạn có nguy cơ quên một số trong số chúng. Để ngăn chặn tình huống này, bạn có thể viết một người trang trí như thế này:>>> 4Trong trường hợp này, bạn sử dụng 9 để trang trí 0. Điều này thêm chức năng mới cho chức năng được trang trí. Bây giờ khi bạn gọi 0, thay vì chỉ in 8, chức năng của bạn in hai tin nhắn mới.Các trường hợp sử dụng cho trang trí Python rất đa dạng. Dưới đây là một số trong số họ: >>> 5Gỡ lỗi Bộ nhớ đệm Đăng nhậpThời gianinner function, also known as a nested function. In Python, inner functions have direct access to the variables and names that you define in the enclosing function. This provides a mechanism for you to create helper functions, closures, and decorators. Một thông lệ phổ biến để gỡ lỗi mã Python là chèn các cuộc gọi vào
Sự kết luận Nếu bạn xác định một hàm bên trong một hàm khác, thì bạn sẽ tạo ra một hàm bên trong, còn được gọi là hàm lồng nhau. Trong Python, các hàm bên trong có quyền truy cập trực tiếp vào các biến và tên mà bạn xác định trong hàm kèm theo. Điều này cung cấp một cơ chế để bạn tạo ra các chức năng, đóng cửa và trang trí của người trợ giúp. This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Python Inner Functions Trong hướng dẫn này, bạn đã học được cách:Cung cấp đóng gói bằng các chức năng làm tổ trong các chức năng kháccalling make_adder() would have been simpler. Incidentally, as you can see, functions are first-class objects in Python. make_adder is an object, and by adding (somearguments) you invoke, or call the function. In this case, that function returns another function object, one that you can call as well. Viết các chức năng của người trợ giúp để tái sử dụng các đoạn mãThực hiện các chức năng của nhà máy đóng cửa mà trạng thái giữ lại giữa các cuộc gọideclare them explicitly as non-local (using nonlocal keyword) in order to modify them. Following is an example of a nested function accessing a non-local variable. Xây dựng các chức năng trang trí để cung cấp các chức năng mớiBây giờ bạn đã sẵn sàng để tận dụng nhiều cách sử dụng của các hàm bên trong trong mã của riêng bạn. Nếu bạn có bất kỳ câu hỏi hoặc nhận xét, thì hãy chắc chắn chia sẻ phần trong phần bình luận bên dưới.instantiate a class into an object. Then we can access the method as an instance method of the class as shown in the program below. Here through the self parameter, instance methods can access attributes and other methods on the same object. 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 nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: các chức năng bên trong của PythonLàm thế nào để bạn truy cập một chức năng trong một chức năng Python? as well as the global variables. The inner functions variable has a local scope that is limited only to that function. Inner Functions variables can't be accessed at the outer function scope. |