1.复习
1 1.只要和计算时间有关的,一定放在离func最近的地方 2 2.range本身是 迭代器 3 3.生成器和迭代器的本质是一样的 一般是想取所有值,又不同一时间出现在内存中 4 4.迭代器--可以被for循环 本质:节省内容空间 没有索引取值的概念 ---公式 5 5.生成器:python内部提供的;yield函数 执行生成器函数,得到一个生成器,不会执行这个函数中的代码!! 有几个yield,就能从中取出几个值 6 生成器表达式:也会返回一个生成器,不会直接被执行 7 注意:!!! 8 1.每一个生成器都会从头开始取值,当取到最后的时候,生成器中就没有值了 9 2.一个生成器只能用一次 10 例子 11 不明白打印id 12 装饰器、生成器可先放一放、刷题看!框架项目作业 找工作前,再刷一次面试题 13 6.内置、匿名 14 5个常考(map、filter、sorted、max、min) 15 filter 3种写法。。。(+lambda) 自己复习!

1 # 装饰器的进阶 2 # 给装饰器加上一个开关 - 从外部传了一个参数到装饰器内 3 # 多个装饰器装饰同一个函数 - 套娃 4 # 每个装饰器都完成一个独立的功能 5 # 功能与功能之间互相分离 6 # 同一个函数需要两个或以上额外的功能 7 # def wrapper1(func): 8 # def inner(*args,**kwargs): 9 # '''执行a代码''' 10 # ret = func(*args,**kwargs) 11 # '''执行b代码''' 12 # return ret 13 # return inner 14 # 15 # def wrapper2(func): 16 # def inner(*args,**kwargs): 17 # '''执行c代码''' 18 # ret = func(*args,**kwargs) 19 # '''执行d代码''' 20 # return ret 21 # return inner 22 # 23 # @wrapper1 24 # @wrapper2 25 # def func():pass 26 27 # a c func d b 28 29 # timmer login 30 # timmer logger 31 32 # 生成器和迭代器 33 # 迭代器 : iter next 34 # 可以被for循环 节省内存空间 它没有所谓的索引取值的概念 当前的值和下一个值- 公式 35 # 生成器和迭代器本质上是一样的 36 # yield函数 37 # 执行生成器函数 会得到一个生成器 不会执行这个函数中的代码 38 # 有几个yield,就能从中取出多少个值 39 # 生成器表达式 40 # 生成器表达式也会返回一个生成器 也不会直接被执行 41 # for循环里有几个符合条件的值生成器就返回多少值 42 # 每一个生成器都会从头开始取值,当取到最后的时候,生成器中就没有值了 43 # 一个生成器只能用一次 44 # def fff(): 45 # for i in range(10): 46 # yield i 47 # g2 = (i**i for i in range(20)) 48 # g = fff() 49 # print(next(g)) 0 50 # print(next(g)) 1 51 # print(next(g)) 2 52 53 # print(next(fff())) 0 54 # print(next(fff())) 0 55 # print(next(fff())) 0 56 # for i in fff(): 57 # print(i) 58 59 # 如果现在明白 可以趁热打铁 先巩固一下 60 # 如果不明白 先放一放 61 # 框架和项目 作业 62 # 毕业的时候 找工作之前 再刷一次面试题 63 # 要相信计算是不会出错 64 # python11期 65 66 # 内置函数和匿名函数 67 # map filter sorted max min zip 68 打印0-19的偶数 69 # def func(n): 70 # if n%2 == 0: 71 # return True 72 # ret = filter(func,range(20)) 73 # ret = filter(lambda n: True if n%2 == 0 else False ,range(20)) 74 # ret = filter(lambda n: n%2 == 0 ,range(20))
2.递归
7.递归(考脑力)----在函数的内部调用自己,,不知道有多少层的字典调用自身的用递归 递归的最大深度:998 小例子:猜年龄 递归求解--二分查找算法:只针对有序的数字集合的查找问题,快速 算法:在空间(内存里)时间(执行时间)上有优势的方法 常考算法:快速排序、堆排序 冒泡排序 查找:可用二分查找算法 写法:1.递归,位置为0 2.优化 列表不能变:l,num,start,end 注意mid要+start 优化写法放在cal中 解析:执行过程有归,开始都是None 注2:问题:1.参数太多:加if判断(end=len(l)-1 if end is None else end) 2.找的数不存在 (陷入17-18死循环)-解决方法:if start<=end: else:print('没找到) 3.结果不能print 要return 上一层判断中都要加上return ,否则是None,没收到返回值(参考图片递归初识2--加return) 可以画图判断

1 # 递归 —— 在函数的内部调用自己 2 # 递归的最大深度 : 998 3 # 小例子: 4 # 猜年龄 5 # alex多大了 alex 比 wusir 大两岁 40+2+2 6 # wusir多大了 wusir 比 金老板大两岁 40+2 7 # 金老板多大了 40了 8 # age(1) 9 # n = 1 age(2)+2 10 # n = 2 age(3)+2 11 # n = 3 age(3) = 40 12 13 # def age(n): 14 # if n == 3: 15 # return 40 16 # else: 17 # return age(n+1)+2 18 # 19 # print(age(1)) 20 21 # # n = 1 22 # def age(1): 23 # if 1 == 3: 24 # return 40 25 # else: 26 # return age(2)+2 27 # 28 # # n = 2 29 # def age(2): 30 # if 2 == 3: 31 # return 40 32 # else: 33 # return age(3)+2 34 # 35 # # n = 3 36 # def age(3): 37 # if 3 == 3: 38 # return 40 39 40 # 递归求解二分查找算法 41 # 算法 42 # 99*99 = 99*(100-1) = 9900-99 = 9801 43 # 人类的算法 44 # 99 * 99 45 46 # 算法 计算一些比较复杂的问题 47 # 所采用的 在空间上(内存里) 或者时间上(执行时间) 更有优势的方法 48 # 排序 500000万个数 快速排序 堆排序 冒泡排序 49 # 查找 50 51 # 递归求解二分查找算法 : 有序的数字集合的查找问题

1 def func(l,aim): 2 mid = (len(l)-1)//2 3 if l: 4 if aim > l[mid]: 5 func(l[mid+1:],aim) 6 elif aim < l[mid]: 7 func(l[:mid],aim) 8 elif aim == l[mid]: 9 print("bingo",mid) 10 else: 11 print('找不到') 12 func(l,66) 13 func(l,6)

1 # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 2 # # 列表不能变 3 # def cal(l,num,start,end): 4 # mid = (end - start)//2 + start 5 # if l[mid] > num : 6 # cal(l, num, start, mid-1) 7 # elif l[mid] < num: # 13 24 8 # cal(l,num,mid+1,end) 9 # else: 10 # print('找到了',mid,l[mid]) 11 # 12 # cal(l,60,0,len(l)-1) 13 # # 14 # # def cal(l,num=66): 15 # # length = len(l) 16 # # mid = length//2 17 # # if num > l[mid]: 18 # # l = l[mid+1:] 19 # # cal(l,num) 20 # # elif num < l[mid]: 21 # # l = l[:mid] 22 # # cal(l, num) 23 # # else: 24 # # print('找到了',l[mid],mid) 25 # # cal(l,66) 26 # 27 # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 28 # def cal(l,66,0,24): 29 # mid = 12 + 0 30 # if 41 > 66 : 31 # cal(l, num, start, mid-1) 32 # elif 41 < 66: # 13 24 33 # cal(l,66,13,24) 34 # else: 35 # print('找到了',mid,l[mid]) 36 # 37 # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 38 # def cal(l,66,13,24): 39 # mid = 5 + 13 40 # if 67 > 66 : 41 # cal(l, 66, 13, 17) 42 # elif l[mid] < num: # 13 24 43 # cal(l,num,mid+1,end) 44 # else: 45 # print('找到了',mid,l[mid]) 46 # 47 # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 48 # def cal(l,66,13,17): 49 # mid = 2 + 13 50 # if 55 > 66 : 51 # cal(l, num, start, mid-1) 52 # elif 55 < 66: 53 # cal(l,66,16,17) 54 # else: 55 # print('找到了',mid,l[mid]) 56 # 57 # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 58 # def cal(l,60,16,17): 59 # mid =0 + 16 60 # if 56 > 60 : 61 # cal(l, num, start, mid-1) 62 # elif 56 < 60: # 13 24 63 # cal(l,60,17,17) #None 64 # else: 65 # print('找到了',mid,l[mid]) 66 # # 67 # # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 68 # def cal(l,60,17,17): 69 # mid = 0 + 17 70 # if 60 > 66 : 71 # cal(l, num, start, mid-1) 72 # elif 60 < 66: # 13 24 73 # return cal(l,60,18,17) 74 # else: 75 # print('找到了',17,66) 76 # 77 # def cal(l, 60, 18, 17): 78 # if start <end: 79 # mid = 0+18 80 # if 67 > 66: 81 # cal(l, 60, 18,17) 82 # elif 60 < 66: # 13 24 83 # cal(l, 60, 18, 17) 84 # else: 85 # print('找到了', 17, 66) 86 # else: 87 # print('没找到')

1 # 算法 2 # def cal(l,num,start=0,end=None): 3 # # if end is None:end = len(l)-1 4 # end = len(l)-1 if end is None else end 5 # if start <= end: 6 # mid = (end - start)//2 + start 7 # if l[mid] > num : 8 # return cal(l, num, start, mid-1) 9 # elif l[mid] < num: # 13 24 10 # return cal(l,num,mid+1,end) 11 # else: 12 # return mid 13 # else: 14 # return None 15 # l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] 16 # print(cal(l,56))