Hướng dẫn what is nested function call in python? - lệnh gọi hàm lồng nhau trong python là gì?

Hãy cùng xem xét các ví dụ về lợi ích của các chức năng python lồng nhau và cách sử dụng chúng & nbsp; để đóng cửa đóng cửa và trang trí.to encapsul closures, and decorators.

Các hàm lồng nhau (hoặc bên trong, lồng nhau) là các hàm mà chúng tôi xác định bên trong các chức năng khác để truy cập trực tiếp các biến và tên được xác định trong hàm kèm theo. Các chức năng lồng nhau có nhiều cách sử dụng, chủ yếu để tạo ra các thiết bị đóng cửa và trang trí.

Một ví dụ về chức năng lồng nhau là gì?

  • Ví dụ, bằng cách lồng hàm trung bình và tổng trong các đối số của hàm IF, công thức sau đây chỉ tổng hợp một tập hợp số (G2: G5) chỉ khi trung bình của một tập hợp số khác (F2: F5) lớn hơn 50. Mặt khác, nó trả về 0. Các hàm trung bình và tổng được lồng trong hàm if.

  • Chức năng lồng nhau hoạt động như thế nào?

  • Một hàm lồng nhau có thể truy cập các hàm, biến, hằng số, loại, lớp, vv khác, đó là trong cùng một phạm vi hoặc trong bất kỳ phạm vi bao quanh nào, mà không có tham số rõ ràng, điều này đơn giản hóa rất nhiều 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.

  • Cuộc gọi chức năng Python là gì?

Các cuộc gọi chức năng. Đối tượng có thể gọi là một đối tượng có thể chấp nhận một số đối số (còn được gọi là tham số) và có thể trả về một đối tượng (thường là một tuple chứa nhiều đối tượng). Một hàm là đối tượng có thể gọi đơn giản nhất trong Python, nhưng có những đối tượng khác, chẳng hạn như các lớp hoặc các trường hợp nhất định.

def outer_func():
    def inner_func():
        print("Hello, World!")
    inner_func()
outer_func()

Đầu ra

Trong hướng dẫn này, chúng tôi sẽ

Tìm hiểu cách cung cấp các chức năng đóng gói và ẩn các chức năng khỏi quyền truy cập bên ngoài

Viết các chức năng của người trợ giúp để làm cho mã dễ dàng sử dụng lại

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")

Đầu ra

Trong hướng dẫn này, chúng tôi sẽ

Tìm hiểu cách cung cấp các chức năng đóng gói và ẩn các chức năng khỏi quyền truy cập bên ngoài

Một ví dụ khác về chức năng lồng nhau phức tạp hơn:

def factorial(number):
    if not isinstance(number, int):
        raise TypeError("The number must be whole.")
    if number < 0:
        raise ValueError("The number must be non-negative.")
    #Factorial calculation
    def inner_factorial(number):
        if number <= 1:
            return 1
        return number * inner_factorial(number - 1)
    return inner_factorial(number)
 factorial(4)

Đầu ra

24

Trong hàm, trước tiên chúng tôi xác nhận đầu vào để đảm bảo người dùng đang cung cấp một số nguyên không âm. Sau đó, chúng tôi xác định một hàm bên trong được đặt tên là tính toán giai thừa. Trong bước cuối cùng, tính toán tương ứng được gọi và thực hiện. factorial () inter_factorial () inter_factorial ()

Ưu điểm chính của việc sử dụng một mẫu như vậy là bằng cách thực hiện tất cả các kiểm tra đối số trong hàm bên ngoài, chúng ta có thể bỏ qua một cách an toàn việc kiểm tra lỗi trong hàm bên trong và tập trung vào tính toán hiện tại.

Những điều cơ bản của việc sử dụng các chức năng lồng nhau trong Python

Đóng gói

Một trường hợp sử dụng phổ biến cho các chức năng nội bộ là khi bạn cần bảo vệ hoặc ẩn một chức năng khỏi mọi thứ xảy ra bên ngoài nó, nghĩa là ẩn hoàn toàn chức năng khỏi phạm vi toàn cầu. Hành vi này thường được gọi là đóng gói.

Hãy bắt đầu với một ví dụ minh họa:

def increment(number):
    def inner_increment():
        return number + 1
    return inner_increment()
 print(increment(10))

Đầu ra

11

# Let's call the nested function inner_increment()
>>> print(inner_increment())

Đầu ra

Trong hàm, trước tiên chúng tôi xác nhận đầu vào để đảm bảo người dùng đang cung cấp một số nguyên không âm. Sau đó, chúng tôi xác định một hàm bên trong được đặt tên là tính toán giai thừa. Trong bước cuối cùng, tính toán tương ứng được gọi và thực hiện. factorial () inter_factorial () inter_factorial ()

Ưu điểm chính của việc sử dụng một mẫu như vậy là bằng cách thực hiện tất cả các kiểm tra đối số trong hàm bên ngoài, chúng ta có thể bỏ qua một cách an toàn việc kiểm tra lỗi trong hàm bên trong và tập trung vào tính toán hiện tại.

Những điều cơ bản của việc sử dụng các chức năng lồng nhau trong Python

Đóng gói

Một trường hợp sử dụng phổ biến cho các chức năng nội bộ là khi bạn cần bảo vệ hoặc ẩn một chức năng khỏi mọi thứ xảy ra bên ngoài nó, nghĩa là ẩn hoàn toàn chức năng khỏi phạm vi toàn cầu. Hành vi này thường được gọi là đóng gói.

Hãy bắt đầu với một ví dụ minh họa:

  1. Tên lỗi: Tên ‘Internor_increment, không được xác định

  2. Trong ví dụ này, chúng tôi không có quyền truy cập trực tiếp. Bằng cách cố gắng truy cập chức năng lồng nhau, chúng tôi nhận được. Chức năng che giấu hoàn toàn chức năng, ngăn chặn quyền truy cập từ phạm vi toàn cầu. inner_increment () Tên lỗi Tăng () Inside_increment ()

  3. Tạo các chức năng trợ giúp nội bộ

  4. Đôi khi chúng ta cần một chức năng thực thi cùng một đoạn mã ở một số nơi trong cơ thể của nó. Hãy để lấy một ví dụ để tạo một chức năng để truy cập và sử dụng tệp CSV chứa thông tin về các điểm nóng không dây. Để tìm hiểu tổng số điểm truy cập, cũng như thông tin về công ty cung cấp cho họ, chúng tôi đã tạo tập lệnh sau:

import CSV
from collections import Counter
def process_hotspots(file):
    def most_common_provider(file_obj):
        hotspots = []
        with file_obj as csv_file:
            content = csv.DictReader(csv_file)
            for row in content:
                hotspots.append(row["Provider"])
        counter = Counter(hotspots)
        print(
             f "{counter.most_common (1) [0] [1]} provides"
             f "{counter.most_common (1) [0] [0]}."
        )
    if isinstance(file, str):
# Get the path to the file
                file_obj = open(file, "r")
        most_common_provider(file_obj)
    else:
        # We take the file object
        most_common_provider(file)

>>> from hotspots import process_hotspots
>>> file_obj = open ("./ NY_Wi-Fi_Hotspot_Locations.csv", "r")
>>> process_hotspots (file_obj)
There are 3,319 Wi-Fi points in New York.
1,868 of these are provided by LinkNY - City bridge.
>>> process_hotspots ("./ NY_Wi-Fi_Hotspot_Locations.csv")
There are 3,319 Wi-Fi points in New York.
1,868 of these are provided by LinkNY - City bridge.

Điều này lấy một đối số và kiểm tra xem tệp là đường dẫn chuỗi đến tệp vật lý hoặc đối tượng tệp. Hàm sau đó gọi hàm bên trong trợ giúp lấy đối tượng tệp và thực hiện các hoạt động sau: process_hotspots () file mest_common_provider ()

Đọc nội dung của một tệp vào một trình tạo tạo từ điển sử dụng. CSV.Dictreader

Danh sách các nhà cung cấp Wi-Fi.

Đếm số lượng điểm nóng Wi-Fi cho mỗi nhà cung cấp sử dụng một cơ sở. bộ sưu tập. Chuỗi

In một tin nhắn với thông tin nhận được.

Bằng cách chạy chức năng, chúng tôi nhận được đầu ra sau:

Hướng dẫn what is nested function call in python? - lệnh gọi hàm lồng nhau trong python là gì?

Bất kể chúng tôi gọi với đường dẫn tệp chuỗi hay đối tượng tệp, bạn sẽ nhận được kết quả tương tự. process_hotspots ()

Sử dụng các chức năng trợ giúp nội bộ và riêng tư

Chúng tôi thường tạo các chức năng nội bộ trợ giúp, chẳng hạn như khi chúng tôi muốn cung cấp đóng gói hoặc khi chúng tôi sẽ không gọi chúng ở bất cứ nơi nào khác ngoài chức năng kèm theo. MOST_COMMON_PROVIDER ()

Mặc dù việc viết các chức năng trợ giúp nội bộ cho kết quả mong muốn, tốt nhất là nên phơi bày chúng dưới dạng các chức năng cấp cao nhất. Trong trường hợp này, bạn có thể sử dụng tiền tố gạch dưới trong tên hàm để cho biết rằng nó là riêng tư cho mô -đun hoặc lớp hiện tại. Để làm cho mã sạch hơn và có thể đọc được, chúng tôi sử dụng việc trích xuất các chức năng nội bộ vào các hàm riêng cấp cao nhất. Thực tiễn này phù hợp với nguyên tắc trách nhiệm duy nhất.

  1. Lưu trạng thái với các chức năng lồng nhau: Đóng cửa trong Python

  2. Các chức năng Python trong các quyền của chúng 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. như các giá trị được trả về.

  3. Nguồn

Nếu chúng ta không cần phải che giấu các chức năng nội bộ từ thế giới bên ngoài, thì không có lý do cụ thể nào để làm tổ.

Trong phần này, chúng tôi sẽ nói về một loại chức năng lồng nhau khác - đóng cửa. Đây là các chức năng được tạo động được trả về bởi các chức năng khác. Để truy cập các biến và tên được xác định trong việc đóng không gian tên cục bộ có toàn quyền, bất kể chức năng kèm theo có hoàn tất việc thực thi hay không.

Có ba bước để xác định đóng cửa:

Tạo một chức năng lồng nhau.

powers.py
def generate_power(exponent):
    def power(base):
        return base ** exponent
    return power

Tham khảo các biến từ hàm kèm theo.

Giá trị số mũ đến từ đâu? Đây là nơi chụp ảnh đi vào chơi. Ví dụ này nhận được giá trị số mũ từ một hàm bên ngoài. Đây là những gì Python làm khi chúng ta gọi: power () probonent Power () cersoate_power () Generate_power ()

  1. Xác định một thể hiện mới có một đối số. cơ sở Power ()

  2. Có một ảnh chụp nhanh của môi trường. Nó bao gồm giá trị hiện tại. quyền lực () số mũ

  3. Trở lại cùng với nhà nước. sức mạnh()

Do đó, khi chúng ta gọi thể hiện được trả về bởi hàm, chúng ta có thể thấy rằng hàm này nhớ lại giá trị của mức độ: power () cersoat

>>> raise_two = generate_power(2)
>>> raise_three = generate_power(3)
>>> raise_two(4)

Đầu ra

16

>>> raise_two(5)

Đầu ra

25

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
0

Đầu ra

64

Lưu ý rằng cả hai đóng cửa đều nhớ số mũ tương ứng giữa các cuộc gọi. Trong những ví dụ này, nhớ những gì và nhớ những gì. RAISE_TWO () Số mũ = 2 Rise_Three () Số mũ = 3

Hãy xem xét một ví dụ khác:

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
1
def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
2

Đầu ra

Lưu ý rằng cả hai đóng cửa đều nhớ số mũ tương ứng giữa các cuộc gọi. Trong những ví dụ này, nhớ những gì và nhớ những gì. RAISE_TWO () Số mũ = 2 Rise_Three () Số mũ = 3

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
3

Đầu ra

Lưu ý rằng cả hai đóng cửa đều nhớ số mũ tương ứng giữa các cuộc gọi. Trong những ví dụ này, nhớ những gì và nhớ những gì. RAISE_TWO () Số mũ = 2 Rise_Three () Số mũ = 3

Hãy xem xét một ví dụ khác:

Quản trị viên có quyền truy cập vào trang quản trị viên.

John John không có quyền truy cập vào trang quản trị viên.

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
4

Hàm lồng nhau kiểm tra nếu người dùng đã cho có quyền truy cập cần thiết cho trang. Thay vì kiểm tra xem người dùng có bằng nhau không, bạn có thể truy vấn cơ sở dữ liệu. 'quản trị viên'

Việc đóng cửa thường không thay đổi trạng thái mà họ nhận được khi sinh, như thể hiện trong các ví dụ trên. Nhưng bạn cũng có thể tạo các đóng cửa động bằng các đối tượng có thể thay đổi như từ điển, bộ hoặc danh sách.

Giả sử bạn muốn tính trung bình cho một bộ dữ liệu. Dữ liệu xuất hiện dưới dạng một luồng các phép đo liên tiếp của tham số được phân tích và điều cần thiết là hàm 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, mã nhà máy để tạo đóng cửa có thể trông như thế này:

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
5

Một đóng cửa được chỉ định duy trì trạng thái tìm nạp giữa các cuộc gọi. Mặc dù chúng tôi xác định một danh sách nội bộ, nhưng nó cũng có sẵn trong một đóng cửa. Sample_mean Mẫu trung bình ()

Thay đổi trạng thái chụp

Các biến đóng cửa thường được ẩn hoàn toàn khỏi thế giới bên ngoài. Tuy nhiên, chúng tôi có thể xác định các chức năng Getter và Setter cho chúng:

Ở đây trả về một đóng cửa đại diện cho đối tượng. Các chức năng được gắn vào đối tượng này mà chúng ta có thể sử dụng để có quyền truy cập để đọc và ghi các biến và. make_point () điểm x y

Hướng dẫn what is nested function call in python? - lệnh gọi hàm lồng nhau trong python là gì?

Một nhà máy như vậy thậm chí có thể nhanh hơn một lớp tương đương, nhưng cách tiếp cận không cung cấp sự kế thừa, mô tả và các tính năng khác của các lớp Python.

Thay đổi hành vi với các chức năng lồng nhau: Người trang trí

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
6

Trang trí Python là trường hợp sử dụng phổ biến và dễ dàng hơn cho các chức năng nội bộ, đặc biệt là cho việc đóng cửa. Các trình trang trí là các hàm bậc cao hơn lấy một đối tượng có thể gọi (chức năng, phương thức, lớp) làm đối số và trả về một đối tượng có thể gọi được khác.

Nguồn

Thông thường, các nhà trang trí được sử dụng để tự động thêm các thuộc tính vào một callee hiện có và mở rộng hành vi của nó mà không ảnh hưởng hoặc sửa đổi callee. Một chức năng trang trí có thể được áp dụng cho bất kỳ đối tượng có thể gọi được. Để làm điều này, biểu tượng và tên của người trang trí được đặt trong dòng trước

đi qua

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
7

Đầu ra

Lưu ý rằng cả hai đóng cửa đều nhớ số mũ tương ứng giữa các cuộc gọi. Trong những ví dụ này, nhớ những gì và nhớ những gì. RAISE_TWO () Số mũ = 2 Rise_Three () Số mũ = 3

Hãy xem xét một ví dụ khác:

Quản trị viên có quyền truy cập vào trang quản trị viên.

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
8

John John không có quyền truy cập vào trang quản trị viên.

Hàm lồng nhau kiểm tra nếu người dùng đã cho có quyền truy cập cần thiết cho trang. Thay vì kiểm tra xem người dùng có bằng nhau không, bạn có thể truy vấn cơ sở dữ liệu. 'quản trị viên'

def outer_func(who):
    def inner_func():
        print(f"Hello, {who}")
    inner_func()
outer_func("World!")
9

Việc đóng cửa thường không thay đổi trạng thái mà họ nhận được khi sinh, như thể hiện trong các ví dụ trên. Nhưng bạn cũng có thể tạo các đóng cửa động bằng các đối tượng có thể thay đổi như từ điển, bộ hoặc danh sách.

Giả sử bạn muốn tính trung bình cho một bộ dữ liệu. Dữ liệu xuất hiện dưới dạng một luồng các phép đo liên tiếp của tham số được phân tích và điều cần thiết là hàm 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, mã nhà máy để tạo đóng cửa có thể trông như thế này:

Sự kết luận

Vì vậy, trong Python, các hàm lồng nhau 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. Nó cung cấp một cơ chế để đóng gói các chức năng, tạo ra các giải pháp trợ giúp và thực hiện các công cụ đóng cửa và trang trí.

Các phương tiện truyền thông được hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định của tác giả.

Cuộc gọi chức năng lồng nhau là gì?

Các hàm lồng nhau (hoặc bên trong, lồng nhau) là các hàm mà chúng tôi xác định bên trong các chức năng khác để truy cập trực tiếp các biến và tên được xác định trong hàm kèm theo. Các chức năng lồng nhau có nhiều cách sử dụng, chủ yếu để tạo ra các thiết bị đóng cửa và trang trí.functions that we define inside other functions to directly access the variables and names defined in the enclosing function. Nested functions have many uses, primarily for creating closures and decorators.

Một ví dụ về chức năng lồng nhau là gì?

Ví dụ, bằng cách lồng hàm trung bình và tổng trong các đối số của hàm IF, công thức sau đây chỉ tổng hợp một tập hợp số (G2: G5) chỉ khi trung bình của một tập hợp số khác (F2: F5) lớn hơn 50.Mặt khác, nó trả về 0. Các hàm trung bình và tổng được lồng trong hàm if.by nesting the AVERAGE and SUM function in the arguments of the IF function, the following formula sums a set of numbers (G2:G5) only if the average of another set of numbers (F2:F5) is greater than 50. Otherwise, it returns 0. The AVERAGE and SUM functions are nested within the IF function.

Chức năng lồng nhau hoạt động như thế nào?

Một hàm lồng nhau có thể truy cập các hàm, biến, hằng số, loại, lớp, vv khác, đó là trong cùng một phạm vi hoặc trong bất kỳ phạm vi bao quanh nào, mà không có tham số rõ ràng, điều này đơn giản hóa rất nhiều 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. that are in the same scope, or in any enclosing scope, without explicit parameter passing, which greatly simplifies passing data into and out of the nested function. This is typically allowed for both reading and writing.

Cuộc gọi chức năng Python là gì?

Các cuộc gọi chức năng.Đối tượng có thể gọi là một đối tượng có thể chấp nhận một số đối số (còn được gọi là tham số) và có thể trả về một đối tượng (thường là một tuple chứa nhiều đối tượng).Một hàm là đối tượng có thể gọi đơn giản nhất trong Python, nhưng có những đối tượng khác, chẳng hạn như các lớp hoặc các trường hợp nhất định.A callable object is an object that can accept some arguments (also called parameters) and possibly return an object (often a tuple containing multiple objects). A function is the simplest callable object in Python, but there are others, such as classes or certain class instances.