- 迭代器 iterator
一个可以记住遍历的位置的对象,从集合的第一个元素开始单向访问,直到所有的元素被访问完结束。
# 两个基本的方法:
iter() #创建迭代器对象
next() #返回下一个迭代器对象;Python3的for循环本质上就是通过不断调用next()函数实现的
# 迭代完成标识:通过抛出StopIteration异常来结束
it = iter(myclass)
while True:
try:
print (next(it), end=" ")
except StopIteration:
sys.exit()
# 迭代器的创建:
定义一个类;
在类中实现__iter__() 与 __next__() 两个方法 -迭代器类;
实例化生成迭代器对象。
- 生成器 generator
Python中将使用了 关键字yield 的函数称为生成器,“优雅的迭代器”。
我理解的“优雅的迭代器”?
1.边循环边推算后续元素个数:
生成器一次只能产生一个值,减少多余的内存消耗。
2.表现得像是迭代器:
yield语句返回一个生成器,允许调用函数可以很快的处理前几个返回值。
生成器函数运行过程— 关键字yield ?
1.创建生成器—调用该函数,返回生成器对象;
2.函数执行—next()方法执行该函数;
3.冻结执行—遇到 yield ,函数暂停并保存当前所有的运行信息;
4.返回值—返回 yield 的值;
5.直至再次调用next() 方法时,从冻结位置继续运行,获取生成器的下一个值… …
# 三个基本的方法:
send() #接收外部参数发送给生成器,返回相应变量
#需要在生成器被“冻结”之后才可发送外部数据,首次使用该方法时必须传入None参数
next() #获取生成器下一个值
close() #关闭生成器,再次获取生成器的值时会抛出StopIteration异常
# 生成器的创建:
1.生成器函数:定义包含yield的函数;函数内部有循环控制语句;调用该函数创建生成器。
def my_generator(val):
var = 0
if var >= 90:
t.close()
print(next(t))
for i in range(val):
var += i*2
yield var
def my_generator1(val):
var = 0
out_var = None
for i in range(val):
var += i * 2
out_var = (yield var*out_var) if out_var is not None else (yield var*1)
t = my_generator(10) #创建生成器
t1 = my_generator1(10)
print(list(t)) #将生成器转换成列表/元组
print(tuple(t1))
t1.send(2)
for i in range(0, 11, 1):
print(next(t))
2.for循环的生成器推导式:返回生成器,可被for循环迭代
my_generator = (x*x for x in range(0, 10, 2))
for i in my_generator :
print(i, end=' ')