二分法,三元表达式,生成式,匿名函数

算法简介

算法是什么,算法是用来解决问题的有效办法。
不是所有的算法都是很有效的,也有一些不达标的算法。
算法应用的场景有很多,比如我们日常生活中用到的一些软件都含有一些算法。
比如抖音他就可以根据我们浏览的爱好来给我们推相应的视频。这种算法统称 """推荐算法"""
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. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性