2024-10-02 18:22:54 发布
网友
有人能帮我理解这段代码吗?我是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
像makeInc这样依次返回另一个函数的函数称为higher order functions。通常,函数接受数据作为输入,返回数据作为输出。对于高阶函数,函数代替数据,要么返回代码作为输出,要么接受代码作为输入。这段代码被包装到一个函数中。在Python中,函数是第一类公民,这意味着函数和数据一样可以传递。例如:
makeInc
myvariable = print
请注意,我如何将print分配给myvariable以及如何在print函数之后删除括号(没有括号)的函数称为函数对象。这意味着myvariable现在只是print的另一个名称:
print
myvariable
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
inc
y
return inc
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关键字:
x = 20
def outer(): x = 10 def inner(): nonlocal x = 20 inner() print(x) # prints 20
如果直接读取x内部的inner()而不是分配给它,则不需要nonlocal
inner()
这里发生的是makeInc()返回一个指向inc()的特定实现的函数句柄。因此,调用makeInc(5)“将inc(y)中的x替换为5,并返回该函数的可调用句柄。此句柄保存在incFive中。现在可以调用定义的函数(inc(y))。由于之前设置了x=5,结果将是y+5
makeInc()
inc()
makeInc(5)
inc(y)
5
incFive
y+5
高阶函数
像
makeInc
这样依次返回另一个函数的函数称为higher order functions。通常,函数接受数据作为输入,返回数据作为输出。对于高阶函数,函数代替数据,要么返回代码作为输出,要么接受代码作为输入。这段代码被包装到一个函数中。在Python中,函数是第一类公民,这意味着函数和数据一样可以传递。例如:请注意,我如何将
print
分配给myvariable
以及如何在print
函数之后删除括号(没有括号)的函数称为函数对象。这意味着myvariable
现在只是print
的另一个名称:上述两种说法的作用完全相同。可以分配给变量的内容也可以从函数返回:
现在让我们看一下您的示例:
makeInc
是一个接受名为x
的参数的函数。然后它定义另一个名为inc
的嵌套内部函数,该函数接受名为y
的参数。关于嵌套函数的一点是,它们也可以访问封闭函数的变量。这里,inc
是内部函数,但它可以访问x
,这是封闭外部作用域的变量。 最后一条语句return inc
将内部函数返回给makeInc
的调用方。makeInc
本质上正在做的是根据它接收的参数创建一个自定义函数。 例如:makeInc
将首先接受10,然后返回一个函数,该函数接受参数y
,并将y
增加10。 这里,x
是一个函数,它接受任何参数y
,然后将其递增10:nonlocal
但是,使用嵌套函数时需要注意:
在这里,您可以假设最后一个
print
语句将打印20。但是没有!当您在内部函数中赋值x = 20
时,它会创建一个名为x
的新局部变量,该变量初始化为20。外层x
保持不变。要修改外部x
,请使用nonlocal
关键字:如果直接读取
x
内部的inner()
而不是分配给它,则不需要nonlocal
这里发生的是
makeInc()
返回一个指向inc()
的特定实现的函数句柄。因此,调用makeInc(5)
“将inc(y)
中的x
替换为5
,并返回该函数的可调用句柄。此句柄保存在incFive
中。现在可以调用定义的函数(inc(y)
)。由于之前设置了x=5,结果将是y+5
相关问题 更多 >
编程相关推荐