二分法
-
什么是算法
算法类似于数学公式,是用来解决问题的高效方法
-
二分法
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) # 内存地址
匿名函数
匿名函数: 没有名字的函数
-
需要将一个函数对象作为参数来传递时,可以直接定义一个lambda函数(作为函数的参数或返回值)
-
要处理的业务符合lambda函数的情况(任意多个参数和一个返回值),并且只有一个地方会使用这个函数,不会在其他地方重用,可以使用lambda函数
-
与一些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]