二分法、三元表达式、生成式、匿名函数

二分法

  1. 什么是算法

    ​ 算法类似于数学公式,是用来解决问题的高效方法
    在这里插入图片描述

  2. 二分法

l = [11, 23, 43, 57, 68, 76, 81, 99, 123, 321, 432, 567, 666, 712, 899, 999, 1111]
# 第一种方式  直接for循环从左往右依次查找

# 第二种方式  二分法
"""
二分法能够使用的场景  数据集必须有序(要么递增 要么递减)
"""
def dichotomy(num, l):
    # 判断列表中是否还有元素
    if len(l) == 0:
        print('没找到')
       	return
    # 先获取中间位置索引
    middle_num = len(l) // 2
    # 判断中间索引对应的值比目标值大还是小
    if num > l[middle_num]:
        # 说明要找的元素只可能在列表的右侧
        l = l[middle_num+1:]
    elif num < l[middle_num]:
        # 说明要找的元素只可能在列表的左侧
        l = l[:middle_num]
    else:
        print('找到了',num)
        return
    dichotomy(num, l)

在这里插入图片描述

三元表达式、生成式

三元表达式

三元表达式是python为我们提供的一种简化代码的解决方案,语法如下

res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值
def max1(x,y):
    if x > y:
        return x
    else:
        return y
# 可以利用三元表达式简化
def my_max(x, y):
    return x if x > y else y

"""
条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值
三元表达式尽量不要嵌套使用

当功能需求仅仅是二选一的情况下 那么推荐使用三元表达式
"""

在这里插入图片描述

列表生成式

列表生成式也是python解释器给我们提供的一种用于简化代码,快速生成列表的方法

name_list = ['jason', 'kevin', 'tony', 'jerry']
'给列表中所有人名加上_DSB后缀'
方案1:
# 1. 定义一个空列表
new_list = []
# 2.for循环老列表
for name in name_list:
    # 3. 给名字加上后缀
    new_name = '%s_DSB'%name
    # 4. 添加到新的列表中
    new_list.append(new_name)
print(new_list)

方案2:列表生成式
res = ['%s_DSB'%name for name in name_list]
'进阶玩法:可以加上一个if判断 但是不能有else'
res = ['%s_DSB'%name for name in name_list if name != 'jsaon']

在这里插入图片描述

字典生成式

列表生成式也是python解释器给我们提供的一种用于简化代码,快速生成字典的方法

l1 = ['name', 'age', 'hobby']
l2 = ['tom', 18, 'read']
'''生成一个用户字典'''
方案1:
new_dict = {}
for i in range(len(l1)):
    new_dict[l1[i]] = l2[i]
        
方案2:字典生成式    
new_dict1 = {l1[i]:l2[i] for i in range(len(l1)}    

方案3: 枚举+字典生成式
'''
enumerate(l1)
    针对该方法使用for循环取值 每次会产生两个结果
        第一个是从0开始的数字
        第二个是被循环对象里面的元素
    还可以通过start参数控制起始位置
'''

new_dict2 = {j:l2[i] for i,j in enumerate(l1) }

在这里插入图片描述

集合生成式

除了上述两种生成式之外,还有一种集合生成式,用法同列表生成式,只是把[ ]换成{ }

res = {i for i in range(8)}

生成器

另外,值得注意的一点是,没有元组生成式,小括号括起来写的是生成器

res2 = (i for i in range(7))
print(res2)  # 内存地址

在这里插入图片描述

匿名函数

匿名函数: 没有名字的函数

  1. 需要将一个函数对象作为参数来传递时,可以直接定义一个lambda函数(作为函数的参数或返回值)

  2. 要处理的业务符合lambda函数的情况(任意多个参数和一个返回值),并且只有一个地方会使用这个函数,不会在其他地方重用,可以使用lambda函数

  3. 与一些Python的内置函数配合使用(如max map min等)

"""
语法格式
    lambda 形参:返回值
"""

# 无参数
lambda_a = lambda: 10
print(lambda_a())  # 10
 
# 一个参数
lambda_b = lambda num: num * 10
print(lambda_b())  # 50
 
# 多个参数
lambda_c = lambda a, b, c, d: a + b + c + d
print(lambda_c(1, 2, 3, 4))  # 10
 
# 表达式分支
lambda_d = lambda x: x if x % 2 == 0 else x + 1
print(lambda_d(6))  # 6

# 联合map使用
l = [1, 2, 3, 4, 5]
print(list(map(lambda x:x**2, l)))  # [1, 4, 9, 16, 25]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go&Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值