鱼C论坛

 找回密码
 立即注册
查看: 2579|回复: 4

内部函数和闭包

[复制链接]
发表于 2023-5-12 13:35:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-12 13:36:07 | 显示全部楼层
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的返回值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-12 17:56:50 | 显示全部楼层


有无参数是自己定义的,你需要执行传入参数,就需要定义参数

函数带括号:表示是调用这个函数,返回的是这个函数运行的结果

函数不带括号:表示的是这一整个函数体,就表示这个函数本身

看下这:https://fishc.com.cn/forum.php?m ... 008&pid=4782972

Ps善用论坛的搜索功能哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-12 18:13:31 | 显示全部楼层
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,就可以避免这个错误,并且外部调用函数可以获得内部函数的引用,以后可以再次使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-13 01:10:17 | 显示全部楼层
在第一个例子中,FunX和FunY都是带参数的函数,而在第二个例子中,Fun1和Fun2都没有参数。这是因为函数的参数是根据需要传递值来计算函数的结果。如果某个函数不需要接收任何参数,则可以省略括号中的参数列表。
在第一个例子中,return FunY返回的是内部函数FunY本身,而不是其计算结果。在第二个例子中,return Fun2()则返回的是内部函数Fun2的计算结果。由于Fun2返回的是一个数值,而非一个函数,所以需要在函数名后添加括号,以调用该函数并获取其输出。
第二个例子中的错误是因为在Fun2中尝试修改x时,Python认为x是一个局部变量,但事实上x是Fun1的变量。通过将return Fun2()改为return Fun2,并使Fun2返回计算结果而非函数本身,可以消除此错误,并正确返回函数计算的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 02:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表