首页 > 其他分享 >二分法/三元表达式

二分法/三元表达式

时间:2022-10-13 22:56:17浏览次数:47  
标签:name list 二分法 num l1 print 三元 data 表达式

算法简介

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)()


标签:name,list,二分法,num,l1,print,三元,data,表达式
From: https://www.cnblogs.com/moongodnnn/p/16790021.html

相关文章

  • python re 模块及正则表达式调用认识(1)
           最近用到正则表达式,虽然看了学习了一些,但是不成体系,没有深刻认识,所以来看官方文档学习下,进行一个半汉化的翻译吧,网上查了很多都不是特别全面,要不就不是纯粹......
  • 三元表达式以及内置函数
    算法简介及二分法三元表达式各种生成式匿名函数重要内置函数常见内置函数今日内容详细算法简介及二分法1.什么是算法 算法就是解决问题的有效方法不是所有的算......
  • 二分法及常见内置函数(部分)
    昨日内容回顾多层语法糖的顺序语法糖多层使用时,从被装饰的函数开始由下而上读取,由上而下执行。有参装饰器有参装饰器可以为装饰器提供额外的参数。defwrapper(pa......
  • 匿名函数,二分法,三元表达示
    算法简介及二分法1.什么是算法 算法就是解决问题的有效方法不是所有算法都很高效也有不合格的算法2.算法应用场景 推荐算法:比如抖音成像算法:AI相关几乎覆......
  • 算法、表达式与匿名函数
    算法简介1.什么是算法 算法就是解决问题的有效方法不是所有的算法都很高效也有不合格的算法2.算法的应用场景 推荐算法(抖音视频推送淘宝商品推送)成像算法(AI......
  • 二分法
    目录今日内容回顾今日内容详解算法简介及二分法三元表达式各种生成式匿名函数常见内置函数今日内容回顾算法简介及二分法三元表达式各种生成式匿名函数常见内置函数......
  • 二分法、三元表达式及匿名函数
    二分法、三元表达式及匿名函数目录二分法、三元表达式及匿名函数一、算法简介及二分法二、三元表达式三、各种生成式1.列表生成式2.字典生成式3.集合生成式4.元组四、匿名......
  • 算法、三元表达式、匿名函数
    算法、三元表达式、匿名函数目录算法、三元表达式、匿名函数一、算法简介1、算法的概念2、算法的应用场景二、二分法1、二分法查找思路2、二分法使用要求三、三元表达式四......
  • C++ 使用栈求解中缀、后缀表达式的值
    1.前言表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算。但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法......
  • 算法简介与函数表达式跟内置函数
    今日内容总结算法简介及二分法1.什么是算法算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机......