算法表达式匿名函数

算法简介与二分法

1.什么是算法
	算法就是解决问题的有效方法 不是所有的算法都很高效也有不合格的算法
2.算法应用场景
	推荐算法(抖音视频推送 淘宝商品推送)
    成像算法(AI相关,图片P图)等等
3.算法工程师要求
	待遇非常好 但要求也非常高
4.算法部门
	不是所有的互联网公司都养的起算法部门 只有大公司才有实力和愿意养算法人才
    算法部门类似药品研发部分
5.二分法
	是算法中最简单的算法 甚至都算不上是算法

二分法

'''
二分法使用要求
	 要求,原列表有一定规律例如下面
二分法的缺陷
	针对开头结尾的数据 查找效率很低
'''

# 要求,原列表有一定规律例如下面
l1 = [1, 2, 3, 6, 9, 16, 30, 200, 500, 1000]


# 求给定的数纯在不存在这个列表

def get_min_num(num, li_list):
    if not len(li_list):
        print('没在列表里找到')
        return
    if num == li_list[0]:  # 不知道算不算优化二分查找 查找第一个是不是
        print(f'恭喜你找到了,{num}')
        return
    if num == li_list[-1]:   # 不知道算不算优化二分查找 查找最后一个是不是
        print(f'恭喜你找到了,{num}')
        return

    mi_num = len(li_list) // 2
    if li_list[mi_num] > num:
        get_min_num(num, li_list[:mi_num])
    elif li_list[mi_num] < num:
        get_min_num(num, li_list[mi_num + 1:])
    else:
        print(f'恭喜你找到了,{num}')


get_min_num(int(input()), li_list=l1)

常见算法的原理以及伪代码

二分法、冒泡、快拍、插入、堆排、桶排、数据结构(链表 约瑟夫问题 如何判断链表是成环)


三元表达式

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

'''

各种生产式、表达式、推导式

name_list = ['1','2','3']
#给所有人后面都加__a
new_list=[]
for i in name_list:
    new_list.append(i+'__a')
普通的
#列表生产式
#先看for循环 每次for循环之后会再看for关键字前面的操作
new_list = [i+'__a' for i in name_list]
#复杂情况
new_list = [i+'__a' for i in name_list if i == '1']


new_list = ['大佬' if i == '2' else '菜鸟' for i in name_list if i != '3']

#字典生成式
s1 = 'hello world'
d1={}
for i,j in enumerate(s1,1)
	d1[i]=j
d2 = {i:j for i,j in enumerate(s1,0)}

#集合生成式

se = {i for i in 'hello'}

#元组没有生成式,只有生成器
t1 = (i+'1' for i in 'hello')
for j in t1:
    print(j)

匿名函数

没有名字的函数 需要使用关键字lambda
语法结构
	lambda 可以有参数:直接返回冒号后面的数据值
#匿名函数不单独用

常见内置函数

1.map() 映射
l1 = [1,2,3,4,5]
a = map(lambda x:x+1,l1)
print(a)
#[2,3,4,5,6]
2.max,min  # 查找最大最小值
res = max(l1)  # 第一次参数为可迭代对象,第二个是查找排序关键字,为一个函数 返回的是第一参数取的值
d1 = {
    'asd':12,
    'dasd':18,
    '123':20
}
res = max(d1,key=lambda x:d1.get(x))
3.reduce	# 出入多个值返回一个累加的值
from functools import reduce
res = reduce(l1)  # 一共三个参数,第一个为函数,第二个为可迭代对象,第三个累加默认值为0,累乘默认为1

作业

'''
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_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']}
}
islogin = []


def outer_p(data):  # 或者采用参数传递(data,num)
    def outer(func):
        def inner(*args, **kwargs):
            if not islogin:
                print('请先登录')
                user_name = input('请输入用户名')
                user_pwd = input('请输入密码')
                for k, v in data.items():
                    if v['name'] == user_name and v['pwd'] == user_pwd:
                        islogin.append(v['name'])
                        if func.__name__[-1] in v['access']:  # 这边就直接判断num in 不 in v['access']这个
                            res = func(*args, **kwargs)
                            return res
                        else:
                            print('你没有权限执行')
                else:
                    print('用户名或密码不正确')
            else:
                for k, v in data.items():
                    if v['name'] == islogin[0]:
                        if func.__name__[-1] in v['access']:  # 这边就直接判断num in 不 in v['access']这个
                            res = func(*args, **kwargs)
                            return res
                        else:
                            print('你没有权限执行')

        return inner

    return outer


@outer_p(user_data)  # 这里就变成了@outer_p(user_data,'1') 手动指定
def func1():
    print('1')
    pass


@outer_p(user_data)  # 这里就变成了@outer_p(user_data,'2') 手动指定
def func2():
    print('2')
    pass


@outer_p(user_data)  # 这里就变成了@outer_p(user_data,'3') 手动指定
def func3():
    print('3')
    pass


while True:
    func1()
    func2()
    func3()
    input('按任意键继续执行')

posted @ 2022-10-13 19:32  clever-cat  阅读(33)  评论(0编辑  收藏  举报