Python返回函数不理解之处 5C

看代码:

def fun1(f):
    def fun2(*args):
        f(*args)
    return fun2

@fun1
def add(a,b):
    return a+b

这个代码意思我已经理解了
我只是不理解为什么要这么写.

  • 第一个不理解在fun1中,为什么函数内部还有一个函数,这样做有什么优势? 我要调用fun2可以直接就在需要的地方直接调用fun2了,这个写法我觉得有点莫名其妙. > 就像这段代码只为了得到一个函数,而后又去调用这个函数,我需要的时候直接调用sum函数不就好了..外面这个有什么必要?:
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
>>> f()
25
  • 第二个不理解,@fun1这个写法有什么必要性吗?在我看来有点多余,反而让代码更加不易于阅读. > 求大神指点一下,我可是学Python这个玩意遇到了很多莫名其妙的问题,以后整理一下,还有很多很多不理解的地方..

3个回答

这个东西叫做装饰器,装饰器的基本逻辑是闭包,不是为了调用内函数而这样写,实际上是为了在不改变原函数逻辑功能的情况下添加新功能
就基础而言,最常用来举例的是计算函数的运行时间,在内函数的前后可以添加打印时间、计算花费时间的代码
那想要计算时间的时候直接调用装饰器就可以了,不想计算的时候注释掉这一行,这样会更简便

def fun1(f):
    #可添加其他功能代码
    def fun2(*args):
        f(*args)
    #可添加其他功能代码
    return fun2

@fun1
def add(a,b):
    return a+b

你就不知道他有啥用.
作用:
import requests
from time import sleep

def retry(cishu = 1):
'''
闭包我知道的最多三层,最外层传递装饰器参数(这一层可以不写)
中间层传递被装饰器装饰的函数,这里相当于get()
内层传递被装饰器装饰函数的参数,这里是get()的参数a

装饰器作用:限制request重复请求的次数
'''
def outer(func):
    def inner(x):
        print(f'inner获取到了get参数:{x}')
        num = 1
        for i in range(cishu):
            try:
                func(x)
                break
            except:
                print(f'第{num}次尝试失败')
                sleep(1)
                num += 1
    return inner
return outer

@retry(cishu=3)
def get(a):
print(f'get的参数是{a}')
# 网址错误,所以获取不到数据,会报错
print(requests.get('https://baiduuu.com'))

get(333)

图片说明装饰器的作用之一就是在不改变原来代码的基础上增加新的功能,比如你写了个登陆的功能。没有验证码直接账号密码登陆,现在想添加验证码 此时就可以使用装饰器进行装饰实现这个功能

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问