Bạn có thể định nghĩa một hàm trong hàm python không?

Các hàm lồng nhau, như tên gợi ý, là các hàm Python được tạo bên trong các hàm Python khác. Bên cạnh phạm vi của chính nó, hàm bên trong có quyền truy cập vào các đối tượng có sẵn trong phạm vi của hàm bên ngoài. Hàm bên trong có thể được gọi là một đối tượng Python duy nhất có dữ liệu và biến riêng. Chức năng bên trong này được bảo vệ bởi chức năng bên ngoài và không thể được gọi hoặc tham chiếu từ phạm vi toàn cầu. Bằng cách này, chức năng bên trong hoạt động như một thực thể ẩn chỉ hoạt động trong ranh giới của chức năng bên ngoài và phạm vi toàn cầu vẫn không biết về nó. Quá trình này còn được gọi là "đóng gói" trong lập trình. Đây là một ví dụ về hàm lồng nhau trong Python

def visibile_outer_function ( tên ):
    def  hidden_inner_function ()< . :
        in ( tên )<
    hidden_inner_function()

visibile_outer_function("John")
hidden_inner_function()

Hàm bên ngoài nhận một đối số bắt buộc có tên là “tên”. Hàm bên trong có quyền truy cập vào phạm vi của hàm bên ngoài để nó có thể sử dụng biến tên. Một cuộc gọi đến chức năng bên trong sau đó được thực hiện trong chức năng bên ngoài. Tiếp theo, một cuộc gọi đến cả chức năng bên trong và bên ngoài được thực hiện trong phạm vi toàn cầu. Sau khi chạy mẫu mã trên, bạn sẽ nhận được đầu ra sau

John
Truy nguyên ( cuộc gọi gần đây nhất lần cuối )< . :
  Tệp "chính. py", dòng 9, in
    hidden_inner_function()
NameError: name 'hidden_inner_function' không không được xác định

Như bạn có thể thấy ở đầu ra, chức năng bên ngoài hoạt động tốt khi bạn gọi nó từ phạm vi toàn cầu. Một lỗi được đưa ra khi bạn cố gắng gọi hàm bên trong vì không có thứ nào như vậy khả dụng trong phạm vi toàn cầu

Các trường hợp sử dụng chức năng bên trong

Bây giờ bạn đã có một số hiểu biết về các hàm lồng nhau, bạn có thể thắc mắc về tiện ích của chúng và khi nào nên sử dụng chúng. Một trong những cách sử dụng phổ biến nhất của các hàm bên trong là để tạo các hàm trợ giúp trong hàm chính. Các hàm bên trong cũng có thể được sử dụng làm trình trang trí và có thể được sử dụng để thực hiện các bao đóng trong chương trình của bạn. Các trường hợp sử dụng này được giải thích bên dưới với các ví dụ

Tạo một chức năng trợ giúp

Hàm trợ giúp giống như bất kỳ hàm Python nào khác, nhưng chúng được gọi là hàm “trợ giúp” vì chúng có thể giúp tổ chức mã phức tạp tốt hơn và có thể được sử dụng lại nhiều lần để tránh lặp lại mã. Dưới đây là một mẫu mã minh họa một chức năng trợ giúp bên trong

def get_ticket_price ( tên ):
    thành viên = ["Tony", "Peter", "Mark"]
    price = 10

    def get_discounted_price(discount=1.0) .
        trả lại ( giá * chiết khấu .

    if name in members:
        ticket_price = get_discounted_price ( giảm giá . 50 =0.50)
    khác .
        ticket_price = get_discounted_price () . $"
    print ("Ticket price for " + name + " is: $" + str( ticket_price ))

get_ticket_price("Tony")
get_ticket_price("John")

Hàm bên ngoài có thể gọi chính là “get_ticket_price”. Nó lấy tên của một người làm đối số bắt buộc. Hàm “get_discounted_price” là một hàm trợ giúp bên trong lấy “giảm giá” làm đối số tùy chọn. Danh sách “thành viên” chứa tên của tất cả các thành viên đã đăng ký đủ điều kiện nhận chiết khấu. Giá chiết khấu cho các thành viên được tính bằng cách gọi hàm bên trong và cung cấp cho nó một giá trị chiết khấu làm đối số. Hàm trợ giúp này có thể được gọi nhiều lần dựa trên yêu cầu và bạn cũng có thể thay đổi logic trong hàm bên trong. Do đó, các hàm trợ giúp bên trong cho phép bạn đơn giản hóa mã và tránh lặp lại không cần thiết. Sau khi chạy mẫu mã trên, bạn sẽ nhận được đầu ra sau

Giá vé cho Tony . $ 5. 0
Giá vé cho John : $10. 0

Như bạn có thể thấy trong kết quả ở trên, Tony được giảm giá vé vì anh ấy có tên trong danh sách thành viên

Thực hiện đóng cửa

Các bao đóng là các thể hiện của các hàm bên trong được trả về bởi các hàm bên ngoài. Các chức năng bên trong này có quyền truy cập vào phạm vi của các chức năng bên ngoài và chúng tiếp tục có quyền truy cập vào phạm vi của chức năng bên ngoài ngay cả khi chức năng bên ngoài đã ngừng thực thi. Hãy xem mẫu mã dưới đây

def get_discounted_price ( giá ):
    def discount_price ( giảm giá< . ):
        trả lại giá * chiết khấu
      trả lại . 50 discounted_price

first_discount = get_discounted_price(10)
second_discount = get_discounted_price(10)
print (first_discount(0.50))
in ( . 60 (0.60))

Hàm bên ngoài “get_discounted_price” trả về một tham chiếu đến hàm bên trong có tên là “discounted_price”. Lưu ý rằng trong câu lệnh return, hàm được gọi mà không có dấu ngoặc nhọn. Tiếp theo, hai phiên bản mới được gọi là “first_discount” và “second_dicount” được tạo bằng cách gọi hàm bên ngoài và một giá trị cho đối số “price” được cung cấp cho các lệnh gọi này. Tại thời điểm này, chức năng bên ngoài đã thực thi xong nhưng trạng thái của nó đã được lưu trong các đối tượng first_discount và second_discount. Bây giờ, khi bạn gọi các trường hợp first_discount và second_discount với dấu ngoặc nhọn và đối số, chúng sẽ có quyền truy cập vào một biến có tên là giá cùng với giá trị của nó. Đối số được cung cấp cho các trường hợp này hiện chuyển đến hàm bên trong, sau đó trả về kết quả

Sau khi chạy mẫu mã trên, bạn sẽ nhận được đầu ra sau

5. 0
6. 0

Các bao đóng thường được sử dụng trong các tình huống mà chương trình của bạn yêu cầu duy trì trạng thái của một hàm

Tạo chức năng trang trí

Các hàm trang trí trong Python sửa đổi hành vi của một hàm Python hiện có mà không thay đổi nó. Vì vậy, khi bạn đính kèm một trình trang trí vào một chức năng, bạn có thể thêm chức năng bổ sung vào chức năng đó hoặc sửa đổi hành vi của nó trong khi vẫn giữ nguyên hành vi ban đầu của nó. Một trình trang trí Python điển hình trông như thế này

@ trang trí
def trang trí ():
      vượt qua

Ở đây “@decorator” sẽ sửa đổi hành vi của chức năng “decorated”. Bạn có thể tạo các hàm trang trí bằng các hàm lồng nhau. Để tạo một trình trang trí, hãy xác định một hàm và chuyển nó cho một hàm bên ngoài làm đối số. Hàm đã truyền này sau đó được gọi trong một hàm bên trong khác, nơi bạn có thể sử dụng nó và triển khai logic. Cuối cùng, hàm bên ngoài trả về hàm bên trong chứa hành vi đã sửa đổi. Hãy xem mẫu mã dưới đây

def get_discounted_price ( số tiền ):
    def discount_price ()< . :
        giá = số tiền () . 50
        new_price = price * 0.50
        return new_price
    return< discounted_price

Hàm bên ngoài “get_discounted_price” được chuyển qua một hàm khác gọi là “số tiền” làm đối số. Hàm bên trong sử dụng hàm đã truyền và thêm một hành vi nhất định vào nó. Hàm bên ngoài sau đó trả về một tham chiếu đến hàm bên trong chứa hành vi đã sửa đổi. Sau khi xác định trình trang trí, bạn có thể gọi nó theo cách sau

@ get_discounted_price
def get_price ():
    trả về 10

in (<get_price())

Trình trang trí được gắn vào các chức năng mà bạn đang cố gắng sửa đổi hành vi của chúng. Chúng luôn bắt đầu bằng ký hiệu “@”. Bằng cách sử dụng trình trang trí ở đây, bạn đang chuyển hàm “get_price” cho hàm “get_discounted_price” làm đối số. Bây giờ khi bạn gọi hàm get_price, bạn sẽ không nhận được kết quả là 10 mà là một số được sửa đổi bởi trình trang trí get_discounted_price. Sau khi chạy mẫu mã trên, bạn sẽ nhận được đầu ra sau

5. 0

Việc sử dụng trang trí được hiển thị ở trên tương đương với đoạn mã sau

def get_discounted_price ( số tiền ):
    def discount_price ()< . :
        giá = số lượng () . 50
        new_price = price * 0.50
        return new_price
    return< . discounted_price

def get_price():
    return 10

giá cuối cùng =< get_discounted_price(get_price)
print (final_price())

Thay vì sử dụng cú pháp “@decorator” làm tốc ký, bạn chỉ cần tạo một phiên bản mới của hàm bên ngoài và cung cấp cho nó một hàm khác làm đối số. Kết quả cuối cùng của cả hai mẫu mã hóa là như nhau. Vì các bộ trang trí giữ nguyên hành vi của chức năng ban đầu, nên chúng thực sự hữu ích nếu bạn muốn gọi chúng theo từng trường hợp và đồng thời duy trì việc triển khai vanilla của chức năng được trang trí

Phần kết luận

Bạn có thể sử dụng các hàm lồng nhau theo nhiều cách khác nhau để tạo các hàm bên trong bổ sung thêm chức năng và logic cho hàm bên ngoài. Một số trường hợp sử dụng phổ biến nhất cho các hàm lồng nhau đã được giải thích trong bài viết. Bạn cũng có thể tạo triển khai các hàm bên trong của riêng mình, vì tất cả các hàm được coi là đối tượng hạng nhất trong Python và chúng có thể được trả về hoặc truyền dưới dạng đối số

Một chức năng có thể được xác định trong một chức năng?

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. Quá trình này còn được gọi là Encapsulation.

Bạn có thể gọi một hàm trong cùng hàm Python không?

Python cũng chấp nhận đệ quy hàm, nghĩa là một hàm đã xác định có thể gọi chính nó . Đệ quy là một khái niệm toán học và lập trình phổ biến. Nó có nghĩa là một chức năng gọi chính nó. Điều này có lợi là bạn có thể lặp qua dữ liệu để đạt được kết quả.

Có thể có chức năng bên trong chức năng?

Thực sự tốt khi khai báo một hàm bên trong một hàm khác . Điều này đặc biệt hữu ích khi tạo trang trí. Tuy nhiên, theo nguyên tắc thông thường, nếu hàm phức tạp (hơn 10 dòng), tốt hơn là nên khai báo nó ở cấp độ mô-đun.

Bạn có thể định nghĩa một hàm được lồng bên trong một hàm khác không?

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ông dụng, chủ yếu để tạo bao đóng và trang trí.