python-迭代器和生成器
一、迭代器
1、迭代器iterator中只能包含可迭代对象。可用于for循环的对象是可迭代对象Iterable,如list,tuple等,可迭代对象不能用__next__()访问元素
2、能用于for循环,且能通过__next__()访问的对象是迭代器Iterator,如生成器就是一个迭代器对象
3、只能通过__next__()依次获取迭代器中的元素,不能通过下标才查找
4、读取量很大的数据时,用迭代器可节省内存
>>> a=iter([1,2,3,4]) >>> b=iter((5,6,7,8)) >>> a.__next__() 1 >>> a.__next__() 2 >>> b.__next__() 5 >>> b.__next__() 6
4、判断一个对象是否为可迭代对象 和 迭代器对象
>>> from collections import Iterable >>> from collections import Iterator >>> list1 = [1,2,3,4] #list1是一个可迭代对象 >>> a = iter(list1) #将list转化为迭代器对象 >>> isinstance(list1,Iterable) True >>> isinstance(list1,Iterator) False >>> isinstance(a,Iterator) True >>> isinstance(a,Iterable) #迭代器对象一定是可迭代对象 True >>> b = list(a) #将迭代器对象转化为list >>> b [1, 2, 3, 4]
二、生成器
1、返回迭代器的函数是一个生成器generator。生成器可用于for循环,也可用__next__()取值
#函数func(n)是一个生成器,返回包含斐波拉契数列的一个迭代器。 def func(n): a, b = 0, 1 for i in range(n): yield b a, b = b, a+b #func()是一个生成器,可用于for循环 for i in func(3): print(i)
2、另一种创建生成器的方法
>>> a = [x**2 for x in range(3)] >>> a [0, 1, 4] >>> type(a) <class 'list'> >>> b = (x**2 for x in range(3)) #b是一个生成器 >>> b <generator object <genexpr> at 0x0221CB70> >>> for i in b: ... print(i) ... 0 1 4 >>>