首页 > 编程语言 >算法

算法

时间:2022-10-13 20:33:14浏览次数:42  
标签:name res list 算法 l1 print

今日内容概要

  • 作业讲解
  • 算法简介及二分法
  • 三元表达式
  • 各种生成式
  • 匿名函数
  • 重要内置函数
  • 常见内置函数

今日内容详细

算法简介及二分法

1.什么是算法
   算法就是解决问题的有效方法 不是所有的算法都很高效 也有不合格的算法
2.算法的应用场景
   推荐算法(抖音视频推送 淘宝商品推送)
   成像算法(AI相关 虚拟试衣)
   几乎涵盖了我们生活的方方面面
3.算法工程师要求
   待遇好 工资高
4.算法部门
   不是所有的互联网公司都养的起算法部门 一些小的公司的算法部门只是做一些算法相关工作而已
    算法部门类似于药品研发部门 需要花大量的时间、金钱来支撑
5.二分法
    是算法这种最简单的算法 甚至称不上是算法
    
"""
二分法的使用要求:
   待查找的数据必须是有顺序的

二分法的缺陷:
   针对开头和结尾的数据 查找效率低 
   开头和结尾可以不用二分法 用二分法反而需要更长的时间
"""
l1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
#查找列表中的某一个数据值  14
#方式一:for循环
#       for i in l1:
#          if i == 14:
#             print(i)


#方式二:二分法  不断地对数据集做二分切割
#      1.定义我们想要找的函数
#      find_num = 14
l1 = [1,2,3,4,5,6,7,8,9,10,11]
def num(l1,find_num):             
#8.设置一个函数 递推要满足有一个结束条件他才会结束
    if len(l1) == 0:                
#9.如果列表里的字符个数为0 结束循环
        print('sorry')               
        return
    middl_num = len(l1)//2         
#1.找到列表的中间数的索引 列表中字符的个数整除2
    if find_num > l1[middl_num]:
#2.作比较 要找的数比中间的数大
        right_l1 = l1[middl_num+1:] 
#3.切片保留列表右边 切片顾头不顾尾 所以在切片的下一位开始切
        print(right_l1)             
#4.输出切完的右侧列表
        return num(right_l1,find_num)
    elif find_num <l1[middl_num]:    
#5.作比较 要找的数比中间的数小
        left_l1 = l1[:middl_num]   
#6.切片保留列表左边 切片顾头不顾尾 不用管直接切
        print(left_l1)             
#输出切完的左侧列表
        return num(left_l1,find_num)
    else:
        print(middl_num)             
#7.其他情况(如果要找的数和中间数一样)直接输出中间数的索引
#切完以后判断要找的数在左边还是右边 然后去小列表接着用二分找
#我们就可以直接用递推
num(l1,2)

三元表达式

#简化步骤1:代码简单并且只有一行 那么可以直接在冒号后面编写
#name = 'joyce'
#if name == 'joyce':
#    print('拽死 ')

#简化:
#   if name =='joyce':('拽死')
#   else:print('爱谁谁')
三元表达式
res = '拽死'if name == 'joyce' else '爱谁谁'
print(res)
"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立使用数据值2

当结果是二选一的情况下 使用三元表达式比较方便
不推荐多个三元表达式嵌套
"""

各种生成式/表达式/推导式

name_list = ['sun','joyce','kevin','juju','lulu']

# 给列表中的任命加上_666
# for 循环
new_list = []            #建立一个空的列表
for name in name_list:   #遍历列表里的数据值
    date = f'{name}_666' #输出时加上_666
    new_list.append(date)#空列表里加上遍历出来并且加上_666的数据值
print(new_list)          #打印

列表生成式
new_list = [name+"_666"for name in name_list]
print(new_list)
#先看for循环 每次for循环之后得到的name 在送到for关键字前面去操作 直接留在列表里

# 复杂情况
new_name= [name+"_666"for name in name_list if name == 'sun']
print(new_name)
#在列表里面找名字 判断是否是sun 遍历出sun以后加上_666

new_name =['hello sun'if name =='sun' else 'who are u'for name in name_list if name != 'jason']
print(new_name)
#在列表里找名字 如果里面没有jason 名字是sun的就打印‘hello sun’ 如果不是就打印 ’who are u‘


字典生成式
# s1 = 'helloword'
#for 循环
# for i,j in enumerate(s1):
#     print(i,j)

d1 = 'sun'
dist = {i:j for i,j in enumerate(d1)}
print(dist)

集合生成式
res={i for i in 'hello'}
print(res)

元组生成式>>>:没有元组生成式 下列的结果是生成器(后面讲)
res = (i+'SB' for i in 'hello')
print(res)
for i in res:
    print(i)

匿名函数

没有名字的函数 需要使用关键字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.max()\min()
	l1 = [11, 22, 33, 44]
 	res = max(l1)
    
	d1 = {
    'zj': 100,
    'jason': 8888,
    'berk': 99999999,
    'oscar': 1
	}
    def func(a):
        return d1.get(a)
    # res = max(d1, key=lambda k: d1.get(k))
    res = max(d1, key=func)
    print(res)
3.reduce
	 # reduce  传多个值 返回一个值
    from functools import reduce
    l1 = [11, 22, 33, 44, 55, 66, 77, 88]
    res = reduce(lambda a, b: a * b, l1)
    print(res)
'''好奇执行流程可以使用debug模式简单看看'''

标签:name,res,list,算法,l1,print
From: https://www.cnblogs.com/lzy199911/p/16789549.html

相关文章