基础算法之二分法
1.先猜50岁 啊 猜大了
2.再猜25岁 猜小了
3.所以估计年龄在26-49之间 所以再猜一个中间值
4.周而复始 这种猜年龄的策略就是: 二分法
二分法+递归函数
l1 = [12, 21, 32, 43, 56, 76, 87, 98, 123, 321, 453, 565, 678, 754, 812, 987, 1001, 1232]
'''代码实现二分法'''
target_num = 987
def get_middle(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_middle(right_l1, target_num)
elif target_num < l1[middle_index]:
left_l1 = l1[:middle_index]
print(left_l1)
return get_middle(left_l1, target_num)
else:
print('恭喜你 找到了!!!')
get_middle(l1, 987)

二分法补充
数据必须有序 比如列表中的数字必须从小到大排序 此时才能使用
如果列表中的数字无序 就会发现二分法分不开
对于找列表中的数这个问题 如果查找的数在开头、结尾时 二分法效率低
此时还不如for循环 一个一个取出比较效率高
常见的算法: 二分法 冒泡 快排 插入 堆排 桶排
数据结构 (链表 约瑟夫问题 判断链表是否有环)
三元表达式
name = 'miku'
res = 'cute' if name == 'miku' else 'upset'
print(res)
"""
数据值1 if 条件 else 数据值2
条件成立则使用数据值1 条件不成立则使用数据值2
# 阅读的时候从中间的if条件开始阅读就好:


三元表达式适用情况
各种生成式/推导式

列表生成式
name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
new_list = []
for name in name_list:
data = f'{name}miku'
new_list.append(data)
print(new_list)
name_list = ['jason', 'kevin', 'oscar', 'tony', 'jerry']
new_list = [one + 'miku' for one 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)
注意事项

字典生成式
内置方法enumerate
for i,j in enumerate(['miku','tifa','alice','cloud']):
print(i,j)

for i, j in enumerate(['miku', 'tifa', 'alice', 'cloud'], 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
匿名函数一般不单独使用 需要配合其他函数一起用
常见内置函数
map
l1 = [1, 2, 3, 4, 5]
def func(a):
return a + 1
res = map(func, l1)
print(res)
print(list(res))
max、min
l1 = [11, 22, 33, 44]
res = max(l1)
d1 = {
'zj': 100,
'jason': 8888,
'berk': 99999999,
'oscar': 1
}
print(max(d1))
d1 = {
'zj': 100,
'jason': 8888,
'berk': 99999999,
'oscar': 1
}
res = max(d1, key=lambda k: d1.get(k))
print(res)

reduce
from functools import reduce
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = reduce(lambda a, b: a + b, l1)
print(res)
res2 = reduce(lambda a, b: a + b, l1,100)
print(res2)