python基础拾遗004--迭代器,生成器

迭代器

可迭代对象: 字符串 元组 列表 字典 生成器和带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

 

你可能感兴趣的:(Python)