迭代器
#1.什么是迭代器 迭代取值的工具 #2.为什么用迭代器 优点: 1、提供一种不依赖索引的取值方式 2、更节省内存(自定义迭代器是,它所占的内存是功能本身的代码量,) 缺点: 1、没有按索引取值灵活 2、迭代器对象是一次性的,值可以取完,再想取值重新把可迭代对象定义为迭代器对象 #3. 如何用迭代器 可迭代的对象: strlist upledictset文件对象 但凡内置有__iter__方法的对象都称之为可迭代对象 可迭代对象).__iter__=====》》迭代器对象 迭代器对象: 文件对象 既内置有__iter__方法又内置有__next__方法的对象都称之为迭代器对象
__iter__与__next__简便写法
k={'a':111,'b':222,'c':333} iter_k=iter(k) # k.__iter__() print(next(iter(k))) #iter_d.__next__()
4.for循环的底层工作原理(必须是可迭代类型)
1 把可迭代对象转换为迭代器对象,
2 调迭代器的__next__方法,取值,取值
3 用try和except监测异常,在把迭代器中值取完的情况下结束循环
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
方式一方式二是一个引子 方式一 k={'a':111,'b':222,'c':333} k1=k.__iter__() print(k1.__next__()) print(k1.__next__()) print(k1.__next__()) print(k1.__next__()) ------------------------------------------------ 方式二 k={'a':111,'b':222,'c':333} k1=k.__iter__() while True: v=k1.__next__() print(v) ---------------------------------------------- 方式一二执行结果一样,都会报错(超出索引范围) 那么通过添加try和except来阻止报错 k={'a':111,'b':222,'c':333} k1=k.__iter__() while True: try: #监管代码执行,遇到异常,捕捉异常,开始和except后的值匹配,是否是这个错误 v=k1.__next__() print(v) except StopIteration: break
生成器
一、什么是生成器
只要函数内部包含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码
二、如何用生成器
但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,通过next()调用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(): print('a') yield 1 print('s') res=yield 2 print('c') res=yield 3 g=func() s=next(g) print(s) next(g) print(res) next(g) print(res) next(g) 通过next()调用yield,因为生成器是迭代器的一种,所以在next执行完也会报错,仍通过try监测异常 def func.. .... try: g=func() print(next(g)) next(g) next(g) next(g) except: print(0)
总结yield:
1. 提供一种自定义迭代器的解决方案
2. yield & return
相同点: 都可以返回值,返回值没有类型限制和个数限制
不同点: 函数遇到return会结束函数体
遇到yield是让函数暂停在某一个位置
小练习,自定义range
def a(start,stop,s): while start<stop: yield start start+=s for i in a(1,50,2): 范围及步长自定义 print(i)