• 内置函数, 递归, 二分法


    一. lambda()

    a = lambda n: n ** 2

    a = lambda x, y: (x, y)

    a = lambda x, y: x, y            这个需要两个变量名来接收, 把y赋值给第二个变量名

    fn = lambda *args: max(args)

    lambda有返回值

    二. sorted()

    sorted(iterable, key, reverse)

    lst = sorted(lis, key = lambda el: el[:2], reverse = True)

    lst = sorted(lis, key = func, reverse = True)            func不加括号

    sorted函数会把lis的每一个元素交给key, 然后计算出这个元素的权重, 整个函数按权重进行排序, sorted有返回值

    三. filter()

    filter(function, iteraable)

    f = filter(lambda el: int(el[0]) < 5, lst)

    print(list(f))

    filter函数返回True的都会保留, False都会去除

    获取的返回值是一个迭代器

    m = map(func1, map(func2, map(func3, lst)))           # 分而治之

    m = map(lambda x, y, z: x + y + z, [1,2,3,4,5,6], [1,2,3,4,5], [1,2,3,4])     # 返回的迭代器的元素个数取最短的那个列表的个数

    四. map()

    map(function, iterable)

    把可迭代对象中的每一个元素交给前面的函数进行执行, 返回值就是map的处理结果

    m = map(lambda el: el ** 2, lst)

    print(list(m))

    返回的也是迭代器

    五. repr()

    print(repr('你好'))        # '你好'         程序中内部存储的内容, 是给程序员看的

    print('你好')       # 你好          给用户看的

    print(r'\你好')       # \你好          原样输出

     

    六. 递归

    递归深度默认是1000, 可以改变, 但实际只能到998左右, 看机器好坏, 到了深度会报错

    遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名
    import os
    def func(filepath, n): # d:/sylar/
        # 1,打开这个文件夹
        files = os.listdir(filepath)
        # 2. 拿到每一个文件名
        for file in files:  # 文件名
            # 3. 获取到路径
            f_d = os.path.join(filepath, file) # d:/sylar/文件名/
            # 4. 判断是否是文件夹
            if os.path.isdir(f_d):
                # 5. 如果是文件夹. 继续再来一遍
                print("	"*n, file,":") # 打印文件名
                func(f_d, n + 1)
            else:   #  不是文件夹. 普通文件
                print("	"*n, file)
    
    func("d:/sylar",0)
    

      

    七. 二分法

    核心: 切头去尾取中间, 一次砍一半

    两种算法: 常规循环, 递归循环

    # 递归来完成二分法
    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]
    def func(n, left, right):
        if left <= right: # 边界
            print("哈哈")
            mid = (left + right)//2
            if n > lst[mid]:
                left = mid + 1
                return func(n, left, right) # 递归  递归的入口
            elif n < lst[mid]:
                right = mid - 1
                # 深坑. 函数的返回值返回给调用者
                return func(n, left, right)    # 递归
            elif n == lst[mid]:
                print("找到了")
                return mid
                # return  # 通过return返回. 终止递归
        else:
            print("没有这个数") # 递归的出口
            return -1 # 1, 索引+ 2, 什么都不返回, None
    # 找66, 左边界:0,  右边界是:len(lst) - 1
    ret = func(66, 0, len(lst) - 1)
    print(ret) # 不是None
    

      

    时间复杂度, 空间复杂度最低的查找方法

    lst1 = [5,6,7,8]
    lst2 = [0,0,0,0,0,1,1,1,1]     # 个数是lst1中最大的元素加1
    for el in lst1:           
        lst2[el] = 1
    
    print(lst2[5])
    

      

      

  • 相关阅读:
    JAVA应用apache httpclient探测http服务
    C#中字符串与byte[]相互转换
    C#中位、字节等知识
    #JAVA操作LDAP
    C#正则表达式判断字符串是否是金钱
    【IDEA】使用Maven骨架创建JavaWeb项目
    【IDEA】回退操作记录
    【SpringMVC】IDEA 不识别webapp的解决办法
    【Layui】16 表单元素 Form
    【Layui】15 日期时间选择器 Laydate
  • 原文地址:https://www.cnblogs.com/NachoLau/p/9483300.html
Copyright © 2020-2023  润新知