人工智能系列-Python系列(八)装饰器 = 高阶函数+函数嵌套+闭包

转载请注明预见才能遇见的博客:http://my.csdn.net/

原文地址:https://blog.csdn.net/pcaxb/article/details/91994655

人工智能系列-Python系列(八)装饰器 = 高阶函数+函数嵌套+闭包

目录

人工智能系列-Python系列(八)装饰器 = 高阶函数+函数嵌套+闭包

1.装饰器初探

2.高阶函数

3.函数的嵌套

4.闭包

 5.函数闭包扩展

6.装饰器 + @ 语法糖

1)计算函数的运行时间的装饰器

 2)装饰器加上返回值

3)装饰器加上参数

4)给装饰器加参数

6.解压序列

1)同时定义多个变量

2)获取列表的第一个和最后一个元素

 3)2个值交换


1.装饰器初探

# 器即函数
# 装饰即修饰,意指为其他函数添加新功能
# 装饰器定义:本质就是函数,功能是为其他函数添加新功能
# 装饰器:高阶函数+函数嵌套+闭包

# 原则:
# 不修改被装饰函数的源代码(开放封闭原则)
# 为被装饰函数添加新功能后,不修改被修饰函数的调用方式
# import  time
# # 获取当前时间
# print(time.time())

2.高阶函数

# 高阶函数定义:
# 1).函数接收的参数是一个函数名
# 2).函数的返回值是一个函数名
# 3).满足上述条件任意一个,都可称之为高阶函数
def test01():
    time.sleep(0.5)
    print(111)


def test02(func):
    start_time = time.time()
    func()
    end_time = time.time()
    print("函数的运行时间:%s" % (end_time - start_time))
    return func


test01 = test02(test01)

test01()


# test01被调用了2次,所以简单的高阶函数是实现不了装饰器的

3.函数的嵌套

 函数中调用函数不是函数的嵌套,函数中定义另外一个函数才是函数的嵌套
def father(name):
    print('from father %s' % name)

    def son():
        print('from son')

        def grandson():
            print('from grandson')

        grandson()

    # locals 当前层的局部变量
    print(111111111111, locals(), 22222222222222222)
    son()


father('林海峰')

4.闭包

# 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
def father(name):
    def son():
        # name='alex'
        print('我爸爸是 [%s]' % name)

        def grandson():
            # name='wupeiqi'
            print('我爷爷是 [%s]' % name)

        grandson()

    son()


father('林海峰')

 5.函数闭包扩展

# 参考资料:https://www.cnblogs.com/Lin-Yi/p/7305364.html

6.装饰器 + @ 语法糖

# 组成闭包: 1) 2) 3)
# 函数嵌套:decr中嵌套decr2
# 高阶函数:函数的返回值是一个函数名
def decr(func):
    def decr2():  # 1)在一个外函数中定义了一个内函数
        func()  # 2)内函数里运用了外函数的临时变量

    return decr2  # 3)并且外函数的返回值是内函数的引用

1)计算函数的运行时间的装饰器

def timmer_opr(func):
    def timmer_in(**kwargs):
        start_time = time.time()
        res = func(**kwargs)
        end_time = time.time()
        print("函数的运行时间:%s" % (end_time - start_time))
        return res

    return timmer_in

 2)装饰器加上返回值

@timmer_opr
def test04(**kwargs):
    time.sleep(1)
    print("test04的运行结果")
    return "这里是test04的返回值name=%s age=%s height=%s" % (kwargs['name'], 
kwargs['age'], kwargs.get('height') or '')


# @语法糖
# test04 = timmer_opr(test04) # 这里可以替换成@timmer_opr

3)装饰器加上参数

res1 = test04(**{'name': 'pca', 'age': 18})
print(res1)

res2 = test04(**{'name': 'pca', 'age': 18, 'height': 19})
print(res2)

4)给装饰器加参数

def timmer_opr_out(params):
    def timmer_opr5(func):
        def timmer_in(**kwargs):
            start_time = time.time()
            res = func(**kwargs)
            end_time = time.time()
            print("test05函数的运行时间:%s %s" % ((end_time - start_time), params))
            return res

        return timmer_in
    return timmer_opr5


@timmer_opr_out("这里是装饰器加参数")
def test05():
    time.sleep(0.1)
    print("test05的运行结果")


res3 = test05()
print(res3)

6.解压序列

1)同时定义多个变量

a, b, c = [1, 2, 4]
print(a, b, c)  # 1 2 4

2)获取列表的第一个和最后一个元素

ages = [1, 2, 3, 4, 5, 6, 7]
m, *_, n = ages  # m是第一个值,n是最后一个值,_是中间的值,这里不一定要写_,可以是随便的变量
print(m, n, _)  # 1, 7  [2, 3, 4, 5, 6]

 3)2个值交换

x, y = 1, 2
x, y = y, x
print(x, y)  # 2 1
参考资料:https://www.cnblogs.com/linhaifeng/articles/6140395.html

人工智能系列-Python系列(八)装饰器 = 高阶函数+函数嵌套+闭包

博客地址:https://blog.csdn.net/pcaxb/article/details/91994655

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值