算法及内置函数
算法简介及二分法
算法简介
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)