Python有三大神器:迭代器、生成器、装饰器;
一、迭代(Iteration)、可迭代对象(Iterable)
在Python中数据类型list、touple、str、dict、set均可通过for循环进行遍历,通过for循环的这种遍历就称为迭代;
以上几种类型都是可迭代对象(Iterable);
在python中可通过函数isinstance() 判断一个对象是否是 Iterable 对象。
from collections import Iterable a = 123 print(isinstance(a,Iterable)) b = ["abc",2,3] print(isinstance(b,Iterable)) c = {"name":"xiaobai"} print(isinstance(c,Iterable))
运行结果:
二、迭代器(Iterator)
能被函数next()调用并不断返回下一个值的对象称为迭代器-Iterator;
也可用函数isinstance()判断一个对象是否是迭代器。
a = ["abc",2,3] print(isinstance(a,Iterator)) # False b = {"name":"xiaobai"} print(isinstance(b,Iterator)) # False c = (1,2,3) print(isinstance(c,Iterator)) # False
运行结果:
由此可见上面所说的几种类型虽然是可迭代对象(Iterable)但并不是迭代器(Iterator);
可使用函数iter()将可迭代对象(Iterable)变为迭代器(Iterator)。
from collections import Iterable,Iterator a = "100" new_a = iter(a) print(new_a) print(isinstance(new_a,Iterator))
运行结果:
三、迭代器的两个基本方法:iter()和next()
函数iter():创建一个迭代器
函数next():不断返回迭代器的下一个值
# 迭代器的两个方法 a = ["红","绿","蓝"] iter_a = iter(a) # 创建迭代器 print(iter_a) print(next(iter_a)) # next()返回迭代器的下一个值 print(next(iter_a)) print(next(iter_a)) print(next(iter_a)) # next()取值取到没有了会抛出StopIteration异常
运行结果:
next()取值取到没有时会抛异常,通过try..except取出全部值
# 用next()取到全部值 a = ["红","绿","蓝"] iter_a = iter(a) # 创建迭代器 while True: try: print(next(iter_a)) except StopIteration: break
运行结果:
迭代器也可以使用for循环进行遍历:
# 使用for循环遍历 a = ["红","绿","蓝"] iter_a = iter(a) # 创建迭代器 for i in iter_a: print(i)
四、将类作为迭代器使用
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了__next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
# 创建一个返回数字的迭代器,初始值为 1,逐步递增 1 class MyIter: def __iter__(self): self.a = 1 return self # 返回一个迭代器对象, def __next__(self): # 返回下一个值 b = self.a self.a += 1 return b iternumbers = MyIter() myiter = iter(iternumbers) print(next(myiter)) print(next(myiter))
运行结果:
1
2
Process finished with exit code 0