二分法,三元表达式,生成式,匿名函数
算法简介
算法是什么,算法是用来解决问题的有效办法。
不是所有的算法都是很有效的,也有一些不达标的算法。
算法应用的场景有很多,比如我们日常生活中用到的一些软件都含有一些算法。
比如抖音他就可以根据我们浏览的爱好来给我们推相应的视频。这种算法统称 """推荐算法"""
AI行业也可以用到的 """成像算法"""
我们今天要说的是算法中比较简单的二分法
二分法
二分法使用的时候需要该算法查找的数据必须是有序的。 可以在某个数据集里拿到我们想要的数据值。
for循环也可以做到,但是遇到大量数据的时候 需要写很多重复代码 没有此方法简便 。
代码:
l1 = [2, 33, 55, 66, 77, 88, 123, 234, 444, 555, 666]
def get(l1, target_num):
# 递归函数需要一个结束条件
# 当列表长度等于0时,结束
if len(l1) == 0:
print('没有数据了')
# 函数体代码遇到return 自动结束
return
# 获得列表中间的索引值
middle = len(l1) // 2
# 比较目标数据值与中间索引位的数据值的大小
if target_num > l1[middle]:
# 切片操作 保留列表的右边一半,因为middle索引5 已经做过比较所以+1
right_l1 = l1[middle + 1:]
print(right_l1)
# 切片后的右边一半返回去
return get(right_l1, target_num)
# 比较目标数据值是否小于中间索引位的数据值
elif target_num < l1[middle]:
# 切片操作 保留列表的左边一半
left_l1 = l1[:middle]
print(left_l1)
return get(left_l1, target_num)
else:
print('找到啦')
get(l1, 234)
如果需要查找的数据在数据集的开头或结尾,那使用二分法反而变得复杂,不如使用for循环来的快
'''面试题,要能手写出来'''
三元表达式
在我们判断条件只需要二选一时,三元表达式更简单
学习三元表达式之前使用版:
username = 'tank'
if username == 'tank':
print('对啦')
else:
print('错啦')
针对if else 分支优化
if usernmae == 'tank': print('对啦')
else:print('错啦')
三元表达式
res = '对啦' if username == 'tank' else '错啦'
print(res)
工作原理:
"""数据值1 if条件 else 数据值2
条件不成立则使用数据值2, 条件成立则使用数据值1"""
需要使用一个变量名来接收结果
各种生成式(也可叫 表达式/推导式)
1.列表生成式
l1 = ['jason', 'tank', 'tony']
new_list = []
使用For循环方法:
for i in l1:
data = f'{i}牛逼'
new_list.append(data)
print(new_list)
列表生成式:
res = [f'{i}牛逼' for i in l1]
print(res) # ['jason牛逼', 'tank牛逼', 'tony牛逼']
复杂情况
res = [f'{i}牛逼' for i in l1 if i == 'tank']
print(res) # ['tank牛逼']
还具备筛选能力
res = ['鸣人' for i in l1 if i != 'jason'] # 此时后面的if时筛选功能
print(res) # ['鸣人', '鸣人']
在加入一个三元表达式
res = ['鸣人' if i == 'jack' else '佐助' for i in l1 if i != 'tank']
print(res) # ['佐助', '佐助']
2.字典生成式
enumerate 当你在循环一个数据集的时候给你产生从0开始的数字,也可以修改起始号码 在后面+ start= 20
l1 = ['jason', 'tank', 'tony']
for i,j in enumerate(l1,): # i 接收序号, j接受数据值
print(i,j)
0 jason
1 tank
2 tony
d1 = {i:j for i, j in enumerate(l1)} # i代表k:j代表v 来处理后面循环获取数据的i j
print(d1)
{0: 'jason', 1: 'tank', 2: 'tony'}
3.元组生成式
元组其实没有生成式 ,产生的结果是生成器
l1 = ['jason', 'tank', 'tony']
res = (i+'sb' for i in l1)
print(res)
# <generator object <genexpr> at 0x0000027BDBEECB30>
用for循环来查看数据:
for k in res:
print(k)
jasonsb
tanksb
tonysb
匿名函数
没有函数名的函数,需要使用关键字 lambda
lambda 就是用来顶替掉一些简单的函数 , 结合一些常见的内置函数一起用。
语法结构:
lambda 形参:返回值
普通函数方式:
def func(a,b):
return a+b
res = func(2, 3)
print(res) # 5
lambda 方式:
res = lambda x, y: x * y
a = res(2, 3)
print(a) # 6
res = lambda x, y: x * y
print(res(2, 3)) # 6
"""
def func(a, b) 是def的声明部分,return a+b 是实现部分
lambda x,y是声明部分,x * y是实现部分
"""
常见内置函数
1.map() 映射
可以结和匿名函数一起用
l1 = [12,21,26,31,40]
res = map(lambda x:x+6, l1) # map 相当于for 循环l1列表 把列表里的数据传给x(相当于形参) 接着 x+6后的数据值 生产一个新的列表
print(list(res))
# [18, 27, 32, 37, 46]
-------------------------------------------------------------------------------------
2. max()\min() 最大值 最小值
也可以结和匿名函数一起用
字典
d1 = {'jack': 10000,
'tank': 88888,
'tony': 123
}
res = max(d1, key=lambda k: d1.get(k))
# max 也相当于for循环在d1字典里循环获取,但是for循环在字典只能获取键。 k 相当于形参, get(k)在d1按k key(键)列表里取值。
"""注意如果我们不按k取值那么他取出来的就是键, 在键里都是一些英文字母,怎么做比对呢。我们在学习字符编码的时候学过字母和数字的对应关系,按照字母对应的数字来作比较取最大值"""
print(res)
列表
l1 = [12,21,26,31,40]
res = max(l1) # 40
字符编码:
字母和数字对应关系
A-Z 65 - 90
a-z 87 - 122
-------------------------------------------------------------------------------------
3. reduce 传多个值只返回一个值
from functools import reduce
l1 = [12,21,26,31,40]
res = reduce(lambda a,b:a + b, l1)
print(res)
reduce相当于for循环在列表l1里取数据值 赋值给 a和b 。a + b 相当于实现部分 。返回一个总和。 也可以在最后面指定一个数字等于加上该数字>>>取决于 实现部分的数学运算符
原文地址:http://www.cnblogs.com/LiaJi/p/16789597.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性