内部函数和闭包
本帖最后由 lzb1001 于 2023-5-12 13:40 编辑以下是小甲鱼在视频中的两个举例:
def FunX(x): # 定义函数FunX()
def FunY(y):: # 定义内部函数FunY()
return x * y
return FunY
def Fun1():
x = 5
def Fun2():
x *= x
return x
return Fun2() # 有括号()!
注意看:
1、第一个例子中def FunX(x)、def FunY(y),而第二个例子中def Fun1()、def Fun2(),我的疑问是:为何两个例子中一个括号内有参数、另一个括号内无参数?
2、第一个例子中return FunY ,第二个例子中return Fun2(),我的疑问是:为何两个例子中一个无括号,一个有括号?有什么区别?看下面第3个问题:
3、对第二个例子:
>>> Fun1() # 返回错误提示!
Traceback (most recent call last):
File "<pyshell#54>", line 1, in <module>
Fun1()
File "<pyshell#52>", line 6, in Fun1
return Fun2()
File "<pyshell#52>", line 4, in Fun2
x *= x
UnboundLocalError: local variable 'x' referenced before assignment
如果将第二个例子改成:
def Fun1():
x = 5
def Fun2():
x *= x
return x
return Fun2 # 没有括号()!
则:
>>> Fun1()
<function Fun1.<locals>.Fun2 at 0x000001C8EB3329D8> 1. 第一个例子中的FunX(x)和FunY(y)是两个函数,其中FunX(x)是一个接收一个参数x的函数,而FunY(y)是FunX(x)中的一个内部函数,接收一个参数y。第二个例子中的Fun1()和Fun2()也是两个函数,但是Fun2()是Fun1()中的一个内部函数,并没有接收任何参数。
2. 在第一个例子中,return FunY返回的是函数FunY本身,而不是函数FunY的返回值。因此可以直接返回FunY。在第二个例子中,return Fun2()返回的是函数Fun2的返回值,因为Fun2()是一个有返回值的函数。如果没有括号,就返回的是Fun2函数本身,而不是Fun2的返回值。
有无参数是自己定义的,你需要执行传入参数,就需要定义参数
函数带括号:表示是调用这个函数,返回的是这个函数运行的结果
函数不带括号:表示的是这一整个函数体,就表示这个函数本身
看下这:https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=173008&pid=4782972
Ps:善用论坛的搜索功能哦~
1. 第一个例子中,函数FunX(x)需要一个参数x来进行计算,而内部函数FunY(y)同样也需要一个参数y。在这个例子中,x和y并不相同,它们是两个¥¥的变量。而第二个例子中,函数Fun1()定义了一个变量x,并且内部函数Fun2()也可以访问该变量x,因此内部函数无需传递任何参数。
2. 在第一个例子中,return FunY只是返回一个函数对象FunY,但并没有执行该函数。在第二个例子中,return Fun2()是执行内部函数Fun2()并将其结果返回给外部调用函数Fun1()。
3. 在第二个例子中,由于变量x在函数Fun2()中被重新赋值了,Python会将其视为一个局部变量,从而导致UnboundLocalError错误。如果将返回语句修改为return Fun2,就可以避免这个错误,并且外部调用函数可以获得内部函数的引用,以后可以再次使用。 在第一个例子中,FunX和FunY都是带参数的函数,而在第二个例子中,Fun1和Fun2都没有参数。这是因为函数的参数是根据需要传递值来计算函数的结果。如果某个函数不需要接收任何参数,则可以省略括号中的参数列表。
在第一个例子中,return FunY返回的是内部函数FunY本身,而不是其计算结果。在第二个例子中,return Fun2()则返回的是内部函数Fun2的计算结果。由于Fun2返回的是一个数值,而非一个函数,所以需要在函数名后添加括号,以调用该函数并获取其输出。
第二个例子中的错误是因为在Fun2中尝试修改x时,Python认为x是一个局部变量,但事实上x是Fun1的变量。通过将return Fun2()改为return Fun2,并使Fun2返回计算结果而非函数本身,可以消除此错误,并正确返回函数计算的结果。
页:
[1]