今日内容概要
- 算法简介及二分法
- 三元表达式
- 各种生成式
- 匿名函数
- 常见内置函数
今日内容概要
算法简介及二分法
算法简介
1.什么是算法
算法就是解决问题的有效方法 不是所有的算法都很高效 也有不合格的算法
2.算法应用场景
推荐算法 如 抖音短视频 淘宝商品推送等等
成像算法(AI相关)...
几乎涵盖了我们日常生活中的方方面面
'''算法工程师的待遇非常好,但是他的要求也非常高,并且不是所有的互联网公司都养得起算法部门,通常情况下之后大型互联网公司才有,十年磨一剑'''
二分法
是算法中最简单的算法 甚至都称不上是算法
就是不断的对数据集做二分切割
'''
二分法使用要求
待查找的数据集必须有序
缺陷
针对在开头以及结尾的数据查找效率很低
'''
'''常见算法
二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何链表是否成环)
'''
代码实现二分法
# 二分法 不断的对数据集做二分切割
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
# 查找列表中某个数据值
def get_num(a, num):
# 添加一个结束条件
if len(a) == 0:
print('没找到')
# 获取列表中间索引值
middle = len(a) // 2
# 比较目标数据值与中间索引值的大小
if num < a[middle]:
# 切片保留列表右边一半
left_list = a[:middle]
# 针对右边一半的列表继续二分并判断
return get_num(new_list, num)
elif num > a[middle]:
# 切片保留列表左边一半
right_list = a[middle + 1:]
# 针对左边一半的列表继续二分并判断
return get_num(new_list, num)
else:
print('找到了')
三元表达式
"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2
当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
"""
name = 'jason'
# 普通写法
if name == 'jason':
print('老师')
else:
print('学生')
# 三元表达式写法
res = '老师' if name == 'jason' else '学生'
print(res)
各种生成式/表达式/推导式
列表推导式
name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
# 给列表中所有人名的后面加上nb后缀
new_list = [name + 'nb' for name in name_list]
'''先看for循环 每次for循环之后再看for关键字前面的操作'''
# 复杂情况
new_list = [name + 'nb' for name in name_list if name == 'jason']
# 先看for循环 再看判断条件是否成立 成立再看最前面的操作
new_list = [name + 'nb' if name == 'jason' else name + 'sb' for name in name_list if name != 'jack']
# 先看for循环 再看判断条件是否成立 然后看前面的三元表达式 做判断 在执行条件成立的操作
字典生成式
d1 = {i: j for i,j in enumerate('hello')}
print(d1) # {0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o'}
# enumerate函数会自动为被遍历后的数据依次添加从0开始的数字
集合生成式
s1 = {i for i in 'hello'}
print(s1) # {'o', 'h', 'l', 'e'} 集合是无序的
匿名函数
没有名字的函数 并且执行的代码比较简单 需要使用关键字lambda 一般不单独使用 需要配合其他函数一起使用
语法结构
lambda 形参:返回值
如
lambda a,b:a+b
常见内置函数
1.map() 映射
map(func,iterable),其中func为函数名,可为lambda匿名函数,iterable为可迭代对象。此函数会将可迭代对象中的每一位元素作为参数传递到func中,并将func的计算结果加入到新列表内,map()返回的是一个包含所有结果的新列表。
# 让字典中的每个数据值加1
l1 = [1, 2, 3, 4, 5]
# def func(a):
# return a + 1
res = map(lambda x:x+1, l1)
print(list(res)) # [2, 3, 4, 5, 6]
2.max()\min() 求最大值\求最小值
min(iterable, *[, key, default])
参数:iterable是可迭代的对象,key指定寻找最小值的关键字,若key不指定则采用默认位置
返回值:返回值是iterable中寻找到的最小值
l1 = [11, 22, 33, 44]
res = max(l1)
print(res) # 44
# 如果比较字典数据
d1 = {
'zj': 100,
'jason': 8888,
'berk': 99999999,
'oscar': 1
}
def func(a): # 定义一个函数,取对应的value值
return d1.get(a)
# res = max(d1, key=lambda k: d1.get(k)) 用匿名函数
# 如果后面不指定参数 那么比较的是key值 而不是后面的value值
res = max(d1, key=func) # 用定义好的函数
print(res) #
3.reduce
# reduce 传多个值 返回一个值
from functools import reduce # reduce函数原本在python2中也是个内置函数,不过在python3中被移到functools模块中
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = reduce(lambda a, b: a * b, l1)
print(res)
作业
'''有下列用户数据
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']}
}
并有三个函数
def func1():
pass
def func2():
pass
def func3():
pass
要求:调用上述三个函数的时候需要从user_data中校验用户身份是否正确
并获取当前登录用户拥有的可执行函数功能编号即键access对应的功能编号列表
func1是1、func2是2、func3是3
并且一旦用户登录成功之后后续函数的调用不再校验用户身份
请思考如何获取函数功能编号 如何校验用户身份 如何校验权限
ps:装饰器知识 附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写'''
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']}
}
is_login = False # 用户登录状态
def outter(a):
def outer(func_name):
def innter(*args, **kwargs):
global is_login, user_id
if is_login: # 判断用户是否已经登陆
if a in user_data.get(user_id).get('access'): # 判断用户是否有执行对应函数的权限
res = func_name(*args, **kwargs)
return res
else:
print(f'该用户没有权限执行func{a}')
return
user_id = input('请输入用户编号').strip() # 获取用户编号
if user_id.isdigit():
username = input('username:').strip()
password = input('password:').strip()
if username == user_data.get(user_id).get('name') and password == user_data.get(user_id).get('pwd'): # 从用户字典里面取用户名和密码并判断
is_login = True
if a in user_data.get(user_id).get('access'): # 判断用户是否有执行对应函数的权限
res = func_name(*args, **kwargs)
return res
else:
print(f'该用户没有权限执行func{a}')
return
else:
print('账号或密码错误')
return
else:
print('请输入数字')
return innter
return outer
@outter('1')
def func1():
print('from func1')
@outter('2')
def func2():
print('from func2')
@outter('3')
def func3():
print('from func3')
def start():
while True:
print('''
1.执行func1
2.执行func2
3.执行func3
4.退出
''')
func_id = input('请输入要执行对应func的编号:').strip()
if func_id == '1':
func1()
elif func_id == '2':
func2()
elif func_id == '3':
func3()
elif func_id == '4':
break
else:
print('没有哦')
if __name__ == '__main__':
start()