代码简化方式

今日内容总结

算法简介

1.什么是算法
	算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法
2.算法应用场景
	推荐算法(抖音视频推送 淘宝商品推送)
	成像算法(AI相关)......
	几乎涵盖了我们日常生活中的方方面面

img

二分法

二分法就是通过每次取中间位置与目标比较,每次可以缩小一半寻找范围的寻找方法

"""
二分法使用要求
	待查找的我数据集必须有序
二分法的缺陷
	针对开头结尾的数据 查找效率很低
"""
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 200, 333, 555, 777, 999, 3333, 11111, 22222]
# 查找列表中某个数据值
# 方式1:for循环 次数较多
# 方式2:二分法 不断的对数据集做二分切割
"""代码实现二分法"""
def get_middle(l1, target_num):
    # 添加一个结束条件
    if len(l1) == 0:
        print('很抱歉没找到')
        return
    # 1.获取列表中间索引值
    middle_index = len(l1) // 2
    # 2.比较目标数据值与中间索引值的大小
    if target_num > l1[middle_index]:
        # 切片保留列表左边一半
        right_l1 = l1[middle_index + 1:]
        print(right_l1)
        # 针对右边一半的列表继续二分并判断>>>:得用递归函数
        return get_middle(right_l1, target_num)
    elif target_num < l1[middle_index]:
        # 切片保留列表左边一半
        left_l1 = l1[:middle_index]
        print(left_l1)
        # 针对左边一半的列表继续二分并判断>>>:得用递归函数
        return get_middle(left_l1, target_num)
    else:
        print('恭喜你 找到了!!!')
get_middle(l1, 44)
get_middle(l1, 3333)

生成式/表达式/推导式

三元表达式

语法格式为:数据值1 if 条件 else 数据值2

简化步骤1:代码简单并且只有一行 那么可以直接在冒号后面编写
name = 'qyf'
if name == 'qyf':print('大哥')
else:print('弟弟')
"""三元表达式"""
res = '大哥' if name == 'qyf' else '弟弟'
print(res)  # 大哥
"""
条件成立则使用数据值1 条件不成立则使用数据值2
当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
"""

列表生成式

name_list = ['jason', 'kevin', 'tony', 'tom', 'jerry']
给列表中所有人名的后面加上_NB的后缀
for循环
new_list = []
for name in name_list:
    data = f'{name}_NB'
    new_list.append(data)
print(new_list)
列表生成式
先看for循环 每次for循环之后再看for关键字前面的操作
new_list = [name + '_NB' for name in name_list]
print(new_list)
复杂情况
new_list = [name + '_NB'for name in name_list if name == 'jason']
print(new_list)  # ['jason_NB']
new_list = ['大佬' if name == 'jason' else '小赤佬' for name in name_list if name != 'jerry']
print(new_list)  # ['大佬', '小赤佬', '小赤佬', '小赤佬']

字典生成式

enumerate(iteration, start)函数默认包含两个参数,其中iteration参数为需要遍历的参数,比如字典、列表、元组等,start参数为开始的参数,默认为0(不写start那就是从0开始)。enumerate函数有两个返回值,第一个返回值为从start参数开始的数,第二个参数为iteration参数中的值。

s1 = 'hello world'
for i,j in enumerate(s1, start=100):
    print(i,j)
# 100 h
# 101 e
# 102 l
# 103 l
# 104 o
# 105  
# 106 w
# 107 o
# 108 r
# 109 l
# 110 d
d1 = {i:j for i, j in enumerate(s1)}
print(d1)  # {0: 'h', 1: 'e', 2: 'l', 3: 'l', 4: 'o', 5: ' ', 6: 'w', 7: 'o', 8: 'r', 9: 'l', 10: 'd'}

集合生成式

res = {i + 'lowb' for i in 'hello'}
print(res)  # {'olowb', 'elowb', 'llowb', 'hlowb'}

元组生成式

元组生成式>>>:没有元组生成式 下列的结果是生成器(后面讲)
res = (i+'SB' for i in 'hello')
print(res)  # <generator object <genexpr> at 0x0000020FEDA6AD60>
for i in res:
    print(i)
# hSB
# eSB
# lSB
# lSB
# oSB

匿名函数

没有名字的函数 需要使用关键字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, 3, 4, 5, 6]


2.max()\min()
l1 = [11, 22, 33, 44]
res = max(l1)
print(res)  # 44
d1 = {
    'zja': 100,
    'zjson': 8888,
    'berk': 99999999,
    'oscar': 1
}
print(max(d1))  # zjson  只有键参与   65~90为A~Z  97~122为a~z

def func(a):
    return d1.get(a)
res = max(d1, key=lambda k: d1.get(k))
print(res)  # berk

res = max(d1, key=func)
print(res)  # berk 调用函数func按键取值  值比大小后返回最大值所对应的键

3.reduce
reduce  传多个值 返回一个值
from functools import reduce
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = reduce(lambda a, b: a + b, l1)  # 11+22=33 33+33=66 66+44=110....
print(res) # 396

作业

# 要求: 调用上述三个函数的时候需要从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']}
}
is_login = {
    'login_status': False,  # 记录用户是否登录
    'user_access': None  # 记录登录用户的权限
}

def login_auth(func_id):
    def outer(func_name):
        def inner(*args, **kwargs):
            # 6.先校验用户是否登录
            if is_login.get('login_status'):
                # 8.也需要校验功能编号是否在当前登录的用户权限中
                if func_id not in is_login.get('user_access'):
                    print(f'您没有功能编号为{func_id}的函数执行权限')
                    return
                res = func_name(*args, **kwargs)
                return res
            # 1.先获取用户的编号
            user_id = input('请输入您的编号>>>:').strip()
            # 2.校验用户编号是否存在
            if user_id not in user_data:
                print('用户编号不存在 无法完成身份校验 请滚蛋!!!')
                return
            # 3.获取用户的用户名和密码
            username = input('请输入您的用户名>>>:').strip()
            password = input('请输入您的密码>>>:').strip()
            # 4.获取用户编号对应的真实数据进行比对
            user_dict = user_data.get(user_id)
            if user_dict.get('name') == username and user_dict.get('pwd') == password:
                # 5.登录成功之后修改字典中登录状态
                is_login['login_status'] = True
                # 6.记录当前登录用户的权限编号
                is_login['user_access'] = user_dict.get('access')
                # 7.校验当前函数编号是否在当前用户权限列表内
                if func_id in user_dict.get('access'):
                    res = func_name(*args, **kwargs)
                    return res
                else:
                    print(f'您没有功能编号为{func_id}的函数执行权限')
            else:
                print('用户名或密码错误')

        return inner
    return outer


@login_auth('1')
def func1():
    print('from func1')


@login_auth('2')
def func2():
    print('from func2')


@login_auth('3')
def func3():
    print('from func3')


func1()
func2()
func3()
posted @   小白峰  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
点击右上角即可分享
微信分享提示