有人能解释一下Python中函数的闭包吗?

2024-10-02 18:22:54 发布

您现在位置:Python中文网/ 问答频道 /正文

Python

有人能帮我理解这段代码吗?我是Python新手,这个函数是如何工作的

    def makeInc(x):
        def inc(y):

            return y + x
        return inc
    incOne = makeInc(1)
    incFive = makeInc(5)
    print(incOne(5)) # returns 6
    print(incFive(5)) # returns 10

Tags: 函数代码returndefreturnsincprint新手
2条回答

高阶函数


makeInc这样依次返回另一个函数的函数称为higher order functions。通常,函数接受数据作为输入,返回数据作为输出。对于高阶函数,函数代替数据,要么返回代码作为输出,要么接受代码作为输入。这段代码被包装到一个函数中。在Python中,函数是第一类公民,这意味着函数和数据一样可以传递。例如:

myvariable = print

请注意,我如何将print分配给myvariable以及如何在print函数之后删除括号(没有括号)的函数称为函数对象。这意味着myvariable现在只是print的另一个名称:

print("Hello World!")
myvariable("Hello World!")

上述两种说法的作用完全相同。可以分配给变量的内容也可以从函数返回:

def myfunction():
    return print


myfunction()("Hello World!");

现在让我们看一下您的示例:

def makeInc(x):
    def inc(y):

        return y + x
    return inc

makeInc是一个接受名为x的参数的函数。然后它定义另一个名为inc的嵌套内部函数,该函数接受名为y的参数。关于嵌套函数的一点是,它们也可以访问封闭函数的变量。这里,inc是内部函数,但它可以访问x,这是封闭外部作用域的变量。 最后一条语句return inc将内部函数返回给makeInc的调用方。makeInc本质上正在做的是根据它接收的参数创建一个自定义函数。 例如:

x = makeInc(10)

makeInc将首先接受10,然后返回一个函数,该函数接受参数y,并将y增加10。 这里,x是一个函数,它接受任何参数y,然后将其递增10:

x(42) # Returns 52

nonlocal

但是,使用嵌套函数时需要注意:

def outer():
    x = 10
    def inner():
       x = 20
    inner() 
    print(x) # prints 10

在这里,您可以假设最后一个print语句将打印20。但是没有!当您在内部函数中赋值x = 20时,它会创建一个名为x的新局部变量,该变量初始化为20。外层x保持不变。要修改外部x,请使用nonlocal关键字:

def outer():
    x = 10
    def inner():
       nonlocal x = 20
    inner()
    print(x) # prints 20

如果直接读取x内部的inner()而不是分配给它,则不需要nonlocal

这里发生的是makeInc()返回一个指向inc()的特定实现的函数句柄。因此,调用makeInc(5)“将inc(y)中的x替换为5,并返回该函数的可调用句柄。此句柄保存在incFive中。现在可以调用定义的函数(inc(y))。由于之前设置了x=5,结果将是y+5

相关问题 更多 >