python之路--迭代器和生成器

迭代:

  迭代器协议: 

  1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)

  2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个__iter__()方法)

  3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象

  for循环实现迭代的原理

  1.调用__iter__()方法,将后面序列转为可迭代对象

  2.调用__next__方法,读取内容,读取到StopIteration异常,以终止迭代。

name=[1,2,3,4,5]
for i in name:
    print(i)

实现for循环的原理 :
name=name.__iter__()
while True:
    try:
        print(name.__next__())
    except StopIteration:
        break

   判断是否为迭代器的方法:用Iterator

from collections import Iterator  
isinstance({}, Iterator)  --> False  
isinstance((), Iterator) --> False  
isinstance( (x for x in range(10)), Iterator)  --> True   

  凡是可以for循环的,都是Iterable

  凡是可以next()的,都是Iterator

  集合数据类型如list,truple,dict,str,都是Itrable不是Iterator,但可以通过iter()函数获得一个Iterator对象

  

生成器(优点:节省内存):

  生成器:可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象。

  生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

  1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

  2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

#函数表达式
a=(i for i in range(100))
print(a)
print(a.__next__())
# 函数表达式
def generator_test():
    yield 1
    yield 2
    yield 3

b=generator_test()
print(b)
print(b.__next__())
print(b.__next__())
print(b.__next__())
print(b.__next__())
View Code

  

生成器小结:

  1.是可迭代对象

  2.实现了延迟计算,省内存啊

  3.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处,其余的可迭代对象可没有这点好处,记住喽!!!

触发函数生成器的方法:

  1.__next__

  2.next()

  3.send()  #send会将参数赋值给yield

参考链接:https://www.cnblogs.com/linhaifeng/p/6133014.html

原文地址:https://www.cnblogs.com/white-small/p/6885246.html