二分法

匿名 (未验证) 提交于 2019-12-02 23:48:02

一、二分法

 二分法:容器类型里面的数字必须有大小顺序,然后查找元素的时候一分为二,以中间为界看元素在哪边,多次二分后即可找到,提升效率
野生二分法:取名不能见名知意!!!#在列表中找某个元素

 

#在列表中找某个元素 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初始值  第一个参数

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!