Welcome to kimi's blog

算法和匿名函数

算法

算法简介及二分法

算法

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):
    if len(l1)==0:
        print('找不到')
        return
    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

image

作业

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']}
}
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 = {'is_login':False,  # 记录用户是否登录
            'user_access':None}  # 记录登录用户的权限
def func(func_id):

    def outer(func):
        def inner(*args,**kwargs):
            # 6.先校验用户是否登录
            if is_login.get('is_login'):
                # 8.也需要校验功能编号是否在当前登录的用户权限里
                if func_id not in is_login.get('user_access'):
                    print(f'您没有功能权限{func_id}的函数执行')
                    return
                res = func(*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 username == user_dict.get('name') and password == user_dict.get('pwd'):
                #5.登录成功之后修改用户状态
                is_login['is_login'] = True
                # 6.记录当前登录用户的权限编号
                is_login['user_access'] = user_dict.get('access')
                # 7.判断当前函数编号是否在当前用户权限里
                if func_id in user_dict.get('access'):
                    res = func(*args,**kwargs)
                    return res
                else:
                    print(f'您没有功能权限{func_id}的函数执行')
            else:
                print('用户名或密码错误')

        return inner
    return outer

@func('1')
def func1():
    print('study')
@func('2')
def func2():
    print('sleep')
@func('3')
def func3():
    print('shopping')


func1()
func2()
func3()
posted @ 2022-10-13 22:01  魔女宅急便  阅读(39)  评论(0)    收藏  举报
Title