函数调用问题

函数调用问题

问题1,    为什么可以通过通过return来调用wapper函数

def log(func):
   def wapper():
       print(func())
   return wapper

问题2:

为什么通过return wapper,就可以输出wapper函数里面的print(),调用wapper函数返回的是什么,为什么return能吧函数内的print展现出来,这我不知道怎么去描述这个问题,就是绕不过来这个弯,也不知道怎么去百度

问题3:

装饰器传参,func应该传给def log(name=None)这里,可是log('1')又带了参数,互相不就冲突了吗?

为什么log里面的函数可以接收func 比如:`decorator(func)`,

def log(name=None):
   def decorator(func):
       def wapper():
           print("{} -> {}".format(name,func.__name__))
           func()
       return wapper
   return decorator

@log('1')
def run():
   print('hello word')

run()




正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕笑蓉 2020-04-09 20:03:28

同学,你好。

问题1:return返回数据,并退出程序,return wapper语句没有调用wapper函数,只是返回了wapper对象。

问题2:同学可能还是在疑惑第一个问题,return wapper语句没有调用wapper函数,只是返回了wapper对象,因此同学第二个问题是不成立的,老师对于第二个问题给了如下回答:通过return wapper,不能执行wapper函数里面的print(),因为return wapper并没有调用程序;调用wapper函数没有返回数据,里面执行了一个print(func())输出语句,return 和执行print没有关系,执行print是因为调用了wapper函数,且不是return进行调用的;

问题3:程序编译如下代码

@log('1')
def run():
    print('hello word')

过程如下:log('1')调用得到decorator,因此得到@decorator,@decorator相当于run = decorator(run),得到run = wapper,因此上面的代码执行完成后run就相当于wapper函数,调用run()就相当于调用wapper(),因此结果如图:

http://img1.sycdn.imooc.com//climg/5e8f0ec60954f65f01780077.jpg

这一块的内容比较难理解,同学可多花时间看视频理解。

如果解决了你的疑惑,请采纳,祝学习愉快~ 

  • 提问者 qq_浮沉_34 #1
    可是没有调用怎么会执行wapper函数呢
    2020-04-09 21:02:57
  • 好帮手慕元宝 回复 提问者 qq_浮沉_34 #2
    同学你好: 首先python执行的顺序是从上到下的。我门就顺着这个顺序去捋一下 先执行log 往下就会执行decorator,因为decorator在log里面,然后在执行wrapper2因为wrapper2在decorator里。 下面return wapper只是返回wapper这个对象
    2020-04-10 20:05:29
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师