• 欢迎光临~

二分法/三元表达式

开发技术 开发技术 2022-10-13 次浏览

算法简介

1.什么是算法?
算法就是帮助我们解决问题的有效方法,例如我们自己想去哪里,我们的脑子就自动开始思考,路程怎么样,先去哪里再去哪里,这就是我们人脑的计算。
2.实际算法应用场景
  日常生活中算法无处不在
  举例:我们浏览淘宝,淘宝会根据我们搜索的关键词 分析你的喜好进行推荐
  平时刷抖音,抖音通过我们看的视频然后用算法分析出你的喜好然后投喂给你
  包括导航,通过算法计算路段是否堵车,分析路线等等
3.如果创造算法
  算法开发难度还是非常高的,需要扎实的数学功底,以及大量的理论知识 通过不断的调试开发,当然算法工程师待遇也是非常好,属于高端人才。
4.算法部门
  对于互联网行业来说,由于算法开发过程不易,成本比较高。所以只有大型互联网公司才会有这个岗位,类似 药品研发等,需要大量时间去调适钻研。
   

基础算法—二分法

1.什么是二分法?
  就是通过一分为二的方式,查询数据,不断的分割判断从而最终找寻到你要的数据。
2.二分法使用条件
  必须满足待查找的数据集是有序的 从大到小 或者从小到大
3.代码展示:
	l1 = [11,23,42,54,231,234,435,656,887,1554,3345,6544,6765,66567,45345]
  #在列表中查询你要的数据 例如1554
  #发现此列表符号二分法必要条件,数据集有序的 可以看到从大到小的。
  
  #1.原始方法 for 循环
    for i in l1:
        if i == 1554:
            print(i)
  #这种方法也可以找到,但是加入我们的列表中有成千上万的数据,for循环就不可以了
  
  '''
  二分法的具体逻辑,当我们需要找列表中的某个数据,我们先把整个列表一分为2,然后用中间值去跟我们要找的值对比,如果比他小那就是在左半部列表,如果比他大就是右版本列表,然后再把缩小范围的列表再次一分为二,从而得到我们要找的值
  '''
#由于二分法的做法符合递归函数逻辑,我们代码展示
target_num = 42

def middle_index(l1,target_num):
    if len(l1) == 0:          # 设置一个递归函数终止条件,当列表没有数据时终止
        print('暂无此数字')
        return
    middle_num = len(l1) // 2    #取到一个列表中间数值位置
    if target_num > l1[middle_num]:  #判断找到数字和中间数据大小,找的数字大
        right_l1 = l1[middle_num+1:]  #保留找的数字大,说明在后面,保留后面的列表
        #根据列表切片知识 
        print(right_l1)
        return middle_index(right_l1,target_num) #把保留的列表再次进行二分处理
    elif target_num < l1[middle_num]:   #判断数字比中间数值小的时候
        left_num = l1[:middle_num]    #找的数字小,说明在前面
        print(left_num)
        ## 针对左边一半的列表继续二分并判断 >>>: 感觉要用递归函数
        return middle_index(left_num,target_num)  
    else:
        print('找到了')

middle_index(l1,target_num) #[11, 23, 42, 54, 231, 234, 435][11, 23, 42][42]
#每一次分割的
  

三元表达式

1,三元表达式的作用
可以使我们的代码运行效率更高,代码更加简化。
2. 什么时候使用三元表达式
当结果时二选一的情况下,使用三元表达式比较简单
3.代码展示
#普通代码
name = input('请输入姓名')
if name =='moon':
  print('大哥好')
else:
  print('你谁啊')
  
#三元表达式
res = '大哥好' if name == 'moon' else '你谁啊'
print(res)
  
实现的功能都是一样的,但是三元表达式的效率更高哦

代码格式:
变量名 = 成立输出 if 判断条件 else 错误输出

age = 20
if age < 18:
  print('未成年')
else:
  print('成年了哦')
  
age = '未成年'  if age < 18 else '成年了哦'

print(age)


"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2

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

列表表达式

name_list = ['moon', 'kevin', 'oscar', 'tony', 'jerry']
#目前有一个需求 给列表内所有元素加上‘优秀’
1.常规我们可以用到for循环处理
new_list = []
for i in name_list:
    #应该了多次循环添加 效率不高
    new_list.append(i+'优秀')
name_list = new_list
print(name_list)

2.使用列表表达式:
name_list = [i+'优秀' for i in name_list ]   # i 为for循环的临时变量 
print(name_list)  
#跟上面的结果是一样的   

num_list = [1,2,3,4,5,6,7]
#目前需求 给列表中的每个数据加2
num_list = [ num + 2 for num in num_list]
print(num_list)


3.列表表达式复杂情况:
num_list = [i+100 for i in num_list if i == 5]
print(num_list)  # 105 当i等于5时 加100
#还可以在后面添加if条件,当if条件成立时才执行

num_list = [i+100 if i == 5 else i-100 for i in num_list if i != 7]
print(num_list)
#这里也是一样的,我们之间把最后一个if 前面的看为一体,最后一个if是判断元素是否可以进去前面的运算, 这里的意思是 在i不等于7时,去进行 (i+100 if i == 5 else i-100)

字典表达式

dict1 = 'moon'
# enumerate作用:当你在for循环可遍历数据时 可记录你循环的次数

for i,j in enumerate(dict1):
    print(i,j)

dict1 = {i:j for i,j in enumerate(dict1)}
print(dict1)

#字典式在字典中,先写出自己想要的结果,然后后面跟上for循环 


集合生产式

dict1 = {i for i in dict1}
print(dict1) 

匿名函数

没有名字的临时函数,可以使用关键字 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模式简单看看'''
  有下列用户数据
    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']}
}
user_status = 0  #全部变量 目前代表未登录


def outer_plus(func_num):    #接收功能编号传参, 以便以后判断 此功能用户是否有权限执行
    def outer(func):         #功能的函数名
        def inner(*args, **kwargs):
            global user_status
            if user_status == 0:   #判断用户全局登录状态
                name = input('请输入账号')
                password = input('请输入密码')
                for data in user_data:    # 使用变量data 循环遍历 user_data
                    small_data = user_data[data]   # 这时候的small_data 就等于 每一个{'name': 'oscar', 'pwd': '222', 'access': ['1']}
                    real_name = small_data['name']   #判断 名字密码
                    real_pass = small_data['pwd']
                    if name == real_name and password == real_pass:
                        print('登录成功')
                        print(f'欢迎你{name}')
                        user_status = data    #登录成功以后改变了全局用户登录状态  这里的data 就是用户的编号
                        ret = small_data['access']    #搞一个变量去接收 小字典中的access
                        print(f'您好{name}您可以执行功能{ret}')
                        if func_num in ret:         #判断函数功能需要是否在 账号可执行范围中 在就行执行
                            res = func(*args, **kwargs)
                            return res
                        else:
                            print('您暂时没有权限')  #不在就返回没有权限
            else:  #用户全局状态不是未登录 
                if func_num in user_data[user_status]['access']:   #判断函数功能需要是否在 账号可执行范围中 在就行执行
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('您暂时没有权限')



        return inner

    return outer


@outer_plus('1')
def func1():
    print('我是功能1')

@outer_plus('2')
def func2():
    print('我是功能2')


@outer_plus('3')
def func3():
    print('我是功能3')
# func1()
# func2()
# func3()
func_dict = {
    '0': quit,
    '1': func1,
    '2': func2,
    '3': func3,
}
while True:
    choice = input('功能序号:').strip()
    if choice in func_dict:
        func_dict.get(choice)()


程序员灯塔
转载请注明原文链接:二分法/三元表达式
喜欢 (0)