迭代类似于循环,每一次重复的过程被成为一次迭代的过程,每一次迭代得出的结果会被用作下一迭代的初始值。
提供迭代方法的容器我们成为迭代器。
通常我们接触到的迭代器有序列,字典。
我们通常使用for语句来进行迭代。
>>> for i in "Harry Potter":
print(i, end = ' ')
H a r r y P o t t e r
for语句的作用就是触发这个迭代器的迭代功能,每次从容器中拿出一个数据,这就是迭代操作。
关于迭代操作,Python提供了两个BIF:iter() 和 next()
对一个容器对象调用iter() ,就得到它的迭代器,调用next,迭代器就会返回下一个值。如果迭代器没有值可以返回了,Python就会抛出一个StopIteration的异常。
>>> string = 'me'
>>> it = iter(string) #it就是一个迭代器了
>>> next(it)
'm'
>>> next(it)
'e'
>>> next(it)
Traceback (most recent call last):
File "<pyshell#93>", line 1, in <module>
next(it)
StopIteration
for语句是用来自动调用迭代器的,有了iter() 和next() 这两个方法,我们就可以大概分析出for语句的工作方式了。
>>> string = "Harry"
>>> for each in string:
print(each, end = " ")
H a r r y
#用上述两个BIF模拟for语句
>>> it = iter(string)
>>> while True:
try:
each = next(it)
except StopIteration:
break
print(each, end = " ")
H a r r y
关于迭代器的魔法方法有两个:__iter__() 和 __next__()
一个容器如果是迭代器,那么必须实现__iter__()方法。而__next__()则决定了迭代器的迭代规则
>>> class Fibs:
def __init__(self):
self.a = 0
self.b = 1
def __iter__(self):
return self #本身就是一个迭代器
def __next__(self):
self.a, self.b = self.b, self.a + self.b #相当于self.a0=self.a self.a=self.b self.b=self.a0+self.b
return self.a #得到下一个菲波那切数列序列的值
>>> fibs = Fibs()
>>> for each in fibs:
if each < 20:
print(each, end=" ")
else:
break
1 1 2 3 5 8 13
class Fibs:
def __init__(self, n=10): #为了控制迭代的范围,设置一个参数n
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.n: #当超过设置的范围时
raise StopIteration
return self.a
>>> fibs = Fibs()
>>> for each in fibs:
print(each, end=" ")
1 1 2 3 5 8