python 可迭代对象 迭代器 生成器,python中迭代器和生成器的区别
迭代器和生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有元素都被访问。迭代器只能向前,不能向后。
迭代器有两个基本方法:iter()和next()。
字符串、列表或元组对象可用于创建迭代器:
示例(Python 3.0)列表=[1,2,3,4]
创建一个迭代器对象
Print (next(it)) #输出迭代器的下一个元素
一个
打印(下一页)
2
可以使用正则for语句遍历迭代器对象:
示例(Python 3.0) #!/usr/crdxmg/python3list=[1,2,3,4] it=iterator (list) #为其中的x创建迭代器对象:print (x,end= )
执行上面的程序,输出结果如下:
1 3 4您还可以使用next()函数:
示例(Python 3.0) #!/usr/crdxmg/python3
Import #引入sys模块。
list=[1,2,3,4]
创建一个迭代器对象
虽然正确:
尝试:打印(下一个(它))
除了StopIteration: sys.exit()
执行上面的程序,输出结果如下:
234创建一个迭代器来使用一个类作为迭代器需要在类中实现两个方法__iter__()和__next__()。
如果你已经了解了面向对象编程,你就会知道所有的类都有一个构造函数。Python的构造函数是__init__(),将在对象初始化时执行。
阅读更多内容:Python3面向对象
__iter__()方法返回一个特殊的迭代器对象,该对象实现__next__()方法,并通过StopIteration异常来标识迭代的完成。
__next__()方法(Python 2中的next()将返回下一个迭代器对象。
创建一个返回数字的迭代器,初始值为1,增量为1:
示例(python 3.0)类my numbers:def _ _ ITER _ _(self):self . a=1 return self def _ _ next _ _(self):x=self . a self . a=1 return x my class=my numbers()my ITER=ITER(my class)print(next(my ITER))print(next(my ITER))print(next(my ITER))print(next(my ITER))print(next(my ITER))print(next(next(my ITER))print(next(next(my ITER))
执行结果是:
2345 StopIteration停止迭代异常用于标识迭代的完成,防止无限循环的发生。在__next__()方法中,我们可以设置在完成指定次数的循环以结束迭代后触发停止迭代异常。
20次迭代后停止执行:
例(Python 3.0)类my numbers:def _ _ ITER _ _(self):self . a=1返回self def _ _ next _ _(self):if self . a=20:x=self . a self . a=1返回x else:raise stop iteration my Class=my numbers()myiter=ITER(my Class)for x in myiter:print(x)
执行结果是:
13456789101121314151617181920发电机
在Python中,使用yield的函数称为生成器。
与普通函数不同,生成器是返回迭代器的函数,只能用于迭代运算。理解生成器是迭代器更简单。
在调用生成器运行的过程中,函数每次遇到yield都会暂停并保存当前所有运行信息,返回yield的值,下次执行next()方法时从当前位置继续运行。
调用一个生成器函数,它返回一个迭代器对象。
下面的例子使用yield实现斐波那契数列:
例(Python 3.0)import sys def Fibonacci(n):# generator function-Fibonacci A,b,counter=0,1,0 while true:if(counter n):return yield A A,b=b,A counter=1 f=Fibonacci (10) # f是迭代器,由生成器返回生成while true: try: print (next (f),end= )除停止迭代:sys.exit()
执行上面的程序,输出结果如下:
0 1 1 2 3 5 8 13 21 34 55
历史提交的图片或压缩文件
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。