• Python基础知识5-递归函数、生成器


    函数执行流程*

    递归Recursion

    递归的性能

     递归总结

    递归练习:

    #1
    def fac(n):
        if n==1:
            return n
        return n*fac(n-1)
    
    def fac1(n, f=1):
        if n == 1:
            return f
        f *= n
        return fac1(n - 1, f)
    #2
    def revert1(n,lst=[]):
        lst.append(n%10)#可以考虑用divmod()函数
        return lst if n//10==0 else revert1(n//10,lst)
    
    def revert1(num,tarhet=[]):
        if str(num):
            target.append(num[len(num)-1])
            revert1(num[:len(num)-1])
        return target
    #3
    ef peach1(days=10):
        if days==1:
            return 1
        return (peach1(days-1)+1)*2
    
    def peach2(days=1):
        if days==10:
            return 1
        return (peach2(days+1)+1)*2

    匿名函数

    生成器***

     

    生成器应用

    yield from

     练习:

     

    #1.#利用isinstance判断是否是字典,是的继续递归,否则合并key,赋值新字典
    source = {'a': {'b': 1, 'c': 2}, 'd': {'e': 3, 'f': {'g': 4}}}
    # # target = {'a.b': 1, 'd.f.g': 4, 'd.e': 3, 'a.c': 2}
    target={}
    def func(src,targetkey=''):
        if not isinstance(src,dict):
            return None
        for k,v in src.items():
            if isinstance(v,dict):
                func(v,targetkey=targetkey+k+'.')
            else:
                target[targetkey+k]=v


    #参考:https://www.cnblogs.com/bolenzhang/p/8366365.html
    alphabet=b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"  #参照Base64编码表
    def base64(src):
        ret = bytearray()
        length = len(src)
        # r记录补0的个数
        r = 0
        for offset in range(0, length,3):
            if offset + 3 <= length:
                triple = src[offset:offset+3]
            else:
                triple = src[offset:]
                r = 3 - len(triple)
                triple = triple + 'x00'*r
    
            print(triple.encode(),r)
         #int.from_bytes函数参考:https://blog.csdn.net/Clovera/article/details/79293108
            b = int.from_bytes(triple.encode(), 'big')#bytes类型的变量x,转化为十进制整数
            print(b)
         
        
        #01100001
    for i in range(18, -1, -6): if i == 18: index = b >> i else: index = b >>i & 0x3F  #十六进制3f等于十进制63,二进制表示为 0011 1111,因为我们是按6位取 ret.append(alphabet[index]) for i in range(1,r+1): ret[-i] = 0x3D return ret print(base64('abcd'))

    #ASCII码与字符相互转换
    ord()函数:它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值。
    chr()函数:在 range(256)内的(就是0~255)整数作参数,返回当前整数对应的ASCII字符。

    #3#动态规划方法!
    str1 = 'ahcdef'
    str2 = 'hcadef'
    def maxSubstring(str1,str2):
        if not str1 or not str2:
            return None
        length1 = len(str1)
        length2 = len(str2)
        #建立辅助二维数组
        arr = [[0 for i in range(length1+1)]for j in range(length2+1)]
        p = 0#用于记录最大长度的下标
        maxlength = 0#记录最大的子串长度
    
        for i in range(length1):
            for j in range(length2):
                if str1[i] == str2[j]:
                    arr[i+1][j+1] = arr[i][j] + 1
                    if arr[i+1][j+1]>maxlength:
                        maxlength = arr[i+1][j+1]
                        p = i+1
        return str1[p-maxlength:p],maxlength
    做一枚奔跑的老少年!
  • 相关阅读:
    引用同一解决方案里的其他项目
    使用OpenXml打开word文档中嵌入的另一个文档
    把最近踩的坑总结一下(2)——二级MSoffice题库软件自动更新版本V2.0
    把最近踩的坑总结一下(1)——二级MSoffice题库软件自动更新版本V2.0
    脑残系列(1)
    前端Crypto.JS加密解密
    在构造函数时 new做的四件事情
    js创建对象的四种方式
    VS-Code背景图片
    单行、多行文本溢出以省略号显示
  • 原文地址:https://www.cnblogs.com/xiaoshayu520ly/p/10641214.html
Copyright © 2020-2023  润新知