Python khi sử dụng chức năng bên trong

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!
8

def 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ơn

Lý 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ên

Thay vào đó, bạn phải gọi hàm

Hi, Quincy Larson!
4 như vậy

Hi, 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!
4

Cá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!
6

Như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ác

Tuy 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
    Hi, Quincy Larson!
    2
  • Làm cho sự phụ thuộc của
    Hi, Quincy Larson!
    2 trở nên khó giải thích

Đ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!
7

Cả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!
2

Và điều này

Hi, Quincy Larson!
3

Chú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!
4

Và đ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]

Khi nào bạn nên định nghĩa một hàm bên trong một hàm Python?

Một hàm được định nghĩa 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. Các hàm lồng nhau có thể truy cập các biến của phạm vi kèm theo. Các chức năng bên trong được sử dụng để chúng có thể được bảo vệ khỏi mọi thứ xảy ra bên ngoài chức năng .

Khi nào tôi nên sử dụng các hàm Python lồng nhau?

Các hàm lồng nhau [hoặc bên trong, lồng nhau] là các hàm mà chúng ta định nghĩa bên trong các hàm khác để 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 lồng nhau có nhiều cách sử dụng, chủ yếu để tạo bao đóng và trang trí .

Có thực hành tốt để có các hàm lồng nhau trong Python không?

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 hàm ở chế độ riêng tư hết mức 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 _like_this ]. 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 thanh sẽ không được sử dụng ở bất kỳ nơi nào khác .

Tại sao sử dụng chức năng lồng nhau?

Một hàm lồng nhau có thể truy cập các hàm cục bộ, biến, hằng, kiểu, lớp, v.v. trong cùng một phạm vi hoặc trong bất kỳ phạm vi kèm theo nào mà không truyền tham số rõ ràng, điều này giúp đơn giản hóa rất nhiều việc truyền dữ liệu vào và ra khỏi hàm lồng nhau . Điều này thường được phép cho cả đọc và viết.

Chủ Đề