算法表达式匿名函数
算法简介与二分法
1.什么是算法
算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法
2.算法应用场景
推荐算法(抖音视频推送 淘宝商品推送)
成像算法(AI相关,图片P图)等等
3.算法工程师要求
待遇非常好 但要求也非常高
4.算法部门
不是所有的互联网公司都养的起算法部门 只有大公司才有实力和愿意养算法人才
算法部门类似药品研发部分
5.二分法
是算法中最简单的算法 甚至都算不上是算法
二分法
'''
二分法使用要求
要求,原列表有一定规律例如下面
二分法的缺陷
针对开头结尾的数据 查找效率很低
'''
# 要求,原列表有一定规律例如下面
l1 = [1, 2, 3, 6, 9, 16, 30, 200, 500, 1000]
# 求给定的数纯在不存在这个列表
def get_min_num(num, li_list):
if not len(li_list):
print('没在列表里找到')
return
if num == li_list[0]: # 不知道算不算优化二分查找 查找第一个是不是
print(f'恭喜你找到了,{num}')
return
if num == li_list[-1]: # 不知道算不算优化二分查找 查找最后一个是不是
print(f'恭喜你找到了,{num}')
return
mi_num = len(li_list) // 2
if li_list[mi_num] > num:
get_min_num(num, li_list[:mi_num])
elif li_list[mi_num] < num:
get_min_num(num, li_list[mi_num + 1:])
else:
print(f'恭喜你找到了,{num}')
get_min_num(int(input()), li_list=l1)
常见算法的原理以及伪代码
二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何判断链表是成环)
三元表达式
一些简单的代码可以写到一行内
简化步骤1:代码简单并且只有一行 那么可以直接卸载冒号后面
name = 'aa'
if name == 'aa':print('gg')
else:print('mm')
# gg
三元表达式
res = 'gg' if name == 'aa' else 'mm'
print(res) # gg
'''
数据值1 if 条件 else 数据值2
条件成立使用数据值1 不成立使用数据值2
当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
'''
各种生产式、表达式、推导式
name_list = ['1','2','3']
#给所有人后面都加__a
new_list=[]
for i in name_list:
new_list.append(i+'__a')
普通的
#列表生产式
#先看for循环 每次for循环之后会再看for关键字前面的操作
new_list = [i+'__a' for i in name_list]
#复杂情况
new_list = [i+'__a' for i in name_list if i == '1']
new_list = ['大佬' if i == '2' else '菜鸟' for i in name_list if i != '3']
#字典生成式
s1 = 'hello world'
d1={}
for i,j in enumerate(s1,1)
d1[i]=j
d2 = {i:j for i,j in enumerate(s1,0)}
#集合生成式
se = {i for i in 'hello'}
#元组没有生成式,只有生成器
t1 = (i+'1' for i in 'hello')
for j in t1:
print(j)
匿名函数
没有名字的函数 需要使用关键字lambda
语法结构
lambda 可以有参数:直接返回冒号后面的数据值
#匿名函数不单独用
常见内置函数
1.map() 映射
l1 = [1,2,3,4,5]
a = map(lambda x:x+1,l1)
print(a)
#[2,3,4,5,6]
2.max,min # 查找最大最小值
res = max(l1) # 第一次参数为可迭代对象,第二个是查找排序关键字,为一个函数 返回的是第一参数取的值
d1 = {
'asd':12,
'dasd':18,
'123':20
}
res = max(d1,key=lambda x:d1.get(x))
3.reduce # 出入多个值返回一个累加的值
from functools import reduce
res = reduce(l1) # 一共三个参数,第一个为函数,第二个为可迭代对象,第三个累加默认值为0,累乘默认为1
作业
'''
1.
附加题
有下列用户数据'''
'''user_data = {
'1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
'2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
'3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}'''
'''并有三个函数'''
'''
要求: 调用上述三个函数的时候需要从user_data中校验用户身份是否正确
并获取当前登录用户拥有的可执行函数功能编号即键access对应的功能编号列表
func1是1、func2是2、func3是3
并且一旦用户登录成功之后后续函数的调用不再校验用户身份
请思考如何获取函数功能编号
如何校验用户身份
如何校验权限
ps: 装饰器知识
附赠: 实现上述主体功能即可
其他扩展优化功能可暂且不写
'''
'''
1.先编写校验用户身份的装饰器
2.然后再考虑如何保存用户登录状态
3.再完善各种需求
'''
user_data = {
'1': {'name': 'jason', 'pwd': '123', 'access': ['1', '2', '3']},
'2': {'name': 'kevin', 'pwd': '321', 'access': ['1', '2']},
'3': {'name': 'oscar', 'pwd': '222', 'access': ['1']}
}
islogin = []
def outer_p(data): # 或者采用参数传递(data,num)
def outer(func):
def inner(*args, **kwargs):
if not islogin:
print('请先登录')
user_name = input('请输入用户名')
user_pwd = input('请输入密码')
for k, v in data.items():
if v['name'] == user_name and v['pwd'] == user_pwd:
islogin.append(v['name'])
if func.__name__[-1] in v['access']: # 这边就直接判断num in 不 in v['access']这个
res = func(*args, **kwargs)
return res
else:
print('你没有权限执行')
else:
print('用户名或密码不正确')
else:
for k, v in data.items():
if v['name'] == islogin[0]:
if func.__name__[-1] in v['access']: # 这边就直接判断num in 不 in v['access']这个
res = func(*args, **kwargs)
return res
else:
print('你没有权限执行')
return inner
return outer
@outer_p(user_data) # 这里就变成了@outer_p(user_data,'1') 手动指定
def func1():
print('1')
pass
@outer_p(user_data) # 这里就变成了@outer_p(user_data,'2') 手动指定
def func2():
print('2')
pass
@outer_p(user_data) # 这里就变成了@outer_p(user_data,'3') 手动指定
def func3():
print('3')
pass
while True:
func1()
func2()
func3()
input('按任意键继续执行')