## 算法简介与二分法 ```python 1.什么是算法 算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法 2.算法应用场景 推荐算法(抖音视频推送 淘宝商品推送) 成像算法(AI相关,图片P图)等等 3.算法工程师要求 待遇非常好 但要求也非常高 4.算法部门 不是所有的互联网公司都养的起算法部门 只有大公司才有实力和愿意养算法人才 算法部门类似药品研发部分 5.二分法 是算法中最简单的算法 甚至都算不上是算法 ``` ### 二分法 ```python ''' 二分法使用要求 要求,原列表有一定规律例如下面 二分法的缺陷 针对开头结尾的数据 查找效率很低 ''' # 要求,原列表有一定规律例如下面 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) ``` ### 常见算法的原理以及伪代码 二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何判断链表是成环) ```python ``` ## 三元表达式 ```python 一些简单的代码可以写到一行内 简化步骤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 当结果是二选一的情况下 使用三元表达式较为简便 并且不推荐多个三元表达式嵌套 ''' ``` ## 各种生产式、表达式、推导式 ```python 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) ``` ## 匿名函数 ```python 没有名字的函数 需要使用关键字lambda 语法结构 lambda 可以有参数:直接返回冒号后面的数据值 #匿名函数不单独用 ``` ## 常见内置函数 ```python 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 ``` ## 作业 ```python ''' 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('按任意键继续执行') ``` Last modification:October 13th, 2022 at 07:33 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments
Comment here is closed