Python学习路程——Day14
算法简介
1、什么是算法
'''
算法就是解决问题的有效方法,并不是所有的算法都很高效、也不是所有的算法都合格。
'''
2、算法应用场景
'''
推荐算法:
抖音视频推送、淘宝商品推送
成像算法:
AI相关、人脸识别
'''
二分法
1、什么是二分法
'''
几乎是算法中最简单的算法,采用的是取中间值后、然后进行比较、之后再根据对比结果,然后在决定是否采取下一步的方案,以此循环。
二分法的使用要求:
带查找的数据集必须要有序
二分法的缺陷:
针对开头结尾的数据,查找效率很低
常见的算法的原理、以及伪代码
二分法、冒泡、快排、堆排、桶排、插入、链表(约瑟夫问题、判断链表是否成环)
'''
2、二分法
'''
二分法实现:
'''
number_list = [777, 888, 999, 11, 22, 33, 44, 55, 66, 77, 88, 99, 111, 222, 333, 444, 555, 666]
number_list.sort() # sort方法可以对列表进行升序排序
def list_sort(list_name, target_num):
if len(list_name) == 0:
print('目标数值不存在!')
return
index = len(list_name) // 2
if target_num > list_name[index]:
right_number_list = list_name[index+1:]
print(right_number_list)
return list_sort(right_number_list, target_num)
elif target_num < list_name[index]:
left_number_list = list_name[:index]
print(left_number_list)
return list_sort(left_number_list, target_num)
else:
print('您找到了您需要的目标值:', list_name[index])
target_num = eval(input('请输入您要查找的数值:'))
list_sort(number_list, target_num)
三元表达式
三元表达式的作用与使用
'''
三元表达式主要作用是:
简化步骤:代码简单且只有一行,那么可以直接再冒号后面直接编写
适用于二选一的情况下,使用三元表达式,比较简便
不推荐使用三元表达式嵌套
'''
name = 'Maria'
if name == 'Maria':
print('美人')
else:
print('小美女')
# 变量名 = if语句块 判断条件 else else语句块
res = '老师' if name == 'Maria' else '同学'
print(res)
生成式
1、列表生成式
'''
'''
list_name = ['Jason', 'Tony', 'Tom', 'Tank', 'Maria', 'Jerry']
new_list = []
for suffix in list_name:
date = f'{suffix}_Big'
new_list.append(date)
print(new_list) # ['Jason_Big', 'Tony_Big', 'Tom_Big', 'Tank_Big', 'Maria_Big', 'Jerry_Big']
# 新列表的变量名 = [接收for循环的变量名 + '需要再原列表的基础上添加的数据' for 变量名 in 老列表]
new_list = [suffix+'_Big' for suffix in list_name]
print(new_list) # ['Jason_Big', 'Tony_Big', 'Tom_Big', 'Tank_Big', 'Maria_Big', 'Jerry_Big']
# 新列表的变量名 = [接收for循环的变量名 + '需要再原列表的基础上添加的数据'
# for 变量名 in 老列表 if 接收for循环的变量名 == '老列表内需要添加数据的变量名']
new_list = [suffix+'_Big' for suffix in list_name if suffix == 'Jason']
print(new_list) # ['Jason_Big']
# 新列表的变量名 = ['更换之后的数据值' if 接收for循环的变量名 == '需要被改变的变量名' else
# '更换之后的数据值' for 变量名 in 老列表]
new_list = ['_Big' if suffix == 'Jason' else '_Small' for suffix in list_name]
print(new_list) # ['_Big', '_Small', '_Small', '_Small', '_Small', '_Small']
2、字典生成式
'''
enumerate()是python的内置函数
enumerate在字典上是枚举、列举的意思
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
enumerate多用于在for循环中得到计数
'''
string_one = '你好'
for i, j in enumerate(string_one):
print(i, j)
# 0 你
# 1 好
dict_one = {i: j for i, j in enumerate(string_one)}
print(dict_one) # {0: '你', 1: '好'}
3、集合生成器
'''
'''
string_two = 'you are my baby'
set_one = {i for i in string_two}
print(set_one) # {'a', 'u', ' ', 'e', 'o', 'b', 'y', 'm', 'r'}
匿名函数
'''
没有名字的函数 需要使用关键字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': 188,
'jason': 288,
'berk': 398,
'oscar': 998
}
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:装饰器知识 附赠:实现上述主体功能即可 其他扩展优化功能可暂且不写
'''
'''
有下列用户数据
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']}
}
login_data = {
'is_login': False,
'access': [],
'user_name': []
}
# 定义最外层函数 用
def outter(user_limit):
def center(func_name):
def inner(*args, **kwargs):
global is_login
if login_data['is_login'] == True:
access = login_data['access']
user_name = login_data['user_name']
if user_limit in access:
res = func_name(*args, **kwargs)
print(f'该用户拥有{func_name}')
return res
else:
print(f'该用户{user_name}没有{user_limit}的权限')
else:
user_id = input('请输入您的识别id:')
if user_id not in user_data:
print('查无此人')
else:
user_name = input('请输入您的账号>>>:')
pass_word = input('请输入您的密码>>>:')
if user_name == user_data[user_id]['name'] and pass_word == user_data[user_id]['pwd']:
access = user_data[user_id]['access']
login_data['is_login'] = True
login_data['access'] = access
login_data['user_name'] = user_name
if user_limit in access:
res = func_name(*args, **kwargs)
print(f'该用户拥有{func_name}')
return res
else:
print(f'用户{user_name}没有{user_limit}的权限')
return inner
return center
@outter('1')
def fun1():
print('权限1')
@outter('2')
def fun2():
print('权限2')
@outter('3')
def fun3():
print('权限3')
fun1()
fun2()
fun3()
'''
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']}
}
标签:access,路程,name,Python,Big,list,Day14,user,print
From: https://www.cnblogs.com/HaiMan/p/16790029.html