算法简介
1.什么是算法?
算法就是帮助我们解决问题的有效方法,例如我们自己想去哪里,我们的脑子就自动开始思考,路程怎么样,先去哪里再去哪里,这就是我们人脑的计算。
2.实际算法应用场景
日常生活中算法无处不在
举例:我们浏览淘宝,淘宝会根据我们搜索的关键词 分析你的喜好进行推荐
平时刷抖音,抖音通过我们看的视频然后用算法分析出你的喜好然后投喂给你
包括导航,通过算法计算路段是否堵车,分析路线等等
3.如果创造算法
算法开发难度还是非常高的,需要扎实的数学功底,以及大量的理论知识 通过不断的调试开发,当然算法工程师待遇也是非常好,属于高端人才。
4.算法部门
对于互联网行业来说,由于算法开发过程不易,成本比较高。所以只有大型互联网公司才会有这个岗位,类似 药品研发等,需要大量时间去调适钻研。
基础算法—二分法
1.什么是二分法?
就是通过一分为二的方式,查询数据,不断的分割判断从而最终找寻到你要的数据。
2.二分法使用条件
必须满足待查找的数据集是有序的 从大到小 或者从小到大
3.代码展示:
l1 = [11,23,42,54,231,234,435,656,887,1554,3345,6544,6765,66567,45345]
#在列表中查询你要的数据 例如1554
#发现此列表符号二分法必要条件,数据集有序的 可以看到从大到小的。
#1.原始方法 for 循环
for i in l1:
if i == 1554:
print(i)
#这种方法也可以找到,但是加入我们的列表中有成千上万的数据,for循环就不可以了
'''
二分法的具体逻辑,当我们需要找列表中的某个数据,我们先把整个列表一分为2,然后用中间值去跟我们要找的值对比,如果比他小那就是在左半部列表,如果比他大就是右版本列表,然后再把缩小范围的列表再次一分为二,从而得到我们要找的值
'''
#由于二分法的做法符合递归函数逻辑,我们代码展示
target_num = 42
def middle_index(l1,target_num):
if len(l1) == 0: # 设置一个递归函数终止条件,当列表没有数据时终止
print('暂无此数字')
return
middle_num = len(l1) // 2 #取到一个列表中间数值位置
if target_num > l1[middle_num]: #判断找到数字和中间数据大小,找的数字大
right_l1 = l1[middle_num+1:] #保留找的数字大,说明在后面,保留后面的列表
#根据列表切片知识
print(right_l1)
return middle_index(right_l1,target_num) #把保留的列表再次进行二分处理
elif target_num < l1[middle_num]: #判断数字比中间数值小的时候
left_num = l1[:middle_num] #找的数字小,说明在前面
print(left_num)
## 针对左边一半的列表继续二分并判断 >>>: 感觉要用递归函数
return middle_index(left_num,target_num)
else:
print('找到了')
middle_index(l1,target_num) #[11, 23, 42, 54, 231, 234, 435][11, 23, 42][42]
#每一次分割的
三元表达式
1,三元表达式的作用
可以使我们的代码运行效率更高,代码更加简化。
2. 什么时候使用三元表达式
当结果时二选一的情况下,使用三元表达式比较简单
3.代码展示
#普通代码
name = input('请输入姓名')
if name =='moon':
print('大哥好')
else:
print('你谁啊')
#三元表达式
res = '大哥好' if name == 'moon' else '你谁啊'
print(res)
实现的功能都是一样的,但是三元表达式的效率更高哦
代码格式:
变量名 = 成立输出 if 判断条件 else 错误输出
age = 20
if age < 18:
print('未成年')
else:
print('成年了哦')
age = '未成年' if age < 18 else '成年了哦'
print(age)
"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2
当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
"""
列表表达式
name_list = ['moon', 'kevin', 'oscar', 'tony', 'jerry']
#目前有一个需求 给列表内所有元素加上‘优秀’
1.常规我们可以用到for循环处理
new_list = []
for i in name_list:
#应该了多次循环添加 效率不高
new_list.append(i+'优秀')
name_list = new_list
print(name_list)
2.使用列表表达式:
name_list = [i+'优秀' for i in name_list ] # i 为for循环的临时变量
print(name_list)
#跟上面的结果是一样的
num_list = [1,2,3,4,5,6,7]
#目前需求 给列表中的每个数据加2
num_list = [ num + 2 for num in num_list]
print(num_list)
3.列表表达式复杂情况:
num_list = [i+100 for i in num_list if i == 5]
print(num_list) # 105 当i等于5时 加100
#还可以在后面添加if条件,当if条件成立时才执行
num_list = [i+100 if i == 5 else i-100 for i in num_list if i != 7]
print(num_list)
#这里也是一样的,我们之间把最后一个if 前面的看为一体,最后一个if是判断元素是否可以进去前面的运算, 这里的意思是 在i不等于7时,去进行 (i+100 if i == 5 else i-100)
字典表达式
dict1 = 'moon'
# enumerate作用:当你在for循环可遍历数据时 可记录你循环的次数
for i,j in enumerate(dict1):
print(i,j)
dict1 = {i:j for i,j in enumerate(dict1)}
print(dict1)
#字典式在字典中,先写出自己想要的结果,然后后面跟上for循环
集合生产式
dict1 = {i for i in dict1}
print(dict1)
匿名函数
没有名字的临时函数,可以使用关键字 lambda
语法结构
lambda 行参 : 返回值
使用场景
lambda a,b:a+b
匿名函数一般不单独使用 需要配合其他函数一起用
常见内置函数
1.map() 映射
l1 = [1, 2, 3, 4, 5]
# def func(a):
# return a + 1
res = map(lambda x:x+1, l1)
print(list(res))
2.max()\min()
l1 = [11, 22, 33, 44]
res = max(l1)
d1 = {
'zj': 100,
'jason': 8888,
'berk': 99999999,
'oscar': 1
}
def func(a):
return d1.get(a)
# res = max(d1, key=lambda k: d1.get(k))
res = max(d1, key=func)
print(res)
3.reduce
# reduce 传多个值 返回一个值
from functools import reduce
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = reduce(lambda a, b: a * b, l1)
print(res)
'''好奇执行流程可以使用debug模式简单看看'''
有下列用户数据
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:装饰器知识 附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写
'''
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']}
}
# 有下列用户数据
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_status = 0 #全部变量 目前代表未登录
def outer_plus(func_num): #接收功能编号传参, 以便以后判断 此功能用户是否有权限执行
def outer(func): #功能的函数名
def inner(*args, **kwargs):
global user_status
if user_status == 0: #判断用户全局登录状态
name = input('请输入账号')
password = input('请输入密码')
for data in user_data: # 使用变量data 循环遍历 user_data
small_data = user_data[data] # 这时候的small_data 就等于 每一个{'name': 'oscar', 'pwd': '222', 'access': ['1']}
real_name = small_data['name'] #判断 名字密码
real_pass = small_data['pwd']
if name == real_name and password == real_pass:
print('登录成功')
print(f'欢迎你{name}')
user_status = data #登录成功以后改变了全局用户登录状态 这里的data 就是用户的编号
ret = small_data['access'] #搞一个变量去接收 小字典中的access
print(f'您好{name}您可以执行功能{ret}')
if func_num in ret: #判断函数功能需要是否在 账号可执行范围中 在就行执行
res = func(*args, **kwargs)
return res
else:
print('您暂时没有权限') #不在就返回没有权限
else: #用户全局状态不是未登录
if func_num in user_data[user_status]['access']: #判断函数功能需要是否在 账号可执行范围中 在就行执行
res = func(*args, **kwargs)
return res
else:
print('您暂时没有权限')
return inner
return outer
@outer_plus('1')
def func1():
print('我是功能1')
@outer_plus('2')
def func2():
print('我是功能2')
@outer_plus('3')
def func3():
print('我是功能3')
# func1()
# func2()
# func3()
func_dict = {
'0': quit,
'1': func1,
'2': func2,
'3': func3,
}
while True:
choice = input('功能序号:').strip()
if choice in func_dict:
func_dict.get(choice)()
标签:name,list,二分法,num,l1,print,三元,data,表达式
From: https://www.cnblogs.com/moongodnnn/p/16790021.html