鱼C论坛

 找回密码
 立即注册
查看: 849|回复: 10

[已解决]内嵌函数返回值fun和fun()有什么具体区别呢

[复制链接]
发表于 2018-8-14 14:42:31 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 urfxssqaq 于 2018-8-14 14:44 编辑

def funx(x):
    def funy(y):
        return x*y
    return funy
如果这么写的话,调用funx(5)(8)会返回40
但是如果
def funx(x):
    def funy(y):
        return x*y
    return funy()
调用funx(5)(8)会返回报错TypeError: funy() missing 1 required positional argument: 'y',这是为什么呢?


但是假如:
def fun1():
    x=5
    def fun2():
        return x*x
    return fun2()
这时候调用函数 fun1(),则会返回25,
如果:
def fun1():
    x=5
    def fun2():
        return x*x
    return fun2
这时候调用fun1()。则会返回<function fun1.<locals>.fun2 at 0x039688A0>,这是为什么呢?



上面2段如果一起看的话,第一个函数必须return funy,不能加括号,而第二个函数return fun2(),又必须加括号,这是为什么呢。。。。
看百度看了一头雾水
最佳答案
2018-8-14 15:04:42
urfxssqaq 发表于 2018-8-14 15:02
感谢大哥,也就是说,我如果要调用一个函数,那么return fun,如果我需要知道一个函数返回值,那么return ...


返回的函数对象(比如return fun)还可以调用
比如f返回fun函数对象,那么我可以这样用(假设fun没有参数)
  1. f()()
复制代码

其中f()返回一个函数,第二个括号调用返回的函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-14 14:44:37 | 显示全部楼层
发错了??要支付才能看~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-14 14:45:42 | 显示全部楼层
claws0n 发表于 2018-8-14 14:44
发错了??要支付才能看~~

是的,我取消了。。刚点错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 14:46:39 | 显示全部楼层
  1. def funx(x):
  2.     def funy(y):
  3.         return x*y
  4.     return funy
复制代码

返回一个可调用对象
  1. def funx(x):
  2.     def funy(y):
  3.         return x*y
  4.     return funy()
复制代码

返回funy()返回的结果,这里funy()少了参数->报错
  1. def fun1():
  2.     x=5
  3.     def fun2():
  4.         return x*x
  5.     return fun2()
复制代码

返回一个可调用对象,返回的东西时它的内存地址
第一个函数必须return funy是因为你在函数外面调用了它

点评

可调用对象一般是函数,有时候也是加了__call__方法的类  发表于 2018-8-14 14:52
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-14 14:51:51 | 显示全部楼层
funy(y) 是需要参数的,如果 return funy() 会认为输入不完全~~

情况二:
fun1(), fun2() 不需要参数,但是需要实例化

只有习题才这样写,一般不会写这种无聊的内嵌函数。要么一个函数,两个参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 14:56:30 | 显示全部楼层
本帖最后由 塔利班 于 2018-8-14 14:57 编辑
  1. def funx(x):
  2.     def funy(y):
  3.         return x*y
  4.     return funy()
复制代码


return funy()返回的形式有误,因为没有传入y参数的接口,你强行传入8也不对,不过函数本身已经有问题了


  1. def fun1():
  2.     x=5
  3.     def fun2():
  4.         return x*x
  5.     return fun2()
复制代码


这个又可以就不用说了吧,函数fun2本身不用传参

最后fun2和fun2()的区别就是一个是函数对象(指向内存中的fun2函数),一个是函数运行的结果(此函数可不用传参)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-14 15:02:37 | 显示全部楼层
无符号整形 发表于 2018-8-14 14:46
返回一个可调用对象

返回funy()返回的结果,这里funy()少了参数->报错

感谢大哥,也就是说,我如果要调用一个函数,那么return fun,如果我需要知道一个函数返回值,那么return fun()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 15:04:42 | 显示全部楼层    本楼为最佳答案   
urfxssqaq 发表于 2018-8-14 15:02
感谢大哥,也就是说,我如果要调用一个函数,那么return fun,如果我需要知道一个函数返回值,那么return ...


返回的函数对象(比如return fun)还可以调用
比如f返回fun函数对象,那么我可以这样用(假设fun没有参数)
  1. f()()
复制代码

其中f()返回一个函数,第二个括号调用返回的函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-14 15:10:27 | 显示全部楼层
塔利班 发表于 2018-8-14 14:56
return funy()返回的形式有误,因为没有传入y参数的接口,你强行传入8也不对,不过函数本身已经有问题 ...

那么第一个如果我改成:
    def funx(x):
        def funy(y):
            return x*y
        return funy(8)
就可以了呗
第二个我是需要知道fun2的返回值,所以return fun2()。 就像我在全局调用一个函数,也必须fun()。如果这个函数有返回值,那么就会得到返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 15:15:07 | 显示全部楼层
是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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