迭代器:
迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
l = [1,2,3,4] l_iter = l.__iter__() while True: try: item = l_iter.__next__() print(item) except StopIteration: break
迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存。
生成器:
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
import time def genrator_fun1(): a = 1 print('现在定义了a变量') yield a b = 2 print('现在又定义了b变量') yield b g1 = genrator_fun1() print('g1 : ',g1) #打印g1可以发现g1就是一个生成器 print('-'*20) #我是华丽的分割线 print(next(g1)) time.sleep(1) #sleep一秒看清执行过程 print(next(g1))
校服案例:
def cloes(): for i in range(1,1000): yield "校服第%d件"%i check = cloes()
#print(list(cheak)) #print(next(check)) #print(check.__next__()) num = 0 #生成器可以通过两种方法实现:数据类型的强制转换 : 占用内存/next()输出下一结果,/for循环 for i in check: print(i) num += 1 if num == 5: break
迭代器和生成器总结
迭代器:
# 双下方法 : 很少直接调用的方法。一般情况下,是通过其他语法触发的
# 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir(数据))
# 可迭代的一定可以被for循环
# 迭代器协议: 含有__iter__和__next__方法
# 迭代器一定可迭代,可迭代的通过调用iter()方法就能得到一个迭代器
# 迭代器的特点:
# 很方便使用,且只能取所有的数据取一次
# 节省内存空间
# 生成器
# 生成器的本质就是迭代器
生成器函数:
#含有yield关键字的函数就是生成器函数
特点:
#调用函数的之后函数不执行,返回一个生成器
#每次调用next方法的时候会取到一个值
#直到取完最后一个,在执行next会报错
# 从生成器中取值的几个方法
# next
# for
# 数据类型的强制转换 : 占用内存