迭代器和生成器181030
Posted l-dongf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器和生成器181030相关的知识,希望对你有一定的参考价值。
一、列表生产式
[ i*2 for i in range(10) ]
二、生成器(generator)
生成器和列表的区别是生成器数据在调用时生成,不支持像列表一样可以切片等处理
- 只有在调用时才会生成相应的数据
- 只记录当前位置
只有一个"next"方法
1、生成器1
>>> ( i*2 for i in range(10) )
>>> for i in b:
... print(i)
2、生成器的next方法
>>> c = ( i*2 for i in range(10) )
>>> c.__next__()
0
>>> c.__next__()
2
>>> c.__next__()
4
3、斐波那契数列
# Author:Li Dongfei
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return "done"
fib(100)
4、将斐波那契改为生成器
# Author:Li Dongfei
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return "done"
f = fib(100)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
5、捕获异常
# Author:Li Dongfei
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return "done"
f = fib(10)
while True:
try:
x = next(f)
print('f:', x)
except StopIteration as e:
print('Generator return value:', e.value)
break
6、生成器的并行(生产者消费者模型)
# Author:Li Dongfei
import time
def consumer(name): #消费者
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" % (baozi, name))
def producer(name): #生产者
c = consumer(name)
c.__next__()
for i in range(10):
time.sleep(1)
print("做了1个包子!")
c.send(i) #将i send到consumer会被yield接受到并且赋值给baozi
producer("dongfei")
三、迭代器(Iterator)
- 可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
1、判断是否是可迭代对象
>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance((),Iterable)
True
>>> isinstance('abc',Iterable)
True
2、判断是否是可迭代器对象
>>> from collections import Iterator
>>> isinstance( ( x for x in range(5) ), Iterator )
True
生成器一定是迭代器,但是迭代器不一定是生成器
3、使用iter()函数将list,dict,str等Iterable变成Iterator
>>> a = [1, 2, 3]
>>> b = iter(a)
>>> b.__next__()
1
>>> b.__next__()
2
>>> b.__next__()
3
以上是关于迭代器和生成器181030的主要内容,如果未能解决你的问题,请参考以下文章