python装饰器与递归

落花浮王杯 提交于 2019-11-27 21:13:48

装饰器

开放封闭原则:

装饰器:装饰,装修,房子就可以住,如果装修,不影响你住,而且体验更加,让你生活中增加了很多功能:洗澡,看电视,沙发。
器:工具。
开放封闭原则:
开放:对代码的拓展开放的, 更新地图,加新枪,等等。
封闭:对源码的修改是封闭的。闪躲用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 wrapper

def 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",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
 

def wrapper_out(n):
    def wrapper(f):
        def inner(*args,**kwargs):                     
            username = input("请输入用户名:").strip()
            password = input("请输入密码:").strip()
            with open(n,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
        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 inner1

def 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')  # 3

f()  # 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....*1
def 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!