判断一个对象是否是迭代对象
from collections import Iterble
isinstance ( [ ] , Iterble)
可迭代对象的本质是, 提供一个中间人,遍历的时候, 需要数据的时候, 获取这个对象的迭代器, 然后通过迭代器依次获取对象中的数据.
具备了一个__iter__ 方法的对象就是一个可迭代对象
通过iter方法获得可迭代对象的迭代器, 然后对迭代器使用next() 方法, 获取下一个数据
>> > li = [ 11 , 22 , 33 , 44 , 55 ]
>> > li_iter = iter ( li)
>> > next ( li_iter)
11
>> > next ( li_iter)
22
>> > next ( li_iter)
33
>> > next ( li_iter)
44
>> > next ( li_iter)
55
>> > next ( li_iter)
Traceback ( most recent call last) :
File "<stdin>" , line 1 , in < module>
StopIteration
>> >
迭代器:
判断一个对象是否是迭代器, isinstance(iter[], Iterator)
一个实现__iter__() , __next () 方法的对象就是迭代器,
class MyList ( object ) :
"""自定义的一个可迭代对象"""
def __init__ ( self) :
self. items = [ ]
def add ( self, val) :
self. items. append( val)
def __iter__ ( self) :
myiterator = MyIterator( self)
return myiterator
class MyIterator ( object ) :
"""自定义的供上面可迭代对象使用的一个迭代器"""
def __init__ ( self, mylist) :
self. mylist = mylist
self. current = 0
def __next__ ( self) :
if self. current < len ( self. mylist. items) :
item = self. mylist. items[ self. current]
self. current += 1
return item
else :
raise StopIteration
def __iter__ ( self) :
return self
if __name__ == '__main__' :
mylist = MyList( )
mylist. add( 1 )
mylist. add( 2 )
mylist. add( 3 )
mylist. add( 4 )
mylist. add( 5 )
for num in mylist:
print ( num)
for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器, 然后对获取到的迭代器不断调用**next()**方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。
迭代器的作用:
迭代器最核心的功能是通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的 * 可以节省内存和存储空间
生成器(generator):
生成器是一种给特殊的迭代器, 保存当前运行的状态
实现生成器的两种方法
第一种方法很简单,只要把一个列表生成式的 [ ] 改成 ( )
In [ 15 ] : L = [ x* 2 for x in range ( 5 ) ]
In [ 16 ] : L
Out[ 16 ] : [ 0 , 2 , 4 , 6 , 8 ]
In [ 17 ] : G = ( x* 2 for x in range ( 5 ) )
In [ 18 ] : G
Out[ 18 ] : < generator object < genexpr> at 0x7f626c132db0 >
第二种方法 yeild , __ next __ 函数中使用yeild关键字 , 可以使用yeild 关键字实现 使用了yield的函数就是生成器,
yield关键字有两点作用:
保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)send() 方法也能唤醒