目录

  • 算法简介及二分法
  • 三元素表达式
  • 生成式
  • 匿名函数
  • 常见内置函数

今日内容详解


算法简介及二分法

===========================================================================

  1. 什么是算法
    1.1 算法就是解决问题的有效方法,不是所有的算法都很高效也与不合格的算法
  2. 算法应用场景
    2.1 推荐算法(抖音视频推送、淘宝商品推送)
    2.2 成像算法(AI相关).....
    2.3 几乎涵盖了我们日常生活中的方方面面
  3. 算法工程师要求
    3.1 待遇非常好,但是要求也非常高
  4. 算法部门
    4.1 不是所有的互联网公司养的起算法部分、只有大型互联网公司才有
    4.2 算法部门类似于研发部分
  5. 二分法
    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)
posted on 2022-10-13 19:50  眼眸里的温暖  阅读(20)  评论(0)    收藏  举报