算法和常见内置函数
算法简介及二分法
什么是算法
1.算法
算法就是解决问题的有效方法,不是所有的算法嗾很高效也有不合格的算法
2.算法应用场景
推荐算法:(抖音视频推送、淘宝商品推送,行业称为投喂)
成像算法(AI)
几乎涵盖了我们日常生活中的方方面面
3.算法工程师要求
待遇非常好,但是要求也非常高
4.算法部分
不是所有的互联网公司都养的起算法部分,只有大型互联网公司才有
算法部分类似于药品研发部分
二分法
1.二分法是算法中最简单的算法,甚至不称为算法
二分法使用要求:
待查找的数据集必须有序
二分法的缺陷
针对开头结尾的数据,查找效率很低
常见算法的原理以及代码
二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表、约瑟夫问题、如何链表是否成环
l1 = [11,34,45,67,89,90,98,123,167,198,235,267,298,376,475,567,789,892,942,1234,1688,12345]
"""
查找列表中的某个数据值
方式一
for 循环 次数比较多
方式二
二分法 不断的对数据集做二分切割
"""
# for 循环 查找列表中的567
# a = 567
# for i in l1:
# if i == a :
# print(i)
# break
""" 推理过程"""
#1.定义我们想要查找的数据值
# target_num = 567
def get_middle(l1,target_num):
middle_index =len(l1)//2
if target_num >l1[middle_index]:
get_target_num = l1[middle_index+1:]
print(get_target_num)
middle_index1 = len(get_target_num)//2
if target_num>get_target_num[middle_index1]:
get_target_num1 = get_target_num[middle_index1+1:]
print(get_target_num1)
elif target_num<get_target_num[middle_index1]:
b = get_target_num[:middle_index1]
print(b)
else:
print('恭喜找到')
elif target_num < l1[middle_index]:
target_num1 = l1[:middle_index]
print(target_num1)
else:
print('恭喜找到567')
get_middle(l1,567)
""" 二分法实现查找数据"""
def get_middle(l1,target_num):
middle_index =len(l1)//2
if target_num >l1[middle_index]:
get_target_num = l1[middle_index+1:]
print(get_target_num)
# 针对右边一半的列表继续二分法并判断>>>:要用递归函数
return get_middle(get_target_num,target_num)
elif target_num < l1[middle_index]:
target_num1 = l1[:middle_index]
print(target_num1)
return get_middle(target_num1,target_num)
else:
print('恭喜找到')
# get_middle(l1,567)
# get_middle(l1,1234)
get_middle(l1,67)
""" 结果显示如下:
[11, 34, 45, 67, 89, 90, 98, 123, 167, 198, 235]
[11, 34, 45, 67, 89]
[67, 89]
[67]
恭喜找到
"""
三元表达式(三元运算式)
三元运算式的结构
结构:
数据值1 if 条件 else 数据值2
如何判断结果:
条件成立则使用数据1,条件不成立则使用数据值2
当结果是二选一的情况下,使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
代码的实现:
# 简化步骤:代码简单并且只有一行,那么可以直接在冒号后面编写
name = 'kiki'
if name =='kiki':print('老师')
else:print('学生')
# 三元表达式
result = '老师' if name =='kiki' else '学生'
print(result)
各种生成式/表达式/推导式
列表生成式
# 简化步骤:代码简单并且只有一行,那么可以直接在冒号后面编写
# name = 'kiki'
# if name =='kiki':print('老师')
# else:print('学生')
# 三元表达式
# result = '老师' if name =='kiki' else '学生'
# print(result)
""" 表达式的推导式"""
name_list = ['kiki','nana','kevin','kimi','jenny','tony']
# 1.给列表中所有人名加入_welcome
""" 方式一 for 循环 """
new_list = []
for name in name_list:
# data = name + '_welcome'
# new_list.append(data)
data = f'{name}_welcome'
new_list.append(data)
print(new_list) # ['kiki_welcome', 'nana_welcome', 'kevin_welcome', 'kimi_welcome', 'jenny_welcome', 'tony_welcome']
""" 方式二 列表生成式
先看for循环 每次循环之后再看for 关键字前面的操作 """
new_list1 = [name1 + '_good' for name1 in name_list]
print(new_list1) # ['kiki_good', 'nana_good', 'kevin_good', 'kimi_good', 'jenny_good', 'tony_good']
""" 如何发生:
第一步先看for循环出第一name1 'kiki' ,再去加上‘_good’ 然后放在列表中等着
第二步接着for循环出第二个name1 'name',再去加上‘_good',尾部添加
.........
"""
# 复杂情况 步骤 for>>>>if >>>>name2+'_pretty
new_list2 = [name2 + '_pretty' for name2 in name_list if name2 == 'kimi']
print(new_list2) # 'kimi_pretty']
new_list3 = ['teacher' if name2 == 'kiki' else 'student' for name2 in name_list if name2 != 'kimi']
print(new_list3) # ['teacher', 'student', 'student', 'student', 'student']
字典生成式
结构:
dict1 ={i:j for i,j in enumerate('happy') }
代码的实现:
""" 字典生成式 """
l1 = 'hello world'
for i,k in enumerate(l1):
print((i, k),end='') # (0, 'h')(1, 'e')(2, 'l')(3, 'l')(4, 'o')(5, ' ')(6, 'w')(7, 'o')(8, 'r')(9, 'l')(10, 'd')
for a,b in enumerate(l1,start=100):
print(a,b) # 101 e 102 l.......
dict1 = {i:j for i,j in enumerate('happy')}
print(dict1) # {0: 'h', 1: 'a', 2: 'p', 3: 'p', 4: 'y'}
集合生成式
""" 集合生成式 """
result = {i for i in 'hello'}
print(result) # {'o', 'e', 'h', 'l'}
元组生成式 >>>>无,下面是生成器
""" 元组生成式 """
result = (i + 'day' for i in 'people')
print(result) # <generator object <genexpr> at 0x0000026237C3BA50>
for j in result:
print(j,end='、') # pday、eday、oday、pday、lday、eday
匿名函数
1.概念
没有名字的函数 需要使用关键字lambda
2.语法结构
lambda 形参:返回值
3.使用场景
lambda a,b:a+b
注意:匿名函数一般不单独使用 ,需要配合其他函数一起用
4.代码实现
def my_add(a,b):
return a+b
result = my_add(1,2)
print(result) # 3
result1 = lambda a,b:a+b # 不能单独使用,需要一个变量来接收
print(result1) # <function <lambda> at 0x00000184AC2C61F0>
result2= result1(1,2)
print(result2) # 3
常见内置函数
1.map() 映射
map函数也是python中的一个内置函数,map在这里的意思是映射的意思,会根据提供的函数对指定序列做映射。map函数会返回一个迭代器,如果要转换为列表,可以使用 list() 来转换
map(function,iterable), function>>>: 函数 ,iterable>>>: 可遍历对象
l1 = [11,22,33,44,55]
#def function(a):
# return a + 1
result = map(lambda x :x+1,l1)
print(list(result)) # [12, 23, 34, 45, 56]
# print(dict(result)) # {}
# print(tuple(result)) # ()
""" 一般用列表来接收"""
2.max()\min()
eg1:
l1 = [11, 21, 2, 3, 2, 1, 2, 3, 2, 3, 2, 3, 2324, 242, 432, 43246, 456, 46, 345, 55345]
result = max(l1)
print(result) # 55345
eg2:
d1 = {
'kiki': 999,
'kimi': 1234,
'jenny': 3456,
'rose': 888
}
方式-:
def function(a):
return d1.get(a)
res = max(d1,key=function)
print(res) # jenny
方式二:
res = max(d1,key=lambda k:d1.get(k))
print(res) # jenny
"""
A-Z: 65-90
a-z:97-122
"""
3.reduce
""" reduce 传多个值 返回一个值 """
from functools import reduce
l1 = [11, 22, 33, 44, 55, 66]
result = reduce(lambda a,b:a*b,l1)
print(result) # 1275523920
"""步骤:
1.导入 reduce
2.获取列表
3.获得a=11,b=22 并相乘得242,再赋值给a
4,a=242,或者b=33,a,b相乘得7986再赋值给a
依次循环,直至结束"""
作业
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']}
}
并有三个函数
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']}
}
标签:内置,函数,get,算法,result,l1,print,target,name
From: https://www.cnblogs.com/zhanglanhua/p/16789907.html