Một hàm lồng nhau chỉ đơn giản là một hàm bên trong một hàm khác và đôi khi được gọi là "hàm bên trong". Có nhiều lý do tại sao bạn muốn sử dụng các hàm lồng nhau và chúng ta sẽ xem xét những lý do phổ biến nhất trong bài viết này
Cách xác định hàm lồng nhau
Để xác định một hàm lồng nhau, chỉ cần khởi tạo một hàm khác trong một hàm bằng cách sử dụng từ khóa
Hi, Quincy Larson!
8def greeting[first, last]:
# nested helper function
def getFullName[]:
return first + " " + last
print["Hi, " + getFullName[] + "!"]
greeting['Quincy', 'Larson']
đầu ra
Hi, Quincy Larson!
Như bạn có thể thấy, hàm
Hi, Quincy Larson!
9 lồng nhau có quyền truy cập vào các tham số của hàm Hi, Quincy Larson!
0 bên ngoài, Hi, Quincy Larson!
1 và Hi, Quincy Larson!
2. Đây là trường hợp sử dụng phổ biến cho các hàm lồng nhau–để phục vụ như một hàm trợ giúp nhỏ cho một hàm bên ngoài phức tạp hơnLý do nên sử dụng các hàm lồng nhau
Mặc dù có nhiều lý do hợp lệ để sử dụng các hàm lồng nhau, trong số những lý do phổ biến nhất là đóng gói và đóng/hàm xuất xưởng
Đóng gói dữ liệu
Đôi khi bạn muốn ngăn không cho một chức năng hoặc dữ liệu mà nó có quyền truy cập được truy cập từ các phần khác trong mã của bạn, vì vậy bạn có thể gói gọn nó trong một chức năng khác
Khi bạn lồng một hàm như thế này, nó sẽ ẩn khỏi phạm vi toàn cầu. Do hành vi này, đóng gói dữ liệu đôi khi được gọi là ẩn dữ liệu hoặc bảo mật dữ liệu. Ví dụ
def outer[]:
print["I'm the outer function."]
def inner[]:
print["And I'm the inner function."]
inner[]
inner[]
đầu ra
Traceback [most recent call last]:
File "main.py", line 16, in
inner[]
NameError: name 'inner' is not defined
Trong đoạn mã trên, hàm
Hi, Quincy Larson!
3 chỉ khả dụng từ bên trong hàm Hi, Quincy Larson!
4. Nếu bạn cố gọi Hi, Quincy Larson!
3 từ bên ngoài hàm, bạn sẽ gặp lỗi ở trênThay vào đó, bạn phải gọi hàm
Hi, Quincy Larson!
4 như vậyHi, Quincy Larson!
1đầu ra
Hi, Quincy Larson!
2đóng cửa
Nhưng điều gì sẽ xảy ra nếu hàm bên ngoài trả về chính hàm bên trong, thay vì gọi nó như trong ví dụ trên?
Sau đây là các điều kiện bắt buộc phải đáp ứng để tạo bao đóng trong Python
Đây là những điều kiện bạn cần để tạo một bao đóng trong Python
1. Phải có hàm lồng nhau
2. Hàm bên trong phải tham chiếu đến một giá trị được xác định trong phạm vi kèm theo
3. Hàm kèm theo phải trả về hàm lồng
- Nguồn. https. // stackabuse. com/python-nested-functions/
Đây là một ví dụ đơn giản về việc đóng cửa
Hi, Quincy Larson!
3đầu ra
Hi, Quincy Larson!
4Các bao đóng giúp có thể truyền dữ liệu vào các hàm bên trong mà không cần chuyển chúng đến các hàm bên ngoài trước với các tham số như ví dụ
Hi, Quincy Larson!
0 ở đầu bài viết. Chúng cũng cho phép gọi hàm bên trong từ bên ngoài hàm bên ngoài đóng gói. Tất cả điều này với lợi ích của việc đóng gói/ẩn dữ liệu đã đề cập trước đóBây giờ bạn đã hiểu cách thức và lý do lồng các hàm trong Python, hãy ra ngoài và lồng chúng với những chức năng tốt nhất
QUẢNG CÁO
QUẢNG CÁO
QUẢNG CÁO
Nếu bài viết này hữu ích, hãy tweet nó
Học cách viết mã miễn phí. Chương trình giảng dạy mã 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
Đôi khi những câu hỏi đơn giản dẫn bạn đến một lối suy nghĩ thú vị. Cái này là "bạn có nên sử dụng các hàm lồng nhau để đóng gói logic chỉ được sử dụng một lần không?"
Trước hết, nhắc lại một chút, các hàm lồng nhau là các hàm được viết trong phạm vi của một hàm khác. Chúng có nhiều công dụng trong python
Hi, Quincy Larson!
6Nhưng đối với câu hỏi này, người hỏi quan tâm đến trường hợp một số logic chỉ được sử dụng trong
Hi, Quincy Larson!
0 có thể được gói gọn trong phạm vi của nóKhi mã hóa, chúng tôi muốn ẩn chi tiết không quan trọng. e. g. chúng tôi đánh dấu các chức năng ở chế độ riêng tư nhiều nhất có thể [trong python chúng tôi thực sự không thể, vì vậy chúng tôi sử dụng quy ước gạch dưới hàng đầu
Hi, Quincy Larson!
1]. Vì vậy, đó là lý do chính đáng để sử dụng các hàm lồng nhau — giúp người đọc hiểu rằng logic của Hi, Quincy Larson!
2 sẽ không được sử dụng ở bất kỳ nơi nào khácTuy nhiên, ngoài việc xem xét những lợi ích của một cái gì đó, chúng ta cũng nên xem xét chi phí. Vậy chi phí ở đây là gì?
- Thụt lề thêm làm cho nó khó đọc
- Thêm một đống tên để tung hứng khi đọc phạm vi của
2Hi, Quincy Larson!
- Làm cho sự phụ thuộc của
2 trở nên khó giải thíchHi, Quincy Larson!
Điểm đầu tiên tôi tin là không cần giải thích thêm. Bất cứ ai đã lập trình trong python đều đã nếm trải con dao hai lưỡi trong việc giảm thiểu tiếng ồn bằng cách loại bỏ dấu ngoặc [gợi ý. dấu ngoặc không có tiếng ồn…]
Còn cái tên vạn người mê, không cần tập luyện, con người có thể tung hứng 1–2 quả bóng trên không. Với một số đào tạo phù hợp, họ có thể làm 3. Một số người tài năng có thể làm được 5, nhưng rất hiếm người đi được xa như vậy
Chúng ta nên lập trình với giới hạn đó trong tâm trí. Để biến nó thành một quy tắc ngón tay cái - tôi không nên nghĩ nhiều hơn 3 cái tên trong đầu khi xem xét một phạm vi. Trong trường hợp hàm lồng nhau khi đọc phạm vi của
Hi, Quincy Larson!
2, bây giờ tôi phải ghi nhớ Hi, Quincy Larson!
72, Hi, Quincy Larson!
73 và Hi, Quincy Larson!
74 một cách không cần thiếtĐối với điểm cuối cùng, trong phiên bản lồng nhau, bây giờ tôi phải hiểu rằng
Hi, Quincy Larson!
2 không phụ thuộc vào Hi, Quincy Larson!
72, thay vì nó hiển nhiên [vâng, nó có thể hiển nhiên trong ví dụ này, nhưng hãy xem xét việc triển khai Hi, Quincy Larson!
2 ít tầm thường hơn]Vì vậy, thực sự phiên bản này có nhiều thông tin hơn về nó
Hi, Quincy Larson!
7Cảm giác phải là cảm giác nhẹ nhõm về tinh thần, tôi có thể giải tỏa một số lo lắng khi đọc các phần của mã này, trong khi trước đây tâm trí tôi bị bóp nghẹt, tung hứng, lo lắng rằng tôi có thể không nhận ra điều gì đó
Phiên bản trước cấu thành mất thông tin. Thông tin này vẫn có thể được hiểu bằng suy luận, nhưng năng lượng phải được đầu tư. Lưu ý rằng một hướng thì dễ dàng, thật dễ dàng để đi từ phiên bản này sang phiên bản trước đó, nhưng ngược lại thì khó hơn đáng kể - có một số lý do liên quan. Điều này không có gì ngạc nhiên, việc dọn dẹp căn phòng dễ dàng hơn nhiều so với việc dọn dẹp nó
Cảm giác này có thể quen thuộc khi thực hiện tái cấu trúc — bạn khám phá ra nhiều điều về mã của mình và đây thường là một quá trình đau đớn, vì có rất nhiều điều bị ẩn và cần được nhận ra
Nếu từ entropy xuất hiện trong tâm trí, bạn đã hiểu những gì tôi đang hướng tới. Viết mã tốt có nghĩa là giảm thiểu entropy. Bạn làm như vậy bằng cách suy luận mọi thứ về mã của mình và cấu trúc nó đơn giản hơn bằng cách sử dụng các suy luận này. Điều này được đo lường tốt nhất bằng kích thước cơ sở mã của bạn ["kích thước tiệm cận", không phải tên hàm của bạn ngắn như thế nào hoặc bạn cho phép bao nhiêu khoảng trắng...]
Đây là một ví dụ dễ hiểu
So sánh cái này
Hi, Quincy Larson!
2Và điều này
Hi, Quincy Larson!
3Chúng ta phải “tìm hiểu” điều gì đó về mã ở trên để có thể viết mã bên dưới — trong trường hợp này là chúng ta đang lọc thứ gì đó. Cái nhìn sâu sắc này gây ra sự đơn giản hóa
Đây là một điều ít rõ ràng hơn -
So sánh cái này
Hi, Quincy Larson!
4Và điều này
Hi, Quincy Larson!
5Để chuyển từ cái sau sang cái trước liên quan đến việc mất thông tin, chúng tôi không biết khi nào mặc định được sử dụng. Chúng tôi không biết khi đọc
Hi, Quincy Larson!
78 liệu giá trị mặc định có được xem xét hay không [Hi, Quincy Larson!
74 là “đôi khi” 7]