常见算法及表达式

常见算法及表达式

  • 算法之二分法
  • 三元表达式
  • 各种生成式
  • 匿名函数
  • 重要的内置函数
  • 常见的内置函数

算法简介之二分法

  1. 算法简单理解就是解决某些特定场景的特定方法
  2. 常见的算法有,二分法,冒泡,排序,红黑树,B+Tree

算法的应用场景:

  1. 淘宝搜索产品后会一直推荐同产品给用户,这是淘宝的推荐算法
  2. 抖音,用户在使用抖音时,算法会将每个视频分类,具有相同喜欢视频类型的人群分类,从而实现对视频和人群进行不同的流量推送

二分法

  1. 二分法使用,待查找的数据集必须有序
  2. 二分法的缺陷,如果结果数据再初始位置,或者末尾位置,效率很低

基础原理:
对需要处理的数据进行中间值一分为二,对比需要查找的结果值,与前后两位值对比,如果结果值闭前者小,则对前面的数据再次进行二分处理依次类推,若结果值比前者大,则用二分的方式对后续的数据进行处理。

python实现二分法

# 需要在以下数据中找到987
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]

def look(l1, res_num):
    median = len(l1) // 2
    # 判断,列表中的索引的值是否大于传入的值
    if res_num > l1[median]:
        # 如果大于,将原列表中的后面的值取出赋值为new_list
        new_list = l1[median:]
        # 返回函数重新调用
        return look(new_list, res_num)

    elif res_num < l1[median]:
        new_list = l1[:median]
        return look(new_list, res_num)
    else:
        print('找到了')


look(l1, 21)


  • 三元表达式

主要作用为简化代码

  1. 语法为: 数据1 if 条件 else 数据值2
  2. 条件成立执行数据值1,条件不成立使用数据值2
  3. 一般都只是用作if判断只有成立和不成立的时候
# 三元表达式,简化代码
# 原代码
name = 'wesley'
if name == 'wesley':
    print('大哥')
else:
    print('小老弟')
# 三元表达式
name = 'wesley'
res = 'wesley' if name == 'wesley' else print('小老弟')
print(res)

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

列表生成式

# 给列表中所有人名的后面加上_NB的后缀
name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']

# 原代码
# 定义一个新列表
new_list= []
# 使用for循环处理数据后使用append追加到新的字典
for i in name_list:
    data = f'{i}_NB'
    new_list.append(data)
print(new_list)

#------------使用列表生成式-------------
name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
new_list = [name + '_NB' for name in name_list]
print(new_list)

['jason_NB', 'kevin_NB', 'oscar_NB', 'tony_NB', 'jerry_NB']

"""
1. 先看for循环,等待for循环结束后再看前面的关键字name
2. 最后将至赋予外面的新列表
"""
#----------列表生成器的复杂使用-----------
1. 
name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
new_list = [  name + '_NB' for name in name_list if name == 'jason' ]
print(new_list)
['jason_NB']

"""
new_list = [  name + '_NB' for name in name_list if name == 'jason' ]
1. []里面先看for
2. 循环name_list这个列表,并判断如果name=jason就交给
3. for前面处理,结果也就是jason+NB
4. 剩下的如果不是jason就丢取掉
"""
2.
name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']

new_list = ['大佬' if name == 'jason' else '小赤佬' for name in name_list if name != 'jack']
print(new_list)

['大佬', '小赤佬', '小赤佬', '小赤佬', '小赤佬']

"""
代码2. 依旧是先执行for,然后在判断如果name等于jason输出大佬
其他情况输入
"""
  • 字典生成式

扩展:
enumerater() 内置函数使用可以给数据添加从0开始的序号,但不是改数据的索引

s1 = 'hello'
for i, j in enumerate(s1, 100):
    print(i, j)

"""
这会循环hello并回从100 开始给每个值编序号
"""


字典生成式的使用
s1 = 'hello'
d1 = {i: j for i, j in enumerate(s1)}
print(d1)

"""
1. 先执行for循环并给s1编上序号,再赋值给前面并返回
"""
  • 集合生成式

和上面的使用方法都是一样的

res = {i for i in  '1234'}
print(res)
{'2', '1', '4', '3'}
  • 生成器(元组没有生成式,接下来是生成器)
res = (i+'SB' for i in 'hello')
for i in res:
    print(i)
  • 匿名函数
  1. 没有名字的函数,需要使用关键字lambda
1. lambda 语法
lambda 形参:返回值
2. 使用场景
lambda a,b:a + b
注意: 匿名函数一般不单独使用,需要配合其他函数一起用
  • 常见内置函数
1. map() 映射
l1 = [1, 2, 3, 4, 5]
res = map(lambda a:a+1, l1)
print(list(res))
[2, 3, 4, 5, 6]

"""
1.通过map函数将修改后的数据与l1对应,并转list类型打印
"""



2. max() 取最大, min() 取最小 
# 选出数据中最大的值
l1 = [11, 22, 33, 44]
res = max(l1)
print(res)
44

3. max()  # 对数据的使用需要对比数据值
d1 = {
    'zj': 100,
    'jason': 8888,
    'berk': 99999999,
    'oscar': 1
}
def func(a):
    return d1.get(a)

res = max(d1, key=func)
print(res)

"""
1. 在比对时需要调用字典中的值做对比,然后max会通过值对比完成后返回结果给res
"""

4. reduce  # 传入多个值,返回一个值
from functools import reduce

l1 = [11, 22, 33, 44, 55, 66, 77, 88]

res = reduce(lambda a, b: a * b, l1)
print(res)

8642950081920
  • 联系题
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']}
}

'''
1.先编写校验用户身份的装饰器
2.然后再考虑如何保存用户登录状态
3.再完善各种需求
'''

#  9. 函数执行结束需要记录用户的登录状态,和当前用户权限存储
is_login = {
    'is_login': False,
    'access': []
}


def auth_user(fund_id):
    def outer(func_name):
        def inner(*args, **kwargs):
            # 10. 获取用户现在是否已经登录
            if is_login.get('is_login'):
                access = is_login.get('access')
                #  11. 判断当前用户编号是否在用户权限内
                if fund_id in access:
                    res = func_name(*args, **kwargs)
                    return res
            else:
                # 1. 获取用户省份ID
                user_id = input('请输入你的身份ID:   ').strip()
                # 2. 判断用户ID是否存在
                if user_id in user_data:
                    #  3. 如果用户ID存在需要获取用户名密码
                    username = input('请输入用户名密码: ').strip()
                    password = input('请输入您的密码: ').strip()
                    #  4. 根据用户编号获取用户的真实信息
                    read_dict = user_data.get(user_id)
                    #  5. 判断用户登录信息
                    if username == read_dict.get('name') and password == read_dict.get('pwd'):
                        #  6. 获取当前用户可以执行的功能编号
                        access = read_dict.get('access')  # [1 2]
                        #  10. 记录当前用户的执行权限
                        is_login['is_login'] = True
                        is_login['access'] = access
                        #  7. 判断当前用户是否拥有当前被装饰函数的执行权限,假设当前装饰器的功能编号是fund_id
                        if fund_id in access:
                            #  8. 用户拥有该函数执行权限
                            res = func_name(*args, **kwargs)
                            return res
                        else:
                            print(f'你当前没有{fund_id}执行权限')
        return inner
    return outer



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

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

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

func1()
func2()
func3()


posted @ 2025-03-13 13:43  樵夫-  阅读(18)  评论(0)    收藏  举报