Python Day16
一.复习
1.迭代器和生成器
可迭代对象 - 可迭代的 Iterable
内部含有__iter__
from collections import Iterable
isinstance('要检测的值',Iterable)
~迭代器
内部含有__iter__,__next__
可迭代对象 包含 迭代器
from collections import Iterator
isinstance('要检测的值',Iterator)
访问迭代器中的值 : 迭代器.__next__()
~~能被for循环的都是可迭代的
for循环的本质:
循环不是迭代器的可迭代对象 :不具备next方法的可迭代对象.__iter__()就得到了一个迭代器
循环迭代器:直接调用迭代器的next方法
~生成器——迭代器
~~生成器函数 —— 函数内含有yield关键字
*函数的调用返回一个生成器
*从生成器中取值的方法和从迭代器中取值的方法是完全相同的
1.next —— 不常用
2.for —— 最好
3.list —— 最不好
*生成器中的内容不获取就不生成——惰性运算
*在定义生成器的时候:关键字yield
*在使用生成器的时候:next、send
~~生成器表达式
就是将列表推导式的中括号改成小括号
列表推导式的结果是一个列表,生成器表达式的结果是一个生成器
~~~~注意事项:
***next for list 不要混用
~~生成器函数和装饰器函数一起用
预激生成器的装饰器,在这个装饰器中只做一件事:next(g)
二.递归
1.递归的概念:递归的概念是算法的范畴本来不属于python语言的语法内容,但是在每个编程语言系列教学都要讲到递归。
如果掌握了递归的方法会发现是一个非常棒的变成思路。
2.什么叫做递归(recursion):一个函数在自己的内部调用函数本身。
def search(num,l,start = None,end=None): start = start if start else 0 end = end if end else len(l)-1 mid = (end-start)//2+start if l[mid]>num: search(num,l,start,mid-1) elif l[mid] < num: search(num,l,mid+1,end) elif l[mid] == num: print(mid,l[mid]) 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] search(66,l) 输出结果 17 66
~递归的深度在python中是有限制的
~递归的好处就是代码简介精炼
~定义一个递归函数的时候,必须要有一个限制
3.递归的副作用:1 *递归函数可以调用本身,但是每次都需要进行 压栈,弹栈保存和恢复寄存器的栈的操作,在这个上面很消耗时间和空间。
2 *如果递归一旦忘记返回或者错误的设置了返回的条件,那么在执行递归代码会成为一个无底洞,只进不出。(递归的口诀:递归递归,归去来兮)
使用迭代是考验毫秒级的,而实现递归是考验CPU的能力(n秒------n分钟不等)。
二 解耦
什么叫做解耦:要完成一个完整的功能,但是这个功能的规模要尽量的小,并且和这个功能无关的其他代码应该和这个函数分离。
解耦的好处:1 增强代码的重用性;2 减少代码变更的相互影响;3 减少代码的冗余。
~~~递归示例:
#求阶乘 n = 7 7*6*5*4*3*2*1
def func(n): if n == 1: return 1 else: return n*func(n-1)
ret = func(4)
print(ret)
输出结果
5040
#3.三级菜单 menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } #相同的数据类型 嵌套在一起 # def Three_Level_Menu(menu): # while True: # for k in menu:print(k) # key = input('>>>') # if key == 'q':return 'q' # elif key == 'b':break # elif key in menu: # ret = Three_Level_Menu(menu[key]) # if ret == 'q': return 'q' # Three_Level_Menu(menu)