迭代器和生成器

迭代器

查看是否可迭代

from collections import Iterable
from collections import Iterator
print(isinstance('abc',Iterable))    #True
print(isinstance('abc'.__iter__(),Iterator) )  #True
s = "abcdefg" 
c = s.__iter__()    # 获取迭代器
print(c.__next__())   #获取一个元素  a
print(c.__next__())    #b

使用while循环和迭代器来模拟for循环

lst = [1,2,3]
it = lst.__iter__()
while 1:
    try:
        i = it.__next__()
        print(i)
    except StopIteration:
        break

迭代器特点: 1.节省内存  2.惰性机制  3.不能反复,只能向下执行

生成器

获取生成器的三种方法:

1.通过生成器函数

2.通过各种推导式来实现生成器

3.通过数据的转换也可以获取生成器

def func():
    print('aaa')
    yield 'bbb'
gener = func()     #获取到生成器
print(gener)     #===>   <generator object func at 0x10567ff68>
ret =gener.__next__()   #执行函数
print(ret)       # 返回数据

yield是分段来执行一个函数,运行完最后一个yield会报错 ; return是直接停止执行函数

 send()和__next__()一样都可以让生成器执行到下一个yield

 send和__next__()区别:

  1.send和next()都是让生成器向下走一次

  2.send可以给上一个yield的位置传递值,不能给最后一个yield发送值.在一次执行生成器代码的时候不能使用send()

生成器可以用for循环获取内部元素

列表推导式    lst = [ i for i in range(1,10) ]

生成器表达式   gen = ( i for i in range(1,10))     ==>  <generator object <genexpr> at 0x106768f10> 

生成器表达式和列表推导式的区别:

1.列表推导式比较消耗内存,一次性加载.生成器表达式几乎不占内存.使用的时候才分配和使用内存

2.得到的值不一样,列表推导式得到的是一个列表,生成器表达式得到的是一个生成器.

推导式:列表推导式 , 字典推导式 , 集合推导式 , 没有元组推导式  

原文地址:https://www.cnblogs.com/gracenana/p/10197829.html