Python是一种简洁明了的语言,迭代器已经融入其语言本身的特性了,Python中的for循环本身就是一个迭代的过程,也是最简单易用的迭代方式。
可以直接作用于for循环的数据类型有以下两种:
- 集合数据类型,如list、tuple、dict、set、str等。
- 生成器(Generator),包括()语法定义的生成器和带yield的generator函数。
可以直接作用于for循环的对象统称为可迭代对象(Iterable)。
Iterable对象
gen=(x*x for x in range(10))
def fibonacci(maxNum):
a=b=1
for i in range(maxNum):
yield a
a,b=b,a+b
def testIterable():
print("0-9的平方")
for e in gen:
print(e,end="\t")
print()
print("fibonacci数列")
fib=fibonacci(10)
for n in fib:
print(n,end="\t")
print()
arr=[x*x for x in range(10)]
print(type(gen))
print(type(arr))
print(type(fib))
testIterable()
生成器(Generator)不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误。
生成器是迭代器的一种简单实现
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。
区分Iterable可迭代对象或Iterator迭代器对象
from collections import Iterable,Iterator
def testIsIterator():
print("是不是可迭代对象")
print(isinstance([],Iterable))
print(isinstance({},Iterable))
print(isinstance((1,2,3),Iterable))
print(isinstance(set([1,2,3]),Iterable))
print(isinstance("string",Iterable))
print("是不是迭代器")
print(isinstance([],Iterator))
print(isinstance({},Iterator))
print(isinstance((1,2,3),Iterator))
print(isinstance(set([1,2,3]),Iterator))
s=set([1,2,3])
print(next(s))
testIsIterator()
疑问?set到底是不是迭代器
可以用 iter()函数将 Iterable对象转成Iterator对象
要使自定义的类具有Iterable属性,需要实现__iter__
方法。要使自定义的类具有Iterator属性,需要实现__iter__
和__next__
方法,
class NumberSequence:
def __init__(self,init,step,max=100):
self.__data=init
self.__step=step
self.__max=max
def __iter__(self):
return self
def __next__(self):
if (self.__data<self.__max):
tmp=self.__data
self.__data+=self.__step
return tmp
else:
raise StopIteration