python装饰器与递归

python装饰器与递归,第1张

概述装饰器 开放封闭原则: 装饰器:装饰,装修,房子就可以住,如果装修,不影响你住,而且体验更加,让你生活中增加了很多功能:洗澡,看电视,沙发。器:工具。开放封闭原则:开放:对代码的拓展开放的, 更新地图,加新q,等等。封闭:对源码的修改是封闭的。闪躲用q。就是一个功能,一个函数。 别人赤手空拳打你,用机q扫你,扔雷.....这个功能不会改变。装饰器:完全遵循开放封闭原则。装饰器: 在不 装饰器

开放封闭原则:

装饰器:装饰,装修,房子就可以住,如果装修,不影响你住,而且体验更加,让你生活中增加了很多功能:洗澡,看电视,沙发。器:工具。开放封闭原则:开放:对代码的拓展开放的, 更新地图,加新q,等等。封闭:对源码的修改是封闭的。闪躲用q。就是一个功能,一个函数。 别人赤手空拳打你,用机q扫你,扔雷.....这个功能不会改变。装饰器:完全遵循开放封闭原则。装饰器: 在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。装饰器就是一个函数。

推导见代码

标准版的装饰器;
标准版的装饰器;def wrapper(f):    f=zz #第2步    def inner(*args,**kwargs):#第5步        '''添加额外的功能:执行被装饰函数之前的 *** 作'''#第6步        ret = f(*args,**kwargs)#第7步        ''''添加额外的功能:执行被装饰函数之后的 *** 作'''#第8步        return ret    return inner #第3步    @weapper# zz=weapper(zz) 第一步def zz()#第4步 此时zz 为 inner    pass
带参数的装饰器
def wrapper_out(n,*args,sex="男")    def wrapper(f):        def inner(*args,**kwargs):            ret = f(*args,**kwargs)  # 这边执行的是func1()            return ret        return inner    return wrapperdef func1():    print("in func1")func = wrapper_out(1)  # wrapper函数名ly = fun(func1)  # inner = wrapper(func1)ly()  # inner()
def wrapper_out(n):    def wrapper(f):        def inner(*args,**kwargs):            if n == "qq":                username = input("请输入用户名:").strip()                password = input("请输入密码:").strip()                with open("qq",enCoding="tuf-8") as f1:                    for line in f1:                        user,pwd = line.strip().split("|")                        if username == user and password == pwd:                            print("登陆成功")                            ret = f(*args,**kwargs)                            return ret                        return False                        elif n == "yiktok":                username = input("请输入用户名:").strip()                password = input("请输入密码:").strip()                with open("qq",**kwargs)                            return ret                        return False def wrapper_out(n):    def wrapper(f):        def inner(*args,**kwargs):                                 username = input("请输入用户名:").strip()            password = input("请输入密码:").strip()            with open(n,**kwargs)                            return ret                        return False        return inner    return wrapper@ wrapper_out("qq")def qq():    print("成功访问qq")qq()# 看到带参数的装饰器分两步执行:@ wrapper_out("腾讯")    # 1.执行wrapper_out("腾讯"),把相应的参数传给n,并且得到返回值wrapper函数名    # 2.将@与wrapper结合,得到我们之前熟悉的标准版装饰器,按照装饰器的执行流程执行    @ wrapper_out("qq")def qq():    print("成功访问qq")    @ wrapper_out("tiktok")def tiktok():    print("成功访问抖音")    qq()tiktok()# 开发思路:增强耦合性
多个装饰器装饰一个函数
def wrapper1(func1):  # func1 = f原函数    def inner1():        print('wrapper1,before func')  # 2        func1()        print('wrapper1,after func')  # 4    return inner1def wrapper2(func2):  # func2 == inner1    def inner2():        print('wrapper2,before func')  # 1        func2()  # inner1        print('wrapper2,after func')  # 5    return inner2@wrapper2  # f = wrapper2(f) 里面的f == inner1  外面的f == inner2@wrapper1  # f = wrapper1(f) 里面的f == func1   外面的f == inner1  先看下面def f():    print('in f')  # 3f()  # inner2()  看外层f
递归
# 官网规定:默认递归的最大深度1000次。# 如果你递归超过100次还没有解决这个问题,那么执意使用递归,效率很低。  递归比起循环来说更占用内存# 修改递归的最大深度    # import sys    # sys.setrecursionlimit(1000000000)# 递归就是自己调自己# 递归函数是怎么停下来的?递归3次结束整个函数# 一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件# --注意---并不是函数中有return,return的结果就一定能够在调用函数的外层接收到  谁调用最后一个函数返回给谁# 加上return tet# def func(count):#     count += 1#     print(count)#     if count == 5 : return 5#这个5其实是返回给下面的func()#     ret = func(count)#要想把这个5返回给最外层 所以逐层returt#     return ret# 精简版def func(count):    count += 1#这里是代码思路    if count == 5 :        return 5#这个5其实是返回给下面的func()    return  func(count)#精简了上面的过程# 1.计算阶乘 100! = 100*99*98*97*96....*1def fin(n):    if n ==1 :        return n    else:        return n*fin(n-1)ret = fin(7)print(ret)l2 = [1,3,5,['太白','元宝',34,[33,55,[11,33]]],[77,88],66]# # 错误方法# for i in l2:#     if type(i) == List:#         for j in i:#             print(j)#     else:#         print(i)# 递归# def func(aList):#     for i in aList:#         if type(i) == List:#             func(i)  # func(['太白',34])#         else:#             print(i)# func(l2)# 5.三级菜单 可能是n级# 2.os模块:查看一个文件夹下的所有文件,这个文件夹下面还有文件夹,不能用walk# 3.os模块:计算一个文件夹下所有文件的大小.这个文件夹下面还有文件夹,不能用walk# 4.计算斐波那契数列    # 找第100个数# 1.计算阶乘 100! = 100*99*98*97*96....*1
总结

以上是内存溢出为你收集整理的python装饰器与递归全部内容,希望文章能够帮你解决python装饰器与递归所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1191784.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存