python(匿名函数,各种生产式,算法及二分法)

今日内容概要

  • 算法简介及二分法
  • 三元表达式
  • 各种生产式
  • 匿名函数
  • 重要内置函数
    image

算法简介及二分法

1.什么是算法
算法就是解决问题的有效方法,不是所有的算法都有很高效的的,也有不合格的算法

2.算法应用场景
推荐算法(eg:抖音视频推荐,淘宝商品推送。。。) 成像算法(AI相关)。。。 几乎涵盖了我们日常生活的方方面面

3.算法工程师要求
待遇很好,但是要求也非常的高

4.算法部门

小知识: 并不是所有的互联网公司都能养得起算法部门,一般只有大型互联网公司才会有
算法部门就类似于药品研发部门。

5.二分法

是算法中最简单的算法,甚至都称不上算法

举个例子:当我们在玩猜数游戏的时候,当我们才出一个数,对方会告诉你这个数是大了还是小了。你就可以通过这个范围,猜中数。

可以考虑运用二分法,相比于常规的遍历搜索,二分法的时间复杂度是log(n),其原理非常的简单,首次遍历先把整个数组分成两部分,用left,right,mid三个值来划分,首次比较即可省去一半的遍历数据,1/2,1/4,1/8,…直到找到目标元素。

二分法使用:查找列表中的某一个数据值

	待查找的数据集必须有序
	
二分法的缺陷
	针对开头结尾的数据,查找效率很低常见的算法的原理以及伪代码
	
	二分法,冒泡,快拍,插入,堆排,桶排,数据结构(链表  约瑟夫问题,如何链表是否成环)

查找列表中某个数据数据值

l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
'''
1.查找列表中某个数据数据值
2.方式1: for循环, 次数较多
  方式2:二分法  不断的对数据集做二分切割
'''

'''
 代码实现二分法
'''
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 985, 1001, 1232]
# 查找列表中某个数据值
# 方式1:for循环  次数较多
# 方式2:二分法 不断的对数据集做二分切割
'''代码实现二分法'''
# 定义我们想要查找的数据值
#  target_num = 985

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,985)
# 结果:
[453, 565, 678, 754, 812, 985, 1001, 1232]
[985, 1001, 1232]
[985]
恭喜你 找到了!!!

image

三元表达式

简化步骤1:
代码简单并且只有一行,那么可以直接在冒号后面编写

name = 'jason'
# if name == 'jason'
	print('老师')
else:
	print(学生)
# 三元表达式
res = '老师'if name == 'jason' else '学生'
print(res)
'''
数据1 if 条件 else 数据值2条件成立则使用数据值1 
条件不成立则使用数据值2

当结果是二选一的情况下,使用三元表达式较为简便
并且不推荐多个三元表达式嵌套

'''

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

name_list = ['jason','kevin','oscar','tony','jerry']

# 给列表中所有人名加上_NB的后缀
# for循环
new_list = []
for name in name_list:
    data = f'{name}_NB'
    new_list.append(data)
print(new_list)
# 结果:['jason_NB', 'kevin_NB', 'oscar_NB', 'tony_NB', 'jerry_NB']

# 列表生成式:
# 先看for循环,每次for循环之后再看for关键字前面的操作
new_list = [name + 'NB' for name in name_list ]
print(new_list)
# 结果:['jasonNB', 'kevinNB', 'oscarNB', 'tonyNB', 'jerryNB']

# 复杂情况
new_list = [name + 'NB' for name in name_list if name =='jason']
print(new_list)
# 结果:['jasonNB']

new_list = ['大佬'if name == 'jason' else '菜鸡' for name in name_list if name != 'jack']
print(new_list)
# 结果:['大佬', '菜鸡', '菜鸡', '菜鸡', '菜鸡']

匿名函数

所谓匿名函数,即不再使用def语句这样标准形式定义的函数。Python语言经常使用lambda来创建匿名函数。lambda 只是一个表达式,函数体比def定义的函数体要简捷。lambda函数的语法如下所示。
简单来说就是没有名字的函数,需要使用关键字lambda
lambda 表达式也叫做匿名函数,在定义它的时候,没有具体的名称,一般用来快速定义单行函数,直接看一下基本的使用:

fun = lambda x:x+1 print(fun(1)) lambda [参数列表]:表达式

语法结构:
		lambda 形参:返回值
使用场景:
		lambda  a,b : a+b
匿名函数一般不单独使用,需要配合其他函数一起用

举例:
sum = lambda arg1, arg2: arg1 + arg2
print(sum(1, 2)) # 结果是:3
上述代码中,第一行定义了一个lambda函数,执行两个数的和运算,并且把该lambda函数命名为sum。会面的代码通过sum()函数即实现了调用lambda函数的功能。

image

常用内置函数

1.map() 映射

l1 =[1,2,3,4,5]
# def func(a):
#     return a+1
res = map(lambda n: n+1, l1)
print(list(res))
# 结果:[2, 3, 4, 5, 6]

2.max()\min() 判断最大值\判断最小值


l1 = [11, 22, 33, 44]
res = max(l1)
print(res)  # 44

l1 = [11, 22, 33, 44]
res = min(l1)
print(res)  # 11


d1 = {
    'zj': 100,
    'jason': 8888,
    'berk': 99999,
    'oscar': 1
}
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

3.reduce 传多个值,返回一个值


from functools import reduce
from typing import List

l1 = [11, 22, 33, 44, 55, 66]
res = reduce(lambda a, b: a + b, l1)  # 231
res = reduce(lambda a, b: a * b, l1) #1275523920
print(res)

reduce在Python3.x 已经被移到 functools 模块里,如果我们要使用,需要引入 functools 模块来调用 reduce() 函数
image

posted @ 2022-10-13 16:59  亓官扶苏  阅读(402)  评论(0编辑  收藏  举报