迭代器
#1.什么是迭代器
迭代取值的工具
#2.为什么用迭代器
优点:
1、提供一种不依赖索引的取值方式
2、更节省内存(自定义迭代器是,它所占的内存是功能本身的代码量,)
缺点:
1、没有按索引取值灵活
2、迭代器对象是一次性的,值可以取完,再想取值重新把可迭代对象定义为迭代器对象
#3. 如何用迭代器
可迭代的对象: str\list\tuple\dict\set\文件对象
但凡内置有__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监测异常,在把迭代器中值取完的情况下结束循环

方式一方式二是一个引子
方式一
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()调用

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)
来源:https://www.cnblogs.com/pdun/p/10271723.html
