迭代器生成器

 

1、可迭代对象

可以循环遍历的都是可迭代对象,例如字符、列表、元组、字典、迭代器等等,可以使用for循环迭代的标志是内部实现了__iter__方法。

list1=[1,2,3,4,5,6]
print(list1)
#将迭代对象转换为迭代器 
iter1=iter(list1)   
print(next(iter1))

运行结果:

[1, 2, 3, 4, 5, 6]
1

使用isinstance(实体名,Iterable)可判断是否为可迭代对象

2、迭代器

迭代器就是实现了迭代方式的容器,iterable对象一般只能按默认的正序方式进行迭代。迭代器内部实现了__iter__方法和__next__方法。

 next()方法用于定制for循环时具体的返回值及返回顺序以及处理StopIteration异常等。

使用isinstance(实体名,Iterator)可判断是否为迭代器

list1=[1,2,3,4,5,6]
print(list1)
#将迭代对象转换为迭代器
iter1=iter(list1)
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))

运行结果:

[1, 2, 3, 4, 5, 6]
Traceback (most recent call last):
1
2
3
4
5
6
  File "/Users/grace/PycharmProjects/selenium/test.py", line 79, in <module>
    print(next(iter1))
StopIteration

 

3、生成器

generator对象是一种特殊的iterator函数,它会在执行过程中保存执行的上下文环境,并在下次循环中从yield语句后继续执行,生成器的标志就是yield关键字。

generator不需要抛出StopIteration异常(你可以看做yield已经在内部实现了StopIteration跳出循环),函数并没有将序列项一次生成,所以generator在实现上可以有无穷个元素,而不需要无穷的存储空间,这在内存优化方面很有用处。

使用isinstance(实体名,Generator)可判断是否为生成器。

生成器的创建办法有两种:

  • 通过函数创建,称作generator function
  • 通过推导式创建,例如g=(x*2 for x in range(10)),称作generator expression、

生成器和迭代器的区别:

  • 生成器比迭代器多了三种方法:send(),close(),throw()
  • send():发送数据
  • close():关闭生成器
  • throw():gen.throw(Exception,"Method throw called")
#创建一个生成器函数
def gen():
    for i in range(5):
        x=yield i
        print("x=%s"%x)
gen=gen()
print(next(gen))
print(gen.send(100))
print(next(gen))

运行结果:

0
x=100
1
x=None
2

生成器最大的好处在于:generator_list(a)并不会真正执行函数的代码,只有在被循环时才会去获取值,且每次循环都return一个值(即yield一个值),在处理完毕后下次循环时依然使用相同的内存(假设处理单位大小一样)来获取值并处理,这样在一次for循环中函数好像中断(yield)了无数次,每次都用相同大小的内存来存储被迭代的值。

yield与return的最大区别就是yield并不意味着函数的终止,而是意味着函数的一次中断,在未被迭代完毕之前yield意味着先返回一次迭代值并继续下一次函数的执行(起始位置是上一次yeild语句结束),而return则基本意味着一个函数的彻底终止并返回一个全量的返回值。

参考:https://www.cnblogs.com/leohahah/p/10189281.html

posted on 2020-08-17 10:06  crystal1126  阅读(138)  评论(0编辑  收藏  举报

导航