目录
- 算法简介及二分法
- 三元素表达式
- 生成式
- 匿名函数
- 常见内置函数
今日内容详解
算法简介及二分法
===========================================================================
- 什么是算法
1.1 算法就是解决问题的有效方法,不是所有的算法都很高效也与不合格的算法 - 算法应用场景
2.1 推荐算法(抖音视频推送、淘宝商品推送)
2.2 成像算法(AI相关).....
2.3 几乎涵盖了我们日常生活中的方方面面 - 算法工程师要求
3.1 待遇非常好,但是要求也非常高 - 算法部门
4.1 不是所有的互联网公司养的起算法部分、只有大型互联网公司才有
4.2 算法部门类似于研发部分 - 二分法
5.1 是算法中最简单的算法,甚至都称不上是算法
5.2 使用要求:待查找的数据集必须有序
5.3 缺陷:针对开头结尾的数据 查找效率很低
5.4 常见算法的原理以及伪代码:二分法、冒泡、开拍、插入、堆排、桶排、数据结构(链表、约瑟夫问题、如何链表是否成环)
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
# 查找列表中某个数据值
# 方式一:for循环,循环次数太多了。
# 方式2:二分法,不断的对数据集做二分切割。
'''代码实现二分法'''
# 定义我们想要查找的数据值
# target_num = 987 没必要 直接最后取值
def get_middle(l1, target_num):
if len(l1) == 0:
print('抱歉没有找到')
return
# 1.获取列表中间索引值
middle_index = len(l1)//2
# 2.比较目标数据值与中间值索引的大小
if target_num > l1[middle_index]:
# 3.切片保留右边一半
right_l1 = l1[middle_index+1:]
print(right_l1)
# 4.针对右边一半的列表继续二分并判断》》》:感觉要用递归函数
return get_middle(right_l1, target_num)
elif target_num < l1[middle_index]:
# 5.切片保留列表左边一半
left_l1 = l1[:middle_index]
print(left_l1)
# 针对左边一半的列表继续二分并判断 >>>: 感觉要用递归函数
return get_middle(left_l1, target_num)
else:
print('找到了')
get_middle(l1, 987)
# [453, 565, 678, 754, 812, 987, 1001, 1232]
# [987, 1001, 1232]
# [987]
get_middle(l1, 2000)
# [453, 565, 678, 754, 812, 987, 1001, 1232]
# [987, 1001, 1232]
# [1232]
# []
get_middle(l1, 12)
# [12, 21, 32, 43, 56, 76, 87, 98, 123]
# [12, 21, 32, 43]
# [12, 21]
# [12]
# 找到了
# target:目标 middle:中间 len:长度 get:获得 index:索引
三元表达式
-
数据值1 if 条件 else 数据值2
-
条件成立则使用数据值1 条件不成立则使用数据值2
-
当结果是二选一的情况下 使用三元表达式较为简便
-
并且不推荐多个三元表达式嵌套
# 简化步骤1:代码简单并且只有一行-那么可以直接在冒号后面编写
name = 'MrZhang'
if name =='MrZhang':print('老师')
else:print('学生')
# 三元表达式
res = '老师' if name =='MrZhang'else'学生'
print(res)
各种生成式/表达式/推导式
- 列表生成式
- 列表 = [被追加的数据 循环语句 循环或判断语句]
numbers_list = [1, 2, 3, 4, 5, ]
# 给列表中所有数据后面加.txt的后缀
# for循环
new_list = []
for number in numbers_list:
data = f'{number}.txt'
new_list.append(data)
print(new_list)
''' data:数据、资料 append:附加、追加 '''
# 列表生成式
# 先看for循环、每次for循环之后再看for关键字前面的操作
number1_list = ['1', '2', '3', '4', '5']
new_list = [number + '.txt' for number in number1_list]
print(new_list)
new_list = ['老大' if number == '1' else '小老弟' for number in number1_list if number != '5']
print(new_list)
- 字典生成式
- 字典 = {键数据:值数据 循环语句 循环或判断语句
s1 = 'hello world'
for i, j in enumerate(s1, start=100): # enumerate:列举 start:开始 i, j = k:v(键:值)
print(i, j)
# 100 h
# 101 e
# 102 l
# 103 l
# 104 o
# 105
# 106 w
# 107 o
# 108 r
# 109 l
# 110 d
d1 = {i: j for i, j in enumerate('hello world')}
print(d1)
# {0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: ' ', 6: 'w', 7: 'o', 8: 'r', 9: 'l', 10: 'd'}
- 集合生成式
- 集合 =
res = {i for i in 'hello'}
print(res)
# {'l', 'o', 'h', 'e'}
- 元组生成>>>:没有元组生成式,它是生成器.
res = (i+'sb' for i in 'hello')
print(res)
# <generator object <genexpr> at 0x000001F4DE2C1D58> :生成器
for i in res:
print(i)
# hsb
# esb
# lsb
# lsb
# osb
匿名函数
- 没有名字的函数——需要使用管卷子lambda
- 语法结构
- lambda 形参:返回值
- 使用场景
- lambda a, b:a+b
- 匿名函数一般不单独使用——需要配合其他函数一起用
常见内置函数
- map() 映射
l1 = [1, 2, 3, 4, 5]
# def func(a):
# return a + 1
res = map(lambda x: x + 1, l1)
print(list(res))
- max()\min()
l1 = [11, 22, 33, 44]
res = max(l1)
d1 = {
'zj': 100,
'jason': 8888,
'berk': 99999999,
'oscar': 1
}
res = max(d1, key=lambda k: d1.get(k))
print(res)
def func(a):
return d1.get(a)
res = max(d1, key=func)
print(res)
- reduce 传多个值 返回一个值
from functools import reduce
l1 = [1, 2, 3, 4, 5, 6, 7, 8]
res = reduce(lambda a, b: a + b, l1)
print(res)
浙公网安备 33010602011771号