一、二分法
二分法:容器类型里面的数字必须有大小顺序,然后查找元素的时候一分为二,以中间为界看元素在哪边,多次二分后即可找到,提升效率
野生二分法:取名不能见名知意!!!#在列表中找某个元素
#在列表中找某个元素 l = [1,3,5,12,57,89,101,123,146,167,179,189,345] def get_num(l,target_num): if not l: print('你给的工资 这个任务怕是没法做') return # 获取列表中间的索引 print(l) middle_index = len(l) // 2 # 判断target_num跟middle_index对应的数字的大小 if target_num > l[middle_index]: # 切取列表右半部分 num_right = l[middle_index + 1:] # 再递归调用get_num函数 get_num(num_right,target_num) elif target_num < l[middle_index]: # 切取列表左半部分 num_left = l[0:middle_index] # 再递归调用get_num函数 get_num(num_left, target_num) else: print('find it',target_num) get_num(l,189)
二分法标准写法 二、表达式
1.三元表达式
三元表达式固定表达式 值1 if 条件 else 值2 条件成立返回 值1 条件不成立返回 值2 x = 100 y = 200 res = x if x > y else y # x | if x>y else| y 三部分 ,中间成立返回x,不成立返回y print(res) #200
2.列表生成式
快速生成
test = ['abc','bcd','cde','ddd'] res = ['%s_xx'%name for name in test] print(res) #['abc_xx', 'bcd_xx', 'cde_xx', 'ddd_xx'] test1 = ['abc_xx', 'bcd_xx', 'cde_xx', 'ddd_xx','eee'] res = [name for name in test1 if name.endswith('xx')] print(res) #['abc_xx', 'bcd_xx', 'cde_xx', 'ddd_xx']
列表生成式 3.字典生成式
#常规 goods_list = ['apple','banana','cucumber','pear'] price_list = [10,20,30,40] goods_dict = {} for index,price in enumerate(price_list): #枚举 输出索引和元素 goods_dict[goods_list[index]] = price print(goods_dict) #生成式 goods_list = ['apple','banana','cucumber','pear'] goods_dict = {index:good for index,good in enumerate(goods_list)} print(goods_dict) #{0: 'apple', 1: 'banana', 2: 'cucumber', 3: 'pear'} goods_list = ['apple','banana','cucumber','pear'] goods_dict = {index:good for index,good in enumerate(goods_list) if good == 'cucumber'} print(goods_dict) #{ 2: 'cucumber'}
4.元组、集合
#集合生成式 res = {i for i in range(10) if i != 4} print(res) #{0, 1, 2, 3, 5, 6, 7, 8, 9} #元祖比较特殊,生成老母猪 res1 = (i for i in range(10) if i != 4) # 这样写不是元组生成式 而是生成器表达式(老母猪) print(res1) #<generator object <genexpr> at 0x0000000001E00EB8>
三、匿名函数
1.匿名函数的特点: 临时存在用完就没了,通常不会单独使用,是配合内置函数一起使用
2.形式: (lambda x,y:x+y)(a,b) #相当于(函数名)(加括号并传参) :左边x,y的相当于函数的形参 :右边x+y的相当于函数的返回值 a,b 相当于实参 def my_sum(x,y): return x + y print(my_sum(1,5)) #6 res = (lambda x,y:x+y)(5,1) print(res) #6
四、常用内置方法
1.字母大小比较 print(chr(97)) #查询编码表中相应编号对应字符 A-Z 65 90 a-z 97 122 #中间断开为特殊字符 2.max(*args, key=None) 函数内部可以传入可调用对象和一个函数,函数不写默认比较前面的东西,写了key=func,则比较函数func的内部返回值 l = [1,2,3,4,5] print(max(l)) # 内部是基于for循环的 d = { 'egon':30000, 'jason':88888888888, 'nick':3000, 'tank':1000 } print(max(d)) #tank 没有传入函数则比较字典的key的首字母 #使用函数 def index(name): return d[name] print(max(d, key=index)) #jason 传入index函数,则比较函数内部返回值 #使用匿名函数 print(max(d,key=lambda name:d[name]))
k = [1,2,3,4,5,6] print(list(map(lambda x:x+2,k))) #[3, 4, 5, 6, 7, 8] #基于for循环 ,从k中每次取出一个元素x,执行x+2 # map(lambda x:x+2,k) 是一个老母猪 ,加上list转化为列表
l1 = [1,2] l2 = ['jason','egon','tank'] l3 = ['a','b','c'] print(list(zip(l1,l2))) #[(1, 'jason'), (2, 'egon')] print(zip(l1,l2,l3)) #<zip object at 0x00000000027CE708> 老母猪 print(list(zip(l1,l2,l3))) #[(1, 'jason', 'a'), (2, 'egon', 'b')]
k = [1,2,3,4,5,6] print(list(filter(lambda x:x != 3,k))) # [1, 2, 4, 5, 6] #基于for循环,依次从k中取出元素,如果:后面条件成立返回结果,不成立跳过
k = ['jason','egon','nick','tank'] print(sorted(k)) #['egon', 'jason', 'nick', 'tank'] 从小到大 print(sorted(k,reverse=True)) #['egon', 'jason', 'nick', 'tank'] 从大到小
rom functools import reduce #调用模块 k = [1,2,3,4,5,6] print(reduce(lambda x,y:x+y,k)) # 21 没有初始值时第一次先拿出来两个元素相加,之后每次拿出一个与之前相加的结果再相加 print(reduce(lambda x,y:x+y,k,10)) # 31 传入参数10初始值 第一个参数