今日内容总结
算法简介
1.什么是算法
算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法
2.算法应用场景
推荐算法(抖音视频推送 淘宝商品推送)
成像算法(AI相关)......
几乎涵盖了我们日常生活中的方方面面
二分法
二分法就是通过每次取中间位置与目标比较,每次可以缩小一半寻找范围的寻找方法
"""
二分法使用要求
待查找的我数据集必须有序
二分法的缺陷
针对开头结尾的数据 查找效率很低
"""
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 200, 333, 555, 777, 999, 3333, 11111, 22222]
# 查找列表中某个数据值
# 方式1:for循环 次数较多
# 方式2:二分法 不断的对数据集做二分切割
"""代码实现二分法"""
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]:
# 切片保留列表左边一半
right_l1 = l1[middle_index + 1:]
print(right_l1)
# 针对右边一半的列表继续二分并判断>>>:得用递归函数
return get_middle(right_l1, target_num)
elif target_num < l1[middle_index]:
# 切片保留列表左边一半
left_l1 = l1[:middle_index]
print(left_l1)
# 针对左边一半的列表继续二分并判断>>>:得用递归函数
return get_middle(left_l1, target_num)
else:
print('恭喜你 找到了!!!')
get_middle(l1, 44)
get_middle(l1, 3333)
生成式/表达式/推导式
三元表达式
语法格式为:数据值1 if 条件 else 数据值2
简化步骤1:代码简单并且只有一行 那么可以直接在冒号后面编写
name = 'qyf'
if name == 'qyf':print('大哥')
else:print('弟弟')
"""三元表达式"""
res = '大哥' if name == 'qyf' else '弟弟'
print(res) # 大哥
"""
条件成立则使用数据值1 条件不成立则使用数据值2
当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
"""
列表生成式
name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry']
给列表中所有人名的后面加上_NB的后缀
for循环
new_list = []
for name in name_list:
data = f'{name}_NB'
new_list.append(data)
print(new_list)
列表生成式
先看for循环 每次for循环之后再看for关键字前面的操作
new_list = [name + '_NB' for name in name_list]
print(new_list)
复杂情况
new_list = [name + '_NB'for name in name_list if name == 'jason']
print(new_list) # ['jason_NB']
new_list = ['大佬' if name == 'jason' else '小赤佬' for name in name_list if name != 'jerry']
print(new_list) # ['大佬', '小赤佬', '小赤佬', '小赤佬']
字典生成式
enumerate(iteration, start)函数默认包含两个参数,其中iteration参数为需要遍历的参数,比如字典、列表、元组等,start参数为开始的参数,默认为0(不写start那就是从0开始)。enumerate函数有两个返回值,第一个返回值为从start参数开始的数,第二个参数为iteration参数中的值。
s1 = 'hello world'
for i,j in enumerate(s1, start=100):
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(s1)}
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 + 'lowb' for i in 'hello'}
print(res) # {'olowb', 'elowb', 'llowb', 'hlowb'}
元组生成式
元组生成式>>>:没有元组生成式 下列的结果是生成器(后面讲)
res = (i+'SB' for i in 'hello')
print(res) # <generator object <genexpr> at 0x0000020FEDA6AD60>
for i in res:
print(i)
# hSB
# eSB
# lSB
# lSB
# oSB
匿名函数
没有名字的函数 需要使用关键字lambda
语法结构
lambda 形参:返回值
使用场景
lambda a,b:a+b
匿名函数一般不单独使用 需要配合其他函数一起用
常见内置函数
1.map() 映射
l1 = [1, 2, 3, 4, 5]
# def func(a):
# return a + 1
res = map(lambda x: x + 1, l1)
print(list(res)) # [2, 3, 4, 5, 6]
2.max()\min()
l1 = [11, 22, 33, 44]
res = max(l1)
print(res) # 44
d1 = {
'zja': 100,
'zjson': 8888,
'berk': 99999999,
'oscar': 1
}
print(max(d1)) # zjson 只有键参与 65~90为A~Z 97~122为a~z
def func(a):
return d1.get(a)
res = max(d1, key=lambda k: d1.get(k))
print(res) # berk
res = max(d1, key=func)
print(res) # berk 调用函数func按键取值 值比大小后返回最大值所对应的键
3.reduce
reduce 传多个值 返回一个值
from functools import reduce
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = reduce(lambda a, b: a + b, l1) # 11+22=33 33+33=66 66+44=110....
print(res) # 396
标签:name,方式,res,代码,list,middle,简化,l1,print
From: https://www.cnblogs.com/qian-yf/p/16788949.html