博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
12内置函数补充,递归以及二分法。
阅读量:5121 次
发布时间:2019-06-13

本文共 2230 字,大约阅读时间需要 7 分钟。

1、内置函数补充

  1、lambda 匿名函数

    lambda 参数:返回值

    函数名称统一叫lambda--这就是为什么叫匿名函数的原因

  2、sorted() 排序函数

    sorted(iterable, key, reverse)

    key:排序规则

    运行流程:把可迭代对象中每一个元素交给后面的key函数来执行,可到一个数字(权重),通过这个数字来进行排序

  3、filter() 过滤函数

    filter(function, iterable)

    把可迭代对象中的每一个元素交给前面的函数进行筛选,函数返回True或者False

  4、map() 映射函数

    map(function, itetable)

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

 

2、递归

  函数自己调用自己

  最大深度: python写的1000--可以自己去改(import sys sys.getrecursionlimit())

  原则:能用循环解决的问题,就不要用递归。

  例子:  

# 遍历文件夹,打印所有文件和普通文件的文件名import osdef fun(filepath, n):    #  1、拿到这个文件夹    files = os.listdir(filepath)    #  2、拿到每一个文件名    for file in files:  # 文件名        #  3、获取到路径        f_d = os.path.join(filepath, file)        #  4、判断是否是文件夹        if os.path.isdir(f_d):            #  5、如果是文件夹,再来一遍            print("\t"*n, file, ":")  # 打印文件名            fun(f_d, n+1)        else:            print("\t"*n, file)  # 打印文件名

 

3、二分法(与之对应的还有三分法)

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

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

# 使用二分法可以提高效率,前提条件:有序序列。lst = [22, 33, 44, 55, 66, 77, 88, 222, 444, 555, 777, 888, 999]n = 88left = 0right = len(lst) - 1while left < right:  # 边界,当右边比左边还小的时候退出循环(这里比较的是索引。当左边界不小于右边界,代表已经重合,即比较完毕)    mid = (left + right) // 2  # 必须是整除,索引没有小数    if lst[mid] > n:        right = mid - 1    if lst[mid] < n:        left = mid + 1    if lst[mid] == n:        print("找到了这个数")        breakelse:    print("没有找到这个数")# 自定义一个list,用递归来完成二分法,要求如果找到,返回对应的索引,没找到返回-1。lst = [22, 33, 44, 55, 66, 77, 88, 222, 444, 555, 777, 888, 999]def fun(n, left, right):    if left < right:        mid = (left+right)//2        if n > lst[mid]:            left = mid + 1            # 深坑。函数的返回值返回给调用者。如循环多次,最外层拿不到最里面一层的返回值,故每一次递归都要return            return fun(n, left, right)        if n < lst[mid]:            right = mid - 1            return fun(n, left, right)        if n == lst[mid]:            print('找到了')            return mid    else:        print("没有这个数")        return -1fet = fun(66, 0, len(lst)-1)print(fet)

 

# 重复查询的最优查询

lst = [6, 5, 7, 8]lst2 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]     # 准备一个足够多数据的数组(长度大于需要查询的数据的最大值)for i in lst:    # 对需要查数据的列表的每一项的值进行遍历(注意不是遍历索引)    lst2[i] = 1  # 在lst中查到的值换成lst2中对应的索引,修改为1。print(lst2)# 随后只需要判断lst2的索引是否为1即可。

 

转载于:https://www.cnblogs.com/cbslock/p/11149912.html

你可能感兴趣的文章
原型与原型链
查看>>
异常及处理
查看>>
测试开发之利器论战
查看>>
黑马程序员---java基础-Java类 继承&抽象&接口
查看>>
轻松精通awk数组企业问题案例
查看>>
第四十一篇 面向对象基础
查看>>
如何求F-闭包、候选码求解、范式判断及BCNF分解
查看>>
Hibernate第七篇【对象状态、一级缓存】
查看>>
day_5:Ajax数据爬取
查看>>
Spark异步job
查看>>
【NetXMS】工具介绍
查看>>
性能分析_linux服务器CPU_CPU利用率
查看>>
booth乘法
查看>>
实现算法2.1的程序
查看>>
设计模式之单例
查看>>
被诅咒的程序员的七宗罪
查看>>
WPF - MVVM - 如何将ComboBox的Selectchange事件binding到ViewModel
查看>>
Console“自服务”读取文件
查看>>
008天(.net学习之路-C#基础知识)
查看>>
三层开发 概念
查看>>