迭代器和生成器

一、迭代器

什么是可迭代对象:内部含有__iter__方法的对象就叫做可迭代对象

可迭代对象就遵循可迭代协议。

如何判断 两种方式

# print('__iter__' in dir(s))
# from collections import Iterable
# l = [1, 2, 3, 4]
# print(isinstance(l, Iterable)) # True
# print(type(l))
# print(isinstance(l,list))

可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器

迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。

迭代器的好处:

1,节省内存空间。

2,满足惰性机制。

3,不能反复取值,不可逆。

 

1,将可迭代对象转化成迭代器

2,内部使用__next__方法取值

3,运用了异常处理去处理报错。

l2 = [1, 2, 3, 4, 5, 6, 7, 8]
l2_obj = l2.__iter__()
while True:
    try:
        i = l2_obj.__next__()
        print(i)
    except Exception:
        break

二、生成器

  生成器:生成器本质上是迭代器。

 

 

  生成器的产生方式:

  1,生成器函数构造。

  2,生成器推导式构造。

  3,数据类型的转化。

# def func1():
#     print(111)
#     print(222)
#     print(333)
#     return 666
# print(func1())


# def func1():
#     print(111)
#     print(222)
#     print(333)
#     yield 666
#     yield 555
#     yield 777

# g = func1()
# print(g)  # <generator object func1 at 0x0000000001197888>
#第一:函数中只要有yield 那他就不是一个函数,而是一个生成器
#第二:g称作生成器对象。
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

# def func1():
#     for i in range(1,10001):
#         print('老男孩校服%d号' % i)
# func1()

# def func1():
#     for i in range(1,10001):
#         yield '老男孩校服%d号' % i
# g = func1()
#
# for i in range(50):
#     g.__next__()
#
# for j in range(150):
#     print(g.__next__())

# l1 = [i for i in range(1000)]

#send
def generator():
    print(123)
    content = yield 1
    print(content)
    print(456)
    yield 2
g = generator()
g.__next__()
g.send('hello')

'''
next 和send 功能一样,都是执行一次
send可以给上一个yield赋值。

'''
posted @ 2018-04-05 23:31  小杰~~  阅读(109)  评论(0编辑  收藏  举报