算法简介及二分法、三元表达式、匿名函数、内置函数max、map、reduce

作业讲解

1.利用有参装饰器编写多种用户登录校验策略
# 1.利用有参装饰器编写多种用户登录校验策略
"""
1.直接写死的  jason 123
2.数据来源于列表 ['jason|123','kevin|321','tony|222']
3.数据来源于文件 jason|123\n tom|321\n
"""
def login_auth(condition):
    def outer(func_name):
        def inner(*args, **kwargs):
            # 获取用户名和密码
            username = input('username>>>:').strip()
            password = input('password>>>:').strip()
            # 判断校验的策略
            if condition == 'absolute':
                if username == 'jason' and password == '123':
                    res = func_name(*args, **kwargs)
                    return res
                else:
                    print('用户名或密码错误')
            elif condition == 'list_type':
                user_list = ['jason|123', 'tony|321', 'kevin|222']
                user_data = f'{username}|{password}'
                if user_data in user_list:
                    res = func_name(*args, **kwargs)
                    return res
                else:
                    print('用户名或密码错误')
            elif condition == 'file_type':
                with open(r'userinfo.txt', 'r', encoding='utf8') as f:
                    for line in f:
                        real_name, real_pwd = line.split('|')
                        if real_name == username and real_pwd.strip('\n') == password:
                            res = func_name(*args, **kwargs)
                            return res

        return inner

    return outer

@login_auth('absolute')
def index(*args, **kwargs):
    print('from index')

@login_auth('list_type')
def func(*args, **kwargs):
    print('from func')

@login_auth('file_type')
def foo(*args, **kwargs):
    print('from foo')

# index()
# func()
foo()

2.利用递归函数依次打印列表中每一个数据值
	l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
	# 2.利用递归函数依次打印列表中每一个数据值
	l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
    """
    1.for循环l1里面的数据值
    2.如果是数字 则打印
    3.如果是列表 则循环
    4.for循环小列表里面的数据值
    5.如果是数字 则打印
    6.如果是列表 则循环
    7.for循环小小列表里面的数据值
    8.如果是数字 则打印
    9.如果是列表 则循环
    """

    # print(isinstance(123, int))  # 判断第一个数据值是不是属于第二个参数指定的数据类型
    # print(isinstance(123, str))  # 判断第一个数据值是不是属于第二个参数指定的数据类型
    def get_num(l1):
        for i in l1:  # 递归函数需要结束条件 这里巧在for循环接收到空的能够被for循环的数据时 自动不执行
            if isinstance(i,int):
                print(i)
            else:
                return get_num(i)

    get_num(l1)

算法简介及二分法

1.什么是算法
	算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法
2.算法应用场景
	推荐算法(抖音视频推送 淘宝商品推送)
	成像算法(AI相关)......
 	几乎涵盖了我们日常生活中的方方面面
3.算法工程师要求
	待遇非常好 但是要求也非常高
4.算法部门
	不是所有的互联网公司都养得起算法部分 只有大型互联网公司才有
	算法部门类似于药品研发部分
5.二分法
	是算法中最简单的算法 甚至都称不上是算法
    
"""
二分法使用要求
    待查找的数据集必须有序
二分法的缺陷
    针对开头结尾的数据 查找效率很低
常见算法的原理以及伪代码
    二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何链表是否成环)
"""
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
# 查找列表中某个数据值
# 方式1:for循环  次数较多
# 方式2:二分法 不断的对数据集做二分切割
'''代码实现二分法'''
# 定义我们想要查找的数据值
# target_num = 987


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, 987)
# get_middle(l1, 2000)
# get_middle(l1, 12)

三元表达式

# 简化步骤1:代码简单并且只有一行 那么可以直接在冒号后面编写
name = 'jason'
# if name == 'jason':print('老师')
# else:print('学生')
# 三元表达式
res = '老师' if name == 'jason' else '学生'
print(res)
"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2

当结果是二选一的情况下 使用三元表达式较为简便
并且不推荐多个三元表达式嵌套
"""

各种生成式/表达式/推导式

# name_list = ['jason', 'kevin', 'oscar', 'tony', '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)
# new_list = ['大佬' if name == 'jason' else '小赤佬' for name in name_list if name != 'jack']
# print(new_list)


# 字典生成式
# s1 = 'hello world'
# for i,j in enumerate(s1,start=100):
#     print(i,j)
# d1 = {i: j for i, j in enumerate('hello')}
# print(d1)
# 集合生成式
# res = {i for i in 'hello'}
# print(res)
# 元组生成式>>>:没有元组生成式 下列的结果是生成器(后面讲)
# res = (i+'SB' for i in 'hello')
# print(res)
# for i in res:
#     print(i)

匿名函数

没有名字的函数 需要使用关键字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模式简单看看'''

作业

# 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']}
# }
# 并有三个函数
# 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_login = {
    "name": None,
    "is_login": None,
    "access": None,
    "id":None,
}


def myinput():
    name = input("name>>>").strip()
    pwd = input("pwd>>>").strip()
    return name, pwd


def myde(mode):
    def outer(func):
        def inner(*args, **kwargs):
            if user_login["name"] == None and user_login["is_login"] == None:
                print("还未登录,需要先登录!")
                name, pwd = myinput()
                for user in user_data:
                    if user_data.get(user)["name"] == name and user_data.get(user)["pwd"] == pwd:
                        user_login["name"] = name
                        user_login["is_login"] = pwd
                        user_login["id"] = user
                        access = user_data.get(user)["access"]
                        user_login["access"] = access
                        print("登录成功!")
                        if mode in all_fun:
                            access_lt = user_login["access"]
                            if mode in access_lt:
                                res = func(*args, **kwargs)
                                return res
                            else:
                                print("该用户权限不够,无法使用该功能!")
                                return
                        else:
                            print("该模式不存在!")
                            return

                else:
                    print("用户名密码错误,回到上一级!")
                    return
            else:
                if mode in all_fun:
                    access_lt = user_login["access"]
                    if mode in access_lt:
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print("该用户权限不够,无法使用该功能!")
                        return
                else:
                    print("该模式不存在!")
                    return


        return inner

    return outer


@myde("1")
def func1():
    print("func1功能")


@myde("2")
def func2():
    print("func2功能")


@myde("3")
def func3():
    print("func3功能")



def login():
    name, pwd = myinput()
    for user in user_data:
        if user_data.get(user)["name"] == name and user_data.get(user)["pwd"] == pwd:
            user_login["name"] = name
            user_login["is_login"] = pwd
            access = user_data.get(user)["access"]
            user_login["access"] = access
            print("登录成功!")


all_fun = {
    "1": func1,
    "2": func2,
    "3": func3,
    "4": login,
}


def run(c):
    if c in all_fun:
        t_fun = all_fun.get(c)
        t_fun()


if __name__ == '__main__':
    while True:
        print("""
            1.func1
            2.func2
            3.func3
            4.loign
            """)
        c = input("c>>>")
        run(c)
posted @ 2022-10-13 17:23  虾仁猪心排骨汤  阅读(81)  评论(0编辑  收藏  举报