鱼C论坛

 找回密码
 立即注册
查看: 1069|回复: 27

[已解决]求助这个套娃和函数、return的用法

[复制链接]
发表于 2020-4-22 21:54:14 | 显示全部楼层 |阅读模式

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

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

x
2c1b682fbeb3a387eb511592e6b5bd8.png

问题直接写在代码后面,求哪位高手帮忙解答下,十分感谢!!!
最佳答案
2020-4-22 23:52:24
本帖最后由 jkluoling1992 于 2020-4-22 23:53 编辑
失文 发表于 2020-4-22 23:11
万分感谢!
1、也就是说count()函数执行完后是一个list类型,f1,f2,f3 = count()这样赋值后,f1,f2,f3都 ...


1 count()调用完返回一个list 列表,里面放了三个函数名,就像f1,f2,f3 = [fun1,fun2,fun3], f1 = fun1, f2 = fun2, f3 =fun3,
2 函数名加()就是函数调用了,函数的地址你就理解为函数名吧
3 当return fs 时,已经是for循环结束时调用了f函数,此时i=3 ,return f 就是 return i*i ,三次for循环只return一次,所以不会出现1,4,9,,只有9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-22 21:58:28 | 显示全部楼层
求求你了发代码不要发图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 22:00:21 | 显示全部楼层
def count():
    fs = []
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f)
    return fs


f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 22:02:29 | 显示全部楼层
老八秘制 发表于 2020-4-22 21:58
求求你了发代码不要发图片
def count():
    fs = []
    for i in range(1,4):
        def f():
            return i*i
        fs.append(f)
    return fs


f1, f2, f3 = count()
print(f1())
print(f2())
print(f3())
————————————————
版权声明:本文为CSDN博主「redhatlxs」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liu1123055728/java/article/details/94454919
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-22 22:14:14 | 显示全部楼层
1.f是返回这个函数的地址,f()则是调用函数
2.对数组fs的末位添加一个f,原先是fs=[],添加后就是fs=[f],一个函数地址
3.返回的应该是f的调用结果
4.应该相当于让f1,f2,f3和count成为作用一样的函数
5、6.不太清楚,@zltzlt @qiuyouzhi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-22 22:30:57 | 显示全部楼层
单独定义的话,f3 就是一个list,里面的元素类型是函数的地址,list是没法直接调用的,
最后输出9是因为在循环结束后才return fs,最后的i为3,输出3*3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 22:34:00 | 显示全部楼层
老八秘制 发表于 2020-4-22 22:14
1.f是返回这个函数的地址,f()则是调用函数
2.对数组fs的末位添加一个f,原先是fs=[],添加后就是fs=[f], ...

谢谢,还有哈,函数的地址不是用来调用函数的吗,fs = [f],还是说列表fs存放的是函数f地址,类似于fs = [range(1,10)],fs.append(f)执行后,fs变成了什么,经过for循环后,fs又变成了啥
剩下的问题明白了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-22 22:34:53 | 显示全部楼层
失文 发表于 2020-4-22 22:34
谢谢,还有哈,函数的地址不是用来调用函数的吗,fs = [f],还是说列表fs存放的是函数f地址,类似于fs =  ...

我要睡觉了,明天我看看能不能解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-22 23:11:55 | 显示全部楼层
jkluoling1992 发表于 2020-4-22 22:30
单独定义的话,f3 就是一个list,里面的元素类型是函数的地址,list是没法直接调用的,
最后输出9是因为在 ...

万分感谢!
1、也就是说count()函数执行完后是一个list类型,f1,f2,f3 = count()这样赋值后,f1,f2,f3都变成了count(),但是在python中不直接显示为列表形式,而是和range()一样的吗?
2、函数的地址具体是个啥东西。。。
3、最后为啥输出的不是列表[1,4,9]的形式,而只是返回了最后一次9的值,x.append(f),不就是给x[]中添加1,4,9吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-22 23:52:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jkluoling1992 于 2020-4-22 23:53 编辑
失文 发表于 2020-4-22 23:11
万分感谢!
1、也就是说count()函数执行完后是一个list类型,f1,f2,f3 = count()这样赋值后,f1,f2,f3都 ...


1 count()调用完返回一个list 列表,里面放了三个函数名,就像f1,f2,f3 = [fun1,fun2,fun3], f1 = fun1, f2 = fun2, f3 =fun3,
2 函数名加()就是函数调用了,函数的地址你就理解为函数名吧
3 当return fs 时,已经是for循环结束时调用了f函数,此时i=3 ,return f 就是 return i*i ,三次for循环只return一次,所以不会出现1,4,9,,只有9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-23 00:53:56 | 显示全部楼层
jkluoling1992 发表于 2020-4-22 23:52
1 count()调用完返回一个list 列表,里面放了三个函数名,就像f1,f2,f3 = [fun1,fun2,fun3], f1 =  ...

那按照你讲的,既然count()函数的值就是return fs返回的存放了三个函数名的列表,那说明fs列表在for循环中就已经增加了元素,由[]变成[fun1,fun2,fun3],那最后打印时又怎么会只出现一个9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 09:09:25 | 显示全部楼层
1. f 是函数的地址,f() 是函数的返回值,不懂就复习一下
2. print(fs) 是因为你用 fs.append(f) 将函数的地址添加了进去,参考 1. 理解一下
3. fs 是在函数内定义的列表,和 3. print(fs) 的内容相同
4. f1, f2, f3 = count() 等价于 f1 = count();f2 = count();f3 = count()
5. 单独 f3 = count() 不会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 09:19:06 | 显示全部楼层
失文 发表于 2020-4-23 00:53
那按照你讲的,既然count()函数的值就是return fs返回的存放了三个函数名的列表,那说明fs列表在for循环 ...

def count():
    fs = []
    for i in range(1,4):
        def f():
            print(i)
            return i*i
        fs.append(f)
    return fs


单步调试,你看看调用f1()的时候,i打印出来是几,,这个函数f 进了几次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 09:22:48 | 显示全部楼层
失文 发表于 2020-4-22 23:11
万分感谢!
1、也就是说count()函数执行完后是一个list类型,f1,f2,f3 = count()这样赋值后,f1,f2,f3都 ...


帮你改了一下:
def count():
    fs = [i * i for i in range(1, 4)]
    return fs

也可以传入参数:
def count(stop):
    fs = [i * i for i in range(1, stop)]
    return fs
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-23 13:33:01 | 显示全部楼层
jkluoling1992 发表于 2020-4-23 09:19
def count():
    fs = []
    for i in range(1,4):

大佬,函数不是这么运行的吗:
for 第一次循环 → fs.append(f) → 调用fs,return i * i,→ fs末尾添加了f函数,第二次、第三次循环同理,fs列表最后应该是类似于[f1(),f2(),f3()]这种形式的吧,那打印出来不应该是[f1(),f2(),f3()]这样吗。为啥只返回3
def count():
    fs = []
    for i in range(1,4):
        def f():
            print('this is i:',i)     # i 打印了3次,但都是3,而且为啥不是最先打印出来的?
            return i*i
        fs.append(f)
    print('this is fs:',fs)           # 这个打印是函数名的列表,最先打印出来的
    return fs
f1,f2,f3 = count()
print(f1(),f2(),f3())                 # 9 9 9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-23 13:42:40 | 显示全部楼层
_2_ 发表于 2020-4-23 09:09
1. f 是函数的地址,f() 是函数的返回值,不懂就复习一下
2. print(fs) 是因为你用 fs.append(f) 将函数的 ...

f1,f2,f3 = count(),根据我测试的结果,只要等号左边的变量数量和等号右边列表(这里指的是count(),但是type(count()) 是个列表)的元素数量,就不会报错,反之报错,测试 f3 = count(),也会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 13:44:43 From FishC Mobile | 显示全部楼层
失文 发表于 2020-4-23 13:33
大佬,函数不是这么运行的吗:
for 第一次循环 → fs.append(f) → 调用fs,return i * i,→ fs末尾添 ...

打印的是i,f返回的是i*i,下次问之前思考一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 13:53:27 | 显示全部楼层
失文 发表于 2020-4-23 13:42
f1,f2,f3 = count(),根据我测试的结果,只要等号左边的变量数量和等号右边列表(这里指的是count(),但 ...

f3 = count() 不可能报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 13:55:17 From FishC Mobile | 显示全部楼层
本帖最后由 jkluoling1992 于 2020-4-23 13:57 编辑
永恒的蓝色梦想 发表于 2020-4-23 13:53
f3 = count() 不可能报错


他说的是这种情况下,f3()会报错,单纯的赋值,f3就是一个list,不会错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-23 13:57:22 | 显示全部楼层
jkluoling1992 发表于 2020-4-23 13:55
他说的是这种情况下,f3()会报错

哦,明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 18:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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