鱼C论坛

 找回密码
 立即注册
查看: 3316|回复: 11

定义一个函数是必须要调用才会运行吗?为什么内嵌函数和闭包没有调用就可以运行?

[复制链接]
发表于 2019-9-14 20:43:06 | 显示全部楼层 |阅读模式

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

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

x
def func1(x):
        def func2(y):
                return x * y
        return func2

>>> func1(6)(5)
在这个函数里func2感觉没有被调用为什么也可以运行,相反的如果像下面调用它反而会出错?
def func1(x):
        def func2(y):
                return x * y
        func2()

       
>>> func1(5)
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    func1(5)
  File "<pyshell#11>", line 4, in func1
    func2()
TypeError: func2() missing 1 required positional argument: 'y'
>>> func1(5)(6)



求助 大神 !!!!!感谢!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-14 20:46:24 | 显示全部楼层
因为 fun1 返回 fun2,所以 fun1(6) 实际上就是 fun2。也可以这样:
  1. def func1(x):
  2.         def func2(y):
  3.                 return x * y
  4.         func2(5)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-14 20:48:54 | 显示全部楼层
闭包是可以从外面“调用”内部函数的。
第一个程序:
(6)调用func1,(5)调用内部的func2
第二个程序是不可以从外部调用内部函数的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-14 21:17:18 | 显示全部楼层
zltzlt 发表于 2019-9-14 20:46
因为 fun1 返回 fun2,所以 fun1(6) 实际上就是 fun2。也可以这样:

>>> def func1(x):
        def func2(y):
                return x * y
        func2(5)

        
>>> func1(6)
>>>
这样好像调用不了 返回的是  none
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-14 21:25:22 | 显示全部楼层
冬雪雪冬 发表于 2019-9-14 20:48
闭包是可以从外面“调用”内部函数的。
第一个程序:
(6)调用func1,(5)调用内部的func2

>>> def fun1():
        print('123')
        def fun2():
                print('456')
        fun2()

       
>>> fun1()
123
456
>>>

好像这样的没有参数的就可以调用唉,其实我不明白的是单独定义一个函数,就是要调用它才可以运行是吗?那同理在函数里面的函数应该也需要调用才可以运行,还是说‘ return+函数名’ 就是调用内函数呢?是他们的原理不一样吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-14 21:29:11 | 显示全部楼层
return fun2() 或 fun2()都是调用函数,不一定需要有参数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-14 21:29:35 | 显示全部楼层
刘文亮1992 发表于 2019-9-14 21:17
>>> def func1(x):
        def func2(y):
                return x * y

搞错了,应该是
  1. def func1(x):
  2.         def func2(y):
  3.                 return x * y
  4.         return func2(5)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-14 21:31:52 | 显示全部楼层
刘文亮1992 发表于 2019-9-14 21:25
>>> def fun1():
        print('123')
        def fun2():

fun1() ---> print('123') ---> def fun2() ---> fun2() ---> print('456')

如果加上了 return,则返回 fun2 的返回值(在这里是 None):
  1. def fun1():
  2.         print('123')
  3.         def fun2():
  4.                 print('456')
  5.         return fun2()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-14 21:48:06 | 显示全部楼层
zltzlt 发表于 2019-9-14 21:29
搞错了,应该是

可以运行哎,可是为什么要加return呢 一般调用函数不是就函数名+参数就好了吗?
是不是这种闭包函数不太一样?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-14 22:06:16 | 显示全部楼层
zltzlt 发表于 2019-9-14 21:31
fun1() ---> print('123') ---> def fun2() ---> fun2() ---> print('456')

如果加上了 return,则返 ...

我有一个发现
>>> def fun1():
        print('123')
        def fun2():
                print('456')
        return fun2

>>> fun1()
123
<function fun1.<locals>.fun2 at 0x00000248B4D7BEA0>
>>> type(fun1)
<class 'function'>
>>> fun1()()
123
456
我把return fun2()改为return fun2   这样就需要输入  fun1()(),才可以打印出123  456
只输入fun1()就会打印123 和<function fun1.<locals>.fun2 at 0x00000248B4D7BEA0>


你看下面这个,就是return后面只能跟函数名不能带()唉
def func1(x):
        def func2(y):
                return x * y
        return func2

>>> func1(5)(6)
30
>>> def func1(x):
        def func2(y):
                return x * y
        return func2()

>>> func1(5)(6)
Traceback (most recent call last):
  File "<pyshell#97>", line 1, in <module>
    func1(5)(6)
  File "<pyshell#96>", line 4, in func1
    return func2()
TypeError: func2() missing 1 required positional argument: 'y'
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-15 10:47:50 | 显示全部楼层
  1. def func1(x):
  2.          def func2(y):
  3.                  return x * y
  4.          func2()
复制代码
不传参数,不出错就怪了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-15 11:02:20 | 显示全部楼层
在你写的第二个函数里,func2()没有任何参数,但是func2()在定义的时候申明了要带一个参数,所以会报错。
内嵌函数也是要被调用的。return func2就是以返回函数类的形式来调用这个函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 08:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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