迭代器
迭代
上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值
注:循环不是迭代
迭代器
1.为什么要有迭代器?
对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式。
2.迭代器定义:
迭代器:可迭代对象执行iter方法,得到的结果就是迭代器,迭代器对象有next方法
它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iter和next()方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常
可迭代的(iterable)
Python标准库中存在着一些可迭代对象,例如:list, tuple, dict, set, str等。
迭代器对象可以使用常规for语句进行遍历:
举个栗子:
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end=" ") #输出结果:1 2 3 4
使用next()函数:
举个栗子:
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
创建一个迭代器
把一个类作为一个迭代器使用,需要在类中实现两个方法 iter() 与 next() 。
Python3 的构造函数为 init(), 它会在对象初始化的时候执行。
iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法,并通过 StopIteration 异常标识迭代的完成。next() 方法会返回下一个迭代器对象。
举个栗子:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter)) #输出结果:1
print(next(myiter)) #输出结果:2
print(next(myiter)) #输出结果:3
print(next(myiter)) #输出结果:4
StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
举个栗子:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 5:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x) #输出结果:1 2 3 4 5
生成器
1、生成器的定义
生成器就是一个数据类型,但是这个数据类型可以自动实现迭代器协议
2、生成器的表达形式
在函数中使用yield语句替换return函数,当函数碰到了yield时会返回一个相应的值,并记录当前函数运行的状态,在下次调用函数的时候会从当前状态运行函数。
举个栗子:
def test():
yield 1
yield 2
yield 3
l = test()
print(l.__next__()) #输出结果:1
print(l.__next__()) #输出结果:2
print(l.__next__()) #输出结果:3
send()方法:
send()方法和next方法实现的功能类似,都是取出生成器中的值,但send()方法需要传递一个参数,可以将该参数传递给yield并赋值给一个变量。
举个栗子:
def Fib():
a = yield 1
if a != None:
yield a
yield 2
yield 3
f = Fib()
print(next(f)) #输出结果:1
print(f.send('hello')) #输出结果:hello
print(next(f)) #输出结果:2
print(next(f)) #输出结果:3
网友评论