day14 迭代器,生成器,函数的递归调用
1.什么是迭代器
迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续
迭代取值的工具
2.为什么要用迭代器
迭代器的优点
①不依赖于索引取值
②更节省内存
缺点:
1.不如按照索引取值方式灵活
2.取值一次性的,只能往后取,无法预测值的个数
3.为何要用迭代器:
可迭代对象:但凡内置有__iter__方法的对象
iterable :str\list\tuple\dic\set\文件
迭代器对象
iterator
即内置有__iter__,又有__next__方法的
文件即是可迭代对象又是迭代器对象
调用可迭代器对象下的__iter__方法,会有一个返回值,生成内置的迭代器对象
for循环的底层原理:
1.调用in后面的那个值/对象的__iter__方法,拿到一个迭代器对象iter_obj
2.调用迭代器对象iter_obj.__next__()将得到的返回值赋值给变量名k,循环往复直到取值完毕抛出异常StopIter
3.捕捉异常
1.iter(d) = d.__iter__
2.next(iter_d)
如何自定义迭代器
生成器:就是一种自定义迭代器
如何得到生成器
但凡函数内出现yield,再去调用函数不会立即执行代码,会返回一个返回值,该返回值就是一个生成器,当对这个生成器调用next方法时,执行函数内代码,遇到yield暂停,再次调用next方法时,从上次结束的地方,继续运行
yield :
1.提供了一种自定义迭代器的解决方案
2.yield &return
相同点,都可以返回值,返回值没有类型限制\个数限制
不同点,return只能返回一个值,yield可以记录当前状态,下一次执行时,会从上次记录的状态后开始执行
函数的递归调用
函数嵌套调用的一种特殊形式
在调用一个函数的过程直接或者间接调用该函数本身,称之为递归调用
递归必须满足两个条件:
①每进入下一次递归调用,问题的规模都应该有所减少
②递归必须有一个明确的结束条件
递归有两个明确的阶段:
①回溯:一层一层递归调用下去
②递推:向后推