迭代器(Iterator)和生成器(Generator)
概述:
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
延迟计算和惰性求值
迭代器不用你事先准备好整个迭代过程的所有元素。仅仅是在迭代至某个元素时才计算该元素,而这之前或者之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合。
python中有哪些迭代器,可迭代对象
字符串 可迭代对象,不是迭代器
列表 可迭代对象,不是迭代器
元组 可迭代对象,不是迭代器
集合 可迭代对象,不是迭代器
字典 可迭代对象,不是迭代器
迭代器的生成与取值
- 迭代器的生成主要依靠 iter()函数将可迭代对象转换成迭代器
如:
lst = [1,2,3,4,5]
re = iter(lst) #得到一个迭代器
print(re,type(re)) #查看生成的迭代器对象,与其类型
对迭代器取值的三种方式:1.用next() 2.转换成list 3.用for 遍历
注意事项:从迭代器里取值,取走一个就少一个,取空之后再取数据的话,就会报错
- 1.next()
tuple1 = (1,2,3,4)
result = iter(tuple1)
print(next(result) #取出1
print(next(result) #取出2
print(next(result) #取出3
print(next(result) #取出4
print(next(result) #报错,超出范围,迭代器内已经没有可取的值
- 2.转换成list
tuple1 = (1,2,3,4)
result = iter(tuple1)
re = list(result)
print(re)
- 3.用for遍历
tuple1 = (1,2,3,4)
result = iter(tuple1)
for i in result:
print(i)
zip()函数
- zip(Iterble,Iterable) 把当前多个可迭代对象组成一个迭代器
list1 = ["铁锤","二妮","小可爱"]
res = zip(list1)
for i in res:
print(i) #以元组的形式对迭代器元素单一输出
- zip将两个可迭代对象组合成一对元组,但必须是一一对应,超出或者少了后边会被丢弃
list1 = ["铁锤","二妮","小可爱","大姐姐"]
tuple1 = ("80","40","白给")
res = zip(list1,tuple1)
for name in res:
print(name)
res1= dict(res) #可将res转成字典
print(res1)
- *zip是zip的逆过程,*zip 不能作为开头直接出现,需要和zip 配合使用,但两个可迭代对象就被转换成元组的形式,无法逆回输出原来的形式
list1 = ["铁锤","二妮","小可爱","大姐姐"]
tuple1 = ("80","40","白给")
res = zip(*zip(list1,tuple1))
for name in res:
print(res)
生成器(Iterator)
生成器就是高级的迭代器,也是可迭代对象,它最主要的特征就是自定义的迭代器。
这里我们来判断我们自定义的生成器是否是迭代器
#列表推导式
lst= [i*i for i in range(1,11)] #生成10以内的平方的可迭代对象
print(lst)
想要调用Iterator模块需要导入哦
from colloctions import Iterator
lst = (i*I for i in range(1,11))
print(lst) #生成器的创建
re = isinstance(lst,Iterator)
print(re) #结果为True,表示lst是迭代器