Python 中的嵌套函数

Manav Narula 2023年10月10日
Python 中的嵌套函数

函数是可以在程序中反复调用的代码块。它可以接受不同的参数并且可以返回一些有用的值。在所有编程语言中,我们都有内置函数和用户定义函数。

在本教程中,我们将学习如何在 Python 中创建和使用嵌套函数。

大多数语言都支持使用和创建嵌套函数。顾名思义,嵌套函数是函数内的函数。嵌套在里面的函数称为内函数,封闭的函数称为外函数。

在下面的代码中,我们创建了一个基本的嵌套函数。

def outer_f(s):
    def inner_f(s):
        print(s)

    inner_f(s)


outer_f("Nested")

输出:

Nested

使用上面的例子,我们可以对嵌套函数的使用有所了解。它们可用于对外界隐藏函数并实现数据封装。

要知道的另一件事是嵌套函数可以使用外部函数中使用的变量。此类变量称为非局部变量。嵌套函数可以访问它们,但是如果我们需要修改它们,我们必须使用 nonlocal 关键字。

让我们看看下面的例子。

def outer_f():
    s = 5

    def inner_f():
        nonlocal s
        s = s + 1
        return s

    return inner_f()


print(outer_f())

输出:

6

在这里,如果不使用 nonlocal 关键字,我们将无法修改 s 变量。

现在想象一下嵌套函数是否返回某个值。这给我们带来了嵌套函数的另一个有用特性,那就是闭包函数。这些函数是使用嵌套函数动态创建的。它可能是一种优雅而简洁的方式来实现数据隐藏并将其用作类的替代方法。

请参考以下代码。

def incrementer(x):
    def inc(y):
        return x + y

    return inc


by4 = incrementer(4)
by5 = incrementer(5)

print(by4(5), by5(5))

输出:

9 10

现在在上面的代码中,我们创建了一个动态方法来增加一个数字。by4by5 是使用嵌套函数创建的两个闭包函数。这主要是由于嵌套函数能够保持其状态。当不涉及太多属性时,它可能是类和全局变量的不错替代品。我们可以使用 __closure__ 属性来确定一个函数是否是一个闭包。所有函数都有这个属性,当与闭包函数一起使用时,它会返回一些单元格对象。

嵌套函数也用于装饰器函数。装饰器函数使用可调用对象,如类、函数,并返回另一个对象。我们使用@ 符号在任何此类可调用对象之前使用装饰器。这样,我们将可调用对象作为装饰器函数的参数并使用它。

我们创建了一个非常简单的装饰器函数,以便在以下示例中更好地理解这一点。

def dec(func):
    def inner():
        print("Hello")
        func()

    return inner


@dec
def world():
    print("world")


world()

输出:

Hello
world

在上面的例子中,我们创建了一个名为 dec() 的简单装饰器函数,它通过将 world() 函数用作参数并打印附加消息来装饰它。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相关文章 - Python Function