可迭代对象
# 可迭代对象定义:内部含有‘__iter__’方法的数据就是可迭代对象
# 可迭代对象如:list str tuple set dict range() 文件句柄
s1 = '二狗的周末生活'
# print(dir(s1))
print('__iter__' in dir(s1))
1、迭代器
# 内部含有‘__iter__’方法的并且含有‘__next__’方法的就是迭代器
f1 = open('regsiter', encoding='utf-8')
print('__iter__' in dir(f1))
print('__next__' in dir(f1))
f1.close()
# 可迭代对象 ----> 迭代器
# 迭代器:next ---》 一个值
l1 = [1, 2, 3, 'alex'] iter1 = iter(l1) # l1.__iter__() print(iter1) print(iter1.__next__()) print(iter1.__next__()) print(iter1.__next__()) print(iter1.__next__()) print(iter1.__next__()) for i in iter1: print(i)
最后一个超出了
# 迭代器:
# 1,非常非常节省内存。 这个是最重要
# 2,他满足惰性机制。
# 3, 一条路走到黑。
利用while循环模拟for循环 的机制。
三部曲:
# 1, 将可迭代对象转化成迭代器
# 2, 利用next 进行取值
# 3, 利用异常处理终止循环。
l1 = [1, 2, 3, 'alex'] iter1 = l1.__iter__() # 1, 将可迭代对象转化成迭代器 while 1: try: print(iter1.__next__()) # 2, 利用next 进行取值 except StopIteration: # 3, 利用异常处理终止循环。 break
2、生成器
# 生成器:自己用python代码写的迭代器 本质就是迭代器
# 1,函数式写法
# 2,生成器表达式
# 函数式写法 构建生成器 # 只要函数中出现yield,那么 他就不是函数了,他是生成器函数。 def func1(): # print(111) # print(222) yield 3 yield 4 yield 5 yield 6 yield 7 g = func1() # 生成器对象 print(g) print(g.__next__()) # print(next(g)) # 一个next 对应一个 yield print(g.__next__()) print(g.__next__()) print(g.__next__())
# yield return
# return 结束函数 给函数返回值
# yield 不会结束生成器函数,next 对应一个yield进行取值
生成器有什么好处呢?就是不会一下子在内存中生成太多数据
假如我想让工厂给学生做校服,生产200件衣服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以根据学生一批一批的找工厂拿。
而不能是一说要生产20件衣服,工厂就先去做生产20件衣服,等回来做好了,学生都毕业了。。。
# 1、一次性做200件:直接使用for循环 def cloth(): for i in range(1,201): print('老年体恤%s号' % (i)) cloth()
#2、先做5件,在做剩下的195件。:使用yield生成器先做一部分,在做一部分 def cloth1(): for i in range(1,201): yield '老年体恤%s号' % (i) g = cloth1() for i in range(5): print(g.__next__()) for i in range(195): #从6开始,一直到200 print(g.__next__())