失文 发表于 2020-4-22 21:54:14

求助这个套娃和函数、return的用法



问题直接写在代码后面,求哪位高手帮忙解答下,十分感谢!!!

老八秘制 发表于 2020-4-22 21:58:28

求求你了发代码不要发图片

失文 发表于 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())

失文 发表于 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

老八秘制 发表于 2020-4-22 22:14:14

1.f是返回这个函数的地址,f()则是调用函数
2.对数组fs的末位添加一个f,原先是fs=[],添加后就是fs=,一个函数地址
3.返回的应该是f的调用结果
4.应该相当于让f1,f2,f3和count成为作用一样的函数
5、6.不太清楚,@zltzlt @qiuyouzhi

jkluoling1992 发表于 2020-4-22 22:30:57

单独定义的话,f3 就是一个list,里面的元素类型是函数的地址,list是没法直接调用的,
最后输出9是因为在循环结束后才return fs,最后的i为3,输出3*3

失文 发表于 2020-4-22 22:34:00

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

谢谢,还有哈,函数的地址不是用来调用函数的吗,fs = ,还是说列表fs存放的是函数f地址,类似于fs = ,fs.append(f)执行后,fs变成了什么,经过for循环后,fs又变成了啥
剩下的问题明白了,谢谢!

老八秘制 发表于 2020-4-22 22:34:53

失文 发表于 2020-4-22 22:34
谢谢,还有哈,函数的地址不是用来调用函数的吗,fs = ,还是说列表fs存放的是函数f地址,类似于fs =...

我要睡觉了,明天我看看能不能解决

失文 发表于 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、最后为啥输出的不是列表的形式,而只是返回了最后一次9的值,x.append(f),不就是给x[]中添加1,4,9吗

jkluoling1992 发表于 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 = , 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

失文 发表于 2020-4-23 00:53:56

jkluoling1992 发表于 2020-4-22 23:52
1 count()调用完返回一个list 列表,里面放了三个函数名,就像f1,f2,f3 = , f1 =...

那按照你讲的,既然count()函数的值就是return fs返回的存放了三个函数名的列表,那说明fs列表在for循环中就已经增加了元素,由[]变成,那最后打印时又怎么会只出现一个9

_2_ 发表于 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() 不会报错

jkluoling1992 发表于 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 进了几次

_2_ 发表于 2020-4-23 09:22:48

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

帮你改了一下:
def count():
    fs =
    return fs

也可以传入参数:

def count(stop):
    fs =
    return fs

失文 发表于 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列表最后应该是类似于这种形式的吧,那打印出来不应该是这样吗。为啥只返回3def 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

失文 发表于 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(),也会报错

jkluoling1992 发表于 2020-4-23 13:44:43

失文 发表于 2020-4-23 13:33
大佬,函数不是这么运行的吗:
for 第一次循环 → fs.append(f) → 调用fs,return i * i,→ fs末尾添 ...

打印的是i,f返回的是i*i,下次问之前思考一下

永恒的蓝色梦想 发表于 2020-4-23 13:53:27

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

f3 = count() 不可能报错

jkluoling1992 发表于 2020-4-23 13:55:17

本帖最后由 jkluoling1992 于 2020-4-23 13:57 编辑

永恒的蓝色梦想 发表于 2020-4-23 13:53
f3 = count() 不可能报错

他说的是这种情况下,f3()会报错,单纯的赋值,f3就是一个list,不会错

永恒的蓝色梦想 发表于 2020-4-23 13:57:22

jkluoling1992 发表于 2020-4-23 13:55
他说的是这种情况下,f3()会报错

哦,明白了
页: [1] 2
查看完整版本: 求助这个套娃和函数、return的用法