算法及内置函数

算法简介及二分法

算法简介

1.算法说明
    算法就是使用数学的方法来解决某些问题,并用代码表现出来,使用算法是解决问题的有效方法,但是不是所有的算法都是合格的
2.算法应用场景
    平时生活我们可能用不到算法,但是算法却已经充斥在我们生活的每一个角落,如我们刷抖音时软件会根据我们的喜好来给我们推送短视频,网上购物时购物网站也会根据我们的喜好进行推送
3.常见算法
    二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表、约瑟夫问题...)

二分法

二分法通常被用于查找数据,将被查找的数据集做切割比较操作一直找到所需要的那个数据为止
使用二分法查找的数据集必须有序
如果要查找的数据为数据集的开头或结尾,那么使用二分法查找的效率会很低 
eg:
    l1 = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
    '''
    在这个列表中查找某个数据值时如果使用for循环的话,查找次数较多
    那么我们就可以使用二分法来操作
    '''
    '''for循环方法'''
    for i in l1:
        if i == 16:
            print(i)
            break
        else:
            print(i)  # 为了表示查找的次数在这里打印每一次查找的数据
    '''二分法'''
    def index(l1, a):
        split_l1 = len(l1) // 2  # 获取中间索引值
        if a > l1[split_l1]:  # 比较目标索引值与中间索引值的大小
           right_l1 = l1[split_l1 + 1:]  # 切片保留目标索引值右边的列表 
           print(right_l1)
           return index(right_l1, a)  # 对切片保留的列表继续分析判断,使用递归函数
        elif a < l1[split_l1]:
            left_l1 = l1[:split_l1]
            print(left_l1)
            return index(left_l1, a)
        else:
            print(l1[split_l1], 'find')


    index(l1, 16)
    
# 虽然使用二分法看起来需要写很多代码,但是兼容性较强适用于查找该列表的任何数据,且最重要的是二分法大大简化了查找步骤

三元表达式

主要用于结果是二选一的情况下,且大大简化了代码
三元表达式的代码结构为:
数据值1 if 条件 else 数据值2
条件成立使用数据值1,否则使用数据值2
eg:
    name = 'jason'
    if name == 'jason':print('老师')  # 代码只有一行且非常简单,那么可以直接写在冒号后面
    else:print('学生')
        
'''使用三元表达式'''
    res = '老师' if name == 'jason' else '学生'
    print(res)
    

各种生成式

列表生成式

a = [1, 2, 3, 4, 5]
# 给列表中所有数据的值加一
方法一:for循环
    a1 = []
    for i in a:
        i += 1
        a1.append(i)
    print(a1)
    
方法二:列表生成式
    a1 = [i += 1 for i in a]  
    # 先进行for循环,每次循环之后看for前面的操作,把结果放入列表再继续下一次循环
    print(a1)

字典生成式

a = '一条大河波浪宽'
# enumerate用于将字符串中的每个字符取出并编号,默认从0开始,也可以加上start=开始编号
d1 ={i: j for i, j in enumerate(a)}
print(d1)    

集合生成式

a = '一条大河波浪宽'
res = {i for i in a}
print(res)

匿名函数与常见内置函数

匿名函数

没有名字的函数,使用关键字lambda
语法结构  lambda 形参:返回值
匿名函数通常不单独使用,主要是配合内置函数或者其它函数一起使用

常见内置函数

1. map()  映射
    a = [1, 2, 3, 4, 5]
    # 给列表中的每个数据加1
    res = map(lambda k:k+1, a)
    # 把列表a复制一份,且里面的数据是经过匿名函数处理过的
    print(list(res))
    
2. max()\min()  #最大值或最小值
    a = [1, 5, 8, 6, 10, 3]
    res = max(a)
    print(res)  # 10
    res = min(a)
    print(res)  # 1
    # max\min 可以直接在数据集中循环比大小
    
    d1 = {
        'zj': 100,
        'xy': 101,
        'lxj': 250,
        'yxt': 666
    }
    # 针对字典如果直接使用max或min的话就是对键比大小,所以需要用升级版max(a, key)
    def func(a):
        return d1.get(a) 
    # 先写一个获取字典中值的函数
    res = max(d1, key=func)  
   '''
   对d1进行for循环,将循环到的键传入func函数中得到值,最后对值进行比大小,最后传出的是值对应的键,也就是值只参与比较大小
   '''
   # 也可以使用匿名函数  res = max(d1, key=lambda k: d1.get(k))
    print(res)

3. reduce  传多个值返回一个值
    from functools import reduce  # reduce不是内置方法,是模块functools内的方法
    a = [1, 2, 3, 4, 5, 6, 7, 8]
    res = reduce(lambda a, b: a * b, a)  
    # 对a做for循环,将遍历到的数据传入a,b中执行函数,先传入两个数据执行函数,然后将执行的结果作为一个参数,从a中再遍历一个数据作为参数继续执行函数,最后输出最终的结果
    print(res)
posted on 2023-04-05 21:09  zyg111  阅读(34)  评论(0)    收藏  举报