Một hàm có thể lấy một hàm làm đối số Python không?
Các hàm 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 hàm khác. Trong Python, loại hàm 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 hàm bên trong có nhiều công dụng, đáng chú ý nhất là các hàm đóng và hàm trang trí Show
Trong hướng dẫn này, bạn sẽ học cách
Tiền thưởng miễn phí. Nhấp vào đây để nhận Bảng cheat Python và tìm hiểu kiến thức cơ bản về Python 3, như làm việc với các kiểu dữ liệu, từ điển, danh sách và hàm Python Tạo các hàm 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 trong chức năng kèm theo. Đây là một ví dụ về cách tạo một hàm bên trong trong Python >>>
Trong mã này, bạn xác định 6 bên trong 7 để in thông báo 8 ra màn hình. Để làm điều đó, bạn gọi 6 ở dòng cuối cùng của 7. Đây là cách nhanh nhất để viết một hàm bên 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àyTí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ừ hàm kèm theo của chúng ngay cả sau khi hàm này đã trả về. Hàm kèm theo cung cấp một không gian tên mà hàm bên trong có thể truy cập được >>>
Bâ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 đối số đó thông qua tên 3. Tuy nhiên, tên này được định nghĩa trong 7. Các tên mà bạn xác định trong phạm vi cục bộ của hàm bên ngoài được gọi là tên không cục bộ. Họ không phải là người địa phương theo quan điểm 6Đây là một ví dụ về cách tạo và sử dụng một hàm bên trong phức tạp hơn >>>
Trong 6, trước tiên bạn xác thực dữ liệu đầu vào để đảm bảo rằng người dùng của bạn đang cung cấp một số nguyên bằng hoặc lớn hơn 0. Sau đó, bạn xác định một hàm bên trong đệ quy có tên là 7 thực hiện phép tính giai thừa và trả về kết quả. Bước cuối cùng là gọi 7Ghi chú. Để thảo luận chi tiết hơn về đệ quy và các hàm đệ quy, hãy xem Tư duy đệ quy trong Python và Đệ quy trong Python. Một lời giới thiệu Ưu điểm chính của việc sử dụng mẫu này là, bằng cách thực hiện tất cả việc kiểm tra đối số trong hàm bên ngoài, bạn có thể bỏ qua việc kiểm tra lỗi trong hàm bên trong một cách an toàn và tập trung vào việc tính toán trong tầm tay Loại bỏ các quảng cáoSử dụng các chức năng bên trong. Những thứ cơ bảnCác trường hợp sử dụng hàm bên trong Python rất đa dạng. Bạn có thể sử dụng chúng để cung cấp khả năng đóng gói và ẩn các hàm của mình khỏi sự truy cập từ bên ngoài, bạn có thể viết các hàm bên trong của trình trợ giúp và bạn cũng có thể tạo các bao đóng và trang trí. Trong phần này, bạn sẽ tìm hiểu về hai trường hợp sử dụng trước của các hàm bên trong và trong các phần sau, bạn sẽ tìm hiểu cách tạo và 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 hàm đã cho khỏi mọi thứ xảy ra bên ngoài nó để hàm đó hoàn toàn bị ẩ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 Đây là một ví dụ làm nổi bật khái niệm đó >>>
Trong ví dụ này, bạn không 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. Đó là bởi vì 1 ẩn hoàn toàn 9, ngăn bạn truy cập nó từ phạm vi toàn cầuXây dựng chức năng bên trong HelperĐôi khi, bạn có một hàm thực hiện cùng một đoạn mã ở một số vị trí trong nội dung của nó. Ví dụ: giả sử bạn muốn viết một hàm để xử lý tệp CSV chứa thông tin về các điểm truy cập Wi-Fi ở Thành phố New York. Để tìm tổng số điểm phát sóng ở New York cũng như công ty cung cấp hầu hết các điểm phát sóng này, bạn tạo tập lệnh sau
Ở đây, 3 lấy 4 làm đối số. Hàm kiểm tra xem 4 có phải là đường dẫn dựa trên chuỗi tới tệp vật lý hoặc tệp. Sau đó, nó gọi hàm bên trong của trình trợ giúp 6, hàm này nhận một đối tượng tệp và thực hiện các thao tác sau
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 bằng đường dẫn tệp dựa trên chuỗi hay bằng đối tượng tệp, bạn đều nhận được kết quả như nhauSử dụng các chức năng trợ giúp bên trong và riêng tưThông thường, bạn tạo các hàm bên trong của trình trợ giúp như 6 khi bạn muốn cung cấp khả năng đóng gói. Bạn cũng có thể tạo các hàm bên trong nếu bạn nghĩ rằng mình sẽ không gọi chúng ở bất kỳ nơi nào khác ngoài hàm chứaMặc dù việc viết các hàm trợ giúp của bạn dưới dạng các hàm bên trong đạt được kết quả mong muốn, nhưng có lẽ bạn sẽ được phục vụ tốt hơn bằng cách trích xuất chúng dưới dạng các hàm cấp cao nhất. Trong trường hợp này, bạn có thể sử dụng dấu gạch dưới ở đầu ( 1) trong tên của hàm để cho biết rằng nó là riêng tư đối với mô-đun hoặc lớp hiện tại. Điều này sẽ cho phép bạn truy cập các chức năng của trình trợ giúp từ bất kỳ nơi nào khác trong mô-đun hoặc lớp hiện tại và sử dụng lại chúng khi cầnTrích xuất các chức năng bên trong thành các chức năng riêng cấp cao nhất có thể làm cho mã của bạn sạch hơn và dễ đọc hơn. Thực tiễn này có thể tạo ra các chức năng do đó áp dụng nguyên tắc chịu trách nhiệm duy nhất Giữ lại trạng thái với các chức năng bên trong. đóng cửaTrong Python, các chức năng là. Điều này có nghĩa là chúng ngang bằ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 hủy chúng, lưu trữ chúng trong cấu trúc dữ liệu, chuyển chúng làm đối số cho các hàm 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 hàm bậc cao hơn trong Python. Các hàm bậc cao hơn là các hàm hoạt động trên các hàm khác bằng cách lấy chúng làm đối số, trả về chúng hoặc cả hai Tất cả các ví dụ về các hàm bên trong mà bạn đã thấy cho đến nay đều là các hàm thông thường được lồng bên trong các hàm khác. Trừ khi bạn cần ẩn các chức năng của mình với thế giới bên ngoài, không có lý do cụ thể nào để chúng được lồng vào nhau. Bạn có thể xác định các chức năng đó là các chức năng cấp cao nhất riêng tư và bạn nên sử dụng Trong phần này, bạn sẽ tìm hiểu về các chức năng của nhà máy đóng cửa. Bao đóng là các hàm được tạo động được trả về bởi các hàm khác. Tính năng chính của chúng là chúng có toàn quyền truy cập vào các biến và tên được xác định trong không gian tên cục bộ nơi đóng được tạo, mặc dù hàm kèm theo đã trả về và thực thi xong Trong Python, khi bạn trả về một đối tượng hàm bên trong, trình thông dịch sẽ đóng gói hàm cùng với môi trường chứa hoặc bao đóng của nó. Đối tượng hàm giữ một ảnh chụp nhanh của tất cả các biến và tên được xác định trong phạm vi chứa của nó. Để xác định thời điểm đóng cửa, bạn cần thực hiện ba bước
Với kiến thức cơ bản này, bạn có thể bắt đầu tạo các bao đóng của mình ngay lập tức và tận dụng tính năng chính của chúng. giữ lại trạng thái giữa các lần gọi hàm Loại bỏ các quảng cáoGiữ lại trạng thái trong một kết thúcMột bao đóng làm cho hàm bên trong giữ nguyên trạng thái của môi trường khi được gọi. Việc đóng cửa không phải là chức năng bên trong mà là chức năng bên trong cùng với môi trường kèm theo của nó. Bao đóng nắm bắt các biến cục bộ và tên trong hàm chứa và giữ chúng xung quanh Xem xét ví dụ sau
Đây là những gì đang xảy ra trong chức năng này
3 lấy giá trị của 8 từ đâu? . Trong ví dụ này, 3 nhận giá trị của 8 từ hàm bên ngoài, 2. Đây là 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 ghi nhớ giá trị của 8>>>
Trong những ví dụ này, 1 nhớ rằng 2 và 3 nhớ rằng 4. Lưu ý rằng cả hai lần đóng đều nhớ 8 tương ứng của chúng giữa các cuộc gọiBâ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 chính xác để truy cập một trang nhất định hay không. 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 vào một tuyến đường nhất định hay 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ả lại chế độ xem chính xác tùy thuộc vào thông tin đăng nhập có chính xác hay khôngThông thường, bạn sẽ tạo các bao đóng không sửa đổi trạng thái bao quanh của chúng hoặc các bao đóng có 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 bao đóng để sửa đổi trạng thái bao quanh 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 một tập dữ liệu. Dữ liệu đến 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 lần gọi. Trong trường hợp này, bạn có thể mã hóa chức năng đóng của nhà máy như thế này
Việc đóng được gán cho 7 giữ nguyên trạng thái của 8 giữa các lần gọi liên tiếp. Mặc dù bạn xác định 8 trong 0, nó vẫn có sẵn trong phần đóng, 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 bao quanh độngSửa đổi trạng thái đóng cửaThông thường, các biến đóng hoàn toàn bị ẩn khỏi thế giới bên ngoài. Tuy nhiên, bạn có thể cung cấp các hàm bên trong getter và setter cho chúng >>> 0Ở đây, 2 trả về một bao đóng đại diện cho một đối tượng 3. Đối tượng này có đính kèm các hàm getter và setter. Bạn có thể sử dụng các hàm đó để có quyền truy cập đọc và ghi vào các biến 4 và 5, được xác định trong phạm vi kèm theo và vận chuyển cùng với bao đóngMặc dù hàm này tạo các bao đóng có thể hoạt động nhanh hơn một lớp tương đương, nhưng bạn cần lưu ý rằng kỹ thuật này không cung cấp các tính năng chính, bao gồm tính kế thừa, thuộc tính, bộ mô tả, lớp và phương thức tĩnh. Nếu bạn muốn tìm hiểu sâu hơn về kỹ thuật này, hãy xem Công cụ đơn giản để mô phỏng các lớp bằng cách sử dụng bao đóng và phạm vi lồng nhau (Công thức Python) Loại bỏ các quảng cáoThêm hành vi với các chức năng bên trong. người trang tríTrình trang trí Python là một trường hợp sử dụng phổ biến và thuận tiện khác cho các chức năng bên trong, đặc biệt là cho các bao đóng. Trình trang trí là các hàm bậc cao lấy một đối số có thể gọi được (hàm, phương thức, lớp) và trả về một hàm có thể gọi khác Bạn có thể sử dụng các hàm trang trí để thêm trách nhiệm vào một khả năng gọi được hiện có một cách linh hoạt và mở rộng hành vi của nó một cách minh bạch mà không ảnh hưởng hoặc sửa đổi khả năng gọi ban đầu Ghi chú. Để biết thêm chi tiết về các đối tượng có thể gọi được trong Python, hãy xem tài liệu về Python và cuộn xuống phần “Các loại có thể gọi được. ” Để tạo một trình trang trí, bạn chỉ cần xác định một hàm có thể gọi được (một hàm, phương thức hoặc lớp) chấp nhận một đối tượng hàm làm đối số, xử lý nó và trả về một đối tượng hàm khác với hành vi được thêm vào Khi bạn đã có chức năng trang trí của mình, bạn có thể áp dụng nó cho bất kỳ chức năng có thể gọi nào. Để làm như vậy, bạn cần sử dụng ký hiệu at ( 6) trước tên người trang trí và sau đó đặt nó trên dòng riêng của nó ngay trước tên gọi được trang trí 1Cú pháp này làm cho 7 tự động lấy 8 làm đối số và xử lý nó trong phần thân của nó. Hoạt động này là một tốc ký cho nhiệm vụ sau đây 2Đây là 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 chức năng hiện có >>> 3Trong trường hợp này, bạn sử dụng 9 để trang trí cho 0. Điều này thêm chức năng mới cho chức năng trang trí. Bây giờ khi bạn gọi 0, thay vì chỉ in ra 8, hàm của bạn in ra hai thông báo mớiCác trường hợp sử dụng cho trình trang trí Python rất đa dạng. Dưới đây là một số trong số họ
Một phương pháp phổ biến để gỡ lỗi mã Python là chèn lệnh gọi tới 3 để kiểm tra 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. Việc thêm và xóa các lệnh gọi tới 3 có thể gây khó chịu và bạn có nguy cơ quên một số lệnh gọi đó. Để ngăn chặn tình trạng này, bạn có thể viết một trình trang trí như thế này>>> 4Ví dụ này cung cấp 5, là một công cụ trang trí lấy một hàm làm đối số và in chữ ký của nó với giá trị hiện tại của mỗi đối số và giá trị trả về tương ứng của nó. Bạn có thể sử dụng trình trang trí này để gỡ lỗi các chức năng của mình. Khi bạn nhận được kết quả mong muốn, bạn có thể xóa cuộc gọi trang trí 6 và chức năng của bạn sẽ sẵn sàng cho bước tiếp theoGhi chú. Nếu bạn muốn tìm hiểu sâu hơn về cách thức hoạt động của 7 và 8 trong Python, thì hãy xem Python args và kwargs. làm sáng tỏĐây là một ví dụ cuối cùng về cách tạo một trang trí. Lần này, bạn sẽ thực hiện lại 2 như một chức năng trang trí>>> 5Phiên bản 2 này tạo ra kết quả giống như bạn nhận được trong quá trình triển khai ban đầu. Trong trường hợp này, bạn sử dụng cả bao đóng để ghi nhớ 8 và trang trí trả về phiên bản đã sửa đổi của hàm nhập, 2Ở đây, trình trang trí cần lấy một đối số ( 8), vì vậy bạn cần có hai cấp hàm bên trong lồng nhau. Cấp độ đầu tiên được đại diện bởi 3, lấy chức năng được trang trí làm đối số. Cấp độ thứ hai được đại diện bởi 5, gói đối số 8 trong 7, thực hiện phép tính lũy thừa cuối cùng và trả về kết quảLoại bỏ các quảng cáoPhần kết luậnNếu bạn định nghĩa một hàm bên trong một hàm khác, thì bạn đang tạo 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 các hàm trợ giúp, bao đóng và trang trí Trong hướng dẫn này, bạn đã học cách
Bây giờ bạn đã sẵn sàng để tận dụng nhiều cách sử dụng 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 nào, thì hãy nhớ chia sẻ trong phần bình luận bên dưới Đánh dấu là đã hoàn thành Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Hàm bên trong Python 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về Leodanis Pozo Ramos Leodanis là một kỹ sư công nghiệp yêu thích Python và phát triển phần mềm. Anh ấy là một nhà phát triển Python tự học với hơn 6 năm kinh nghiệm. Anh ấy là một nhà văn đam mê kỹ thuật với số lượng bài báo được xuất bản ngày càng tăng trên Real Python và các trang web khác » Tìm hiểu thêm về LeodanisMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren Derrick Geir Arne Jim Joanna Gia-cốp Michael Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Chuyên gia Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Tôi có thể sử dụng một hàm làm đối số trong một hàm khác không?Bạn có thể sử dụng các núm điều khiển hàm làm đối số đầu vào cho các hàm khác , được gọi là các hàm chức năng. Các hàm này đánh giá các biểu thức toán học trên một phạm vi giá trị.
Bạn có thể đặt một hàm trong một hàm trong Python không?Nếu bạn định nghĩa một hàm bên trong một hàm khác, thì bạn đang tạo 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.
Tôi có thể chuyển một hàm làm đối số không?Hàm là dữ liệu và do đó có thể được truyền xung quanh giống như các giá trị khác. Điều này có nghĩa là một hàm có thể được truyền cho một hàm khác dưới dạng đối số . Điều này cho phép hàm được gọi sử dụng đối số hàm để thực hiện hành động của nó.
Bạn có thể gọi một hàm từ một hàm Python không?Trong Python, bất kỳ hàm nào được viết ra đều có thể được gọi bởi một hàm khác . Lưu ý rằng đây có thể là cách đơn giản nhất để chia vấn đề thành các phần nhỏ của vấn đề. |