12-函数进阶-递归.闭包.装饰器

程序员开发潜规则

代码拓展 – > 开放 --> 可以添加功能

源码修改 – > 封闭 – > 不能修改源码

如果修改了源码,程序报错就会有很多的bug,很难修复,稳定性不好

装饰器:在程序中设计到对一个函数/程序进行功能的添加修改但是需要在不修改源码/参数的前提下实现增加功能

装饰器的作用:就是在唉不改变函数源代码/参数的前提下,给函数添加功能 --> 可以给多个函数添加功能

初识闭包函数

主要设计知识点:

​ 1.函数对象 --> 把函数当做一个普通数据使用,用函数作为参数/返回值

​ 2.嵌套函数 – > 函数里还有一个函数

​ 3.作用域 – > 包

闭:封闭,指的是一个嵌套函数里的内层函数

包:用内层函数来操作外层函数得到的数据

通过简介的方式,给函数实现具体的传参或者具体操作

闭包格式:

​ def 外函数():

​ def 内涵数():

​ 代码块

​ return 内函数

# def get_sum(a,b):
#     def add(c,d): # 用内层函数处理了外层函数接收的数据
#         return c+d # 计算,把得到的结果返回出去
#     return add(a,b) # 老板相当于是把要求分配给小弟,然后拿着小弟做好的结果去邀功  这里是把员工的结果返回了出去
# print(get_sum(123,321))

# 王元姬
'''
def 化妆房(人):
    def 化妆():
        人() # 有人了
        涂口红
        打粉底
    return 化妆 # 把化好妆的人返回了出去
韩刘 = 化妆房(韩刘)  # 让韩刘化妆
韩刘() # 现在调用的就是一个已经化妆过的韩刘

这里面的人 --> 是一个函数
'''


def 加料(食材):
    def 加蛋():
        食材() # 把你的食材拿了过来
        print('我加了个蛋') # 然后加了个蛋
    return 加蛋 # 把加过蛋之后的食材返回出去

# 肠粉 = 加料(肠粉) # 现在的肠粉就是一条加了料后的肠粉
# 肠粉()
@加料
def 肠粉():
    print('我是一条肠粉')

肠粉()
# 我有一个函数,我想知道这个函数运行了多长时间
'''
def fun():
    print('你好.我是一个函数 版本1')
    time.sleep()
'''

import time  # 准备作案工具,准备时间模块

'''版本1.把判断时间的代码写到了函数体内.  不推荐: 修改了源代码
def fun():
    start_time = time.time()  # 开始时间
    print('你好.我是一个函数 版本1')
    time.sleep(1)  # 让程序休眠1秒再运行
    end_time = time.time()
    print(f'运行时间为{int(end_time - start_time)}秒')
fun()
'''


'''版本2  不够灵活,如果有很多函数,判断时间的代码就得重复的去写
def fun():
    print('你好.我是一个函数 版本2')
    time.sleep(2)


start_time = time.time()
fun()
end_time = time.time()
print(f'运行时间为{int(end_time - start_time)}秒')
'''


'''版本3 已经开始初步有装饰器的思想了,但是修改了调用方式,调用的不是原来的函数了,而是一个新的函数
def fun3():
    print('你好.我是一个函数 版本3')
    time.sleep(3)

# 要不要接受参数???  要. 那个函数要计算运行时间,就把函数作为参数放进来
def get_time(f): # f是个形参,你要添加功能的函数,就传进来. 取代f
    start_time = time.time()
    f() # 调用传进来的函数
    end_time = time.time()
    print(f'运行时间为{int(end_time - start_time)}秒')

get_time(fun3) 
'''
def get_time(f):
    def calc_time(): # 内层函数才是真正实现功能的函数
        start_time = time.time()
        f()  # 调用传进来的函数
        end_time = time.time()
        print(f'运行时间为{int(end_time - start_time)}秒')
    return calc_time
'''方案4'''
@get_time  # 这个就是语法糖.意思就是给下面的函数添加这个装饰器
def fun4():
    print('你好.我是一个函数 版本4')
    time.sleep(1)

# fun4 = get_time(fun4) # 把加好功能后的函数,重新赋值给fun4
fun4()

# 这个函数相当于是煮菜. 我们要做的是把 食材(要加功能的函数) 以及调料(加的功能) 放到一起包着(内层函数)
# 最后返回出去的calc_time  就是一个已经添加好功能了的函数. 这个函数可以用来重新赋值
# 函数get_time的返回值 为一个添加好功能后的函数
# 鸡肉 盐,黑胡椒 --> 用一层锡纸包住 --> 确保入味

初识装饰器

主要涉及知识点:

​ 1.闭包

​ 2.函数对象

作用:在不修改函数源代码/调用方式的情况下,给函数添加功能

装饰器的使用方式:

​ 1.函数名 = 装饰器(函数名) # 把加好功能的函数冲洗赋值

​ 2.语法糖

​ @装饰器 # 快速给下面的这个函数添加装饰器的功能

​ def 函数名():

print调试

以后我们其实基本不用print --> 以后我们主要做的是后端相关的东西/爬虫相关的
1.爬虫的东西不用print,直接发送请求/保存数据
2.写网站后台/服务器后台 --> 都是操作数据.输出,显示东西主要是前端做的
有时候一个项目,运行没报错但是有功能没实现.这时候就可以用print. 比如这个项目有500行.

在100,200,300,400,500行各写一个print.然后运行.

看看程序运行到了哪个print.哪些print没有输出,就证明没运行

如果输出了200,

那就是前200行代码都是顺利运行了,

但是后面的没有运行成功

总结

什么情况下使用装饰器

​ 一个功能可以很多函数都会用上(登录,验证码)

​ 这种情况下就可以把该功能写成装饰器

特性:在不修改源代码/调用方式的基础上,给函数添加功能

实现原理:

​ 1.在一个嵌套函数中,用外层函数来接受一个参数(要添加功能的函数)

​ 2.在内层函数中国调用(如果带参,需要有*args,**kwargs来接受+调用)这个函数,并写上要增加的功能

​ 3.外层函数,返回内层函数本身 – > 返回出去的就是(原来的函数+要加的功能)

复习

闭包:在一个嵌套函数中,用内层函数修改/操作外层函数的数据

装饰器:给一个函数间接的(不修改源代码/调用方式的情况下)增加功能

def drink_water(f): # f就是要加功能的函数
    def talk(*args,**kwargs): # 这里的参数是用来接受可能存在的f里的参数
        res = f(*args,**kwargs) # 调用原函数f  res相当于保存了原函数的返回值
        print('记得要多喝热水哦') # 要增加的功能
        return res # 一般用不上,功能是备份原来的函数返回值
    return talk # talk 已经增加好功能的函数

@drink_water
def fun(name):
    print(f'{name}晚上好')

fun('52期的大家')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_bbbfamous

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值