迭代器,生成器

可迭代对象

# 可迭代对象定义:内部含有‘__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__())

 

 
 
posted @ 2018-11-05 02:43  小菜鸟111  阅读(108)  评论(0编辑  收藏  举报