迭代器
可迭代对象: 字符串 元组 列表 字典 生成器和带yield的生成器函数。
如何判读对象是否可迭代:isinstance(对象,Iterable)
如何判读对象是否是迭代器:isinstance(对象,Iterator)
如何生成可迭代对象的迭代器:iter(可迭代对象)
注意:可迭代对象不一定是迭代器,但是迭代器一定是可迭代对象。
from collections import Iterable
from collections import Iterator
a= "Abc"
b=12
c=[11,23,32]
d=(12,21,21)
e={'a':1,'b':11}
x= (x for x in range(1,20) if x%2==0)
#判断对象是否可迭代
print(isinstance(a,Iterable),isinstance(b,Iterable),isinstance(c,Iterable),
isinstance(d,Iterable),isinstance(e,Iterable),isinstance(x,Iterable))
#判断对象是否是迭代器,即被next()调用
print(isinstance(a,Iterator),isinstance(b,Iterator),isinstance(c,Iterator),
isinstance(d,Iterator),isinstance(e,Iterator),isinstance(x,Iterator))
#生成迭代器的方法 iter()
iter_a = iter(a)
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
print(next(iter_a))
生成器
使用场景:当需要创建大量数据的列表的时候,比如100000条记录的列表,很显然一次全部创建到内存当中是一件特别消耗内存的事情。生成器就是通过封装的算法进行边循环边计算的机制。
两种创建生成器的方法:
1.通列表解析语法,但是要把[]换成()即可。
>>> li=[x for x in range(1,20) if x%2==0]
>>> li
[2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> type(li)
>>> gen=(x for x in range(1,100) if x%2==0)
>>> gen
at 0x7fb2f613f360>
>>> type(gen)
>>> next(gen)
2
>>> next(gen)
4
>>> next(gen)
6
2.通过带yield的函数
调用带yield的生成器函数,返回的是一个生成器对象,此时函数并未执行。当调用next(生成器对象)的时候,函数开始执行,碰到yield语句函数暂停并返回yield对象后面的值。
>>> def genFunc():
... print('---function start---')
... for x in range(1,100):
... print('-----begin in for----')
... yield x
... print('-----get one x:----'+str(x))
... print('-----funtion end-----')
...
>>> genFun = genFunc()
>>> next(genFun)
---function start---
-----begin in for----
1
>>> next(genFun)
-----get one x:----1
-----begin in for----
2
>>> next(genFun)
-----get one x:----2
-----begin in for----
3
>>> next(genFun)
-----get one x:----3
-----begin in for----
4
send函数调用带yield的生成器函数,与next功能相似,同时给yield语句附一个返回值。如下:
>>> def genFunc():
... for i in range(0,10):
... temp=yield i
... print('------'+str(temp)+'-----')
...
>>> gen = genFunc()
>>> gen.__next__()
0
>>> gen.send('Test')
------Test-----
1
>>> next(gen)
------None-----
2