迭代器
查看是否可迭代
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.得到的值不一样,列表推导式得到的是一个列表,生成器表达式得到的是一个生成器.
推导式:列表推导式 , 字典推导式 , 集合推导式 , 没有元组推导式