迭代器、迭代对象、生成器、装饰器
迭代器 iter
迭代器定义
- 当类中定义了__iter__和__next__两人方法
- __iter__方法要返回对象本身
- next方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的错误
迭代器的创建
# 创建迭代器
class IT():
def __init__(self):
self.counter=0
def __iter__(self):
return self
def next(self):
self.counter+=1
if self.counter==3:
raise StopIteration
return self.counter
# 实例化迭代器
obj1=IT()
print(obj1.counter)
v1=next(obj1)
print(obj1.counter)
next(obj1)
print(obj1.counter)
obj2=IT()
for num in obj2:
print(num)
class Fibs:
def __init__(self):
self.a=0
self.b=1
def next(self): # 注:python3 版本中为__next__
self.a,self.b=self.b,self.a+self.b
if self.a >100000:
raise StopIteration
return self.a
def __iter__(self):
return self
fibs=Fibs()
for num in fibs:
print num
迭待器对象支持通过next取值 ,如果取值结束,则自动抛出StopIteration错误
for 循环在内部循环时,先施行__iter__方法,获取一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)
生成器
创建生成器
def func():
yield 1
yield 2
创建生成器对象(内部是根据生成器类generator创建对象),生成器类的内部也声明了:__iter__和__next__方法
obj1=func()
v1=next(obj1)
print(v1)
v2=next(obj1)
print(v2)
obj2=func()
for num in range(10):
print(next(obj2))‘、
如果按迭代器的规则来看,其实生成器也是一种特殊的迭代器。
可迭代对象
- 如果一个类中定义了一个__iter__方法,并且返回一个迭代器对象;则我们称这个类创建的对象为可迭代对象。
- 元组、字典、列表都是可迭代对象。
判断是否为迭代器及可迭代对象
from collections.abc import Iterator,Iterable
v1=[1,2,3,4]
print(isinstance(v1,Iterable)) #判断是否可迭代 frue
print(isinstance(v1,Iterator)) #判断是否为迭代器 false 判断依据__iter__和__next__
v2=v1.__iter__()
print(isinstance(v2,Iterable)) #判断是否可迭代 true
print(isinstance(v2,Iterator)) #判断是否为迭代器 true
装饰器
函数的返回值可以是一个函数
def dec(f):
pass
@dec
def double(x):
return x*2
#完全等价
#double=dec(double(x))

浙公网安备 33010602011771号