首页 > 编程语言 >算法、三元表达式、匿名函数

算法、三元表达式、匿名函数

时间:2022-10-13 20:35:33浏览次数:46  
标签:name res list 匿名 l1 print 三元 表达式

算法、三元表达式、匿名函数

目录

一、算法简介

1、算法的概念

简单来说,算法就是解决一个问题的具体步骤。算法是程序的灵魂。

程序 = 算法 + 数据结构

2、算法的应用场景

  • 推荐算法:抖音视频推送,淘宝商品推送
  • 成像算法(AI相关)

二、二分法

二分法,也称折半法,是一种在有序数组中查找特定元素的搜索算法。

1、二分法查找思路

1、首先,从数组中间元素开始搜索,如该元素正好是目标元素,则搜索过程结束,否则执行下一步。

2、如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域寻找,然后重复步骤1的操作。

3、如某一步数组为空,则表示找不到目标元素。

2、二分法使用要求

1、待查找的数据集必须有序
2、缺陷:针对开头结尾的数据,查找效率很低

eg:
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
# target_num = 987,设定目标元素
def get_mid(l1,target_num):# 
    if len(l1) == 0:  # 添加结束条件
        print('抱歉,没有找到')
        return
    middle_index = len(l1) //2 # 获取列表中间索引值
    if target_num > l1[middle_index]: # 比较目标数据值与中间索引值的大小
        right_l1 = l1[middle_index + 1:] # 切片保留列表右边一半
        print(right_l1)
        return get_mid(right_l1,target_num)# 对右边列表继续二分并判断,感觉要用递归函数
    elif target_num < l1[middle_index]:
        left_l1 = l1[:middle_index]# 切片保留列表左边一半
        print(left_l1)
        return get_mid(left_l1,target_num)# 对右边列表继续二分并判断,感觉要用递归函数
    else:
        print('找到了')


get_mid(l1,987)
# 输出结果
[453, 565, 678, 754, 812, 987, 1001, 1232]
[987, 1001, 1232]
[987]
找到了

get_mid(l1,2000)
# 输出结果
[453, 565, 678, 754, 812, 987, 1001, 1232]
[987, 1001, 1232]
[1232]
[]
抱歉,没有找到

get_mid(l1,12)
# 输出结果
[12, 21, 32, 43, 56, 76, 87, 98, 123]
[12, 21, 32, 43]
[12, 21]
[12]
找到了

三、三元表达式

有三个三元运算符组成的式子我们称为三元表达式。

  • 语法结构: 条件表达式?表达式1:表达式2

    问号前面的位置是判断的条件,判断结果为bool型,为True时调用表达式1,False时调用表达式2。

  • 执行思路:如果条件表达式结果为真执行表达式1,表达式结果为假就返回表达式2的值。

     if(num>5){
                result='是的';
           }else{
              result='不是';
           }
    

# 简化步骤1:代码简单并且只有一行 那么可以直接在冒号后面编写
name = 'jason'
if name == 'jason':print('老师')
else:print('学生')

三元表达式
res = '老师' if name == 'jason' else '学生'
print(res)
"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2

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

四、各种生成式、表达式、推导式

# name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
# 给列表中所有人名的后面加上_NB的后缀
# for循环
 new_list = []
 for name in name_list:
     data = f'{name}_NB'
     new_list.append(data)
 print(new_list)
# 列表生成式
# 先看for循环,每次for循环之后再看for关键字前面的操作
 new_list = [name + "_NB" for name in name_list]
 print(new_list)
# 复杂情况
# new_list = [name + "_NB" for name in name_list if name == 'jason']
# print(new_list)
# new_list = ['大佬' if name == 'jason' else '小赤佬' for name in name_list if name != 'jack']
# print(new_list)


# 字典生成式
 s1 = 'hello world'
 for i,j in enumerate(s1,start=100):
     print(i,j)
 d1 = {i: j for i, j in enumerate('hello')}
 print(d1)
    
# 集合生成式
 res = {i for i in 'hello'}
 print(res)

# 元组生成式>>>:没有元组生成式 下列的结果是生成器(后面讲)
 res = (i+'SB' for i in 'hello')
 print(res)
 for i in res:
     print(i)

五、匿名函数

没有名字的函数,需要使用关键字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模式简单看看'''

标签:name,res,list,匿名,l1,print,三元,表达式
From: https://www.cnblogs.com/zhiliaowang/p/16789541.html

相关文章