生成器和迭代器_python

一、生成器简介(generator)

在进行较大数据的存储,如果直接存储在列表之中,则会可能造成内存的不够与速度的减慢,因为列表创建完是立即创建并存在的,而在python中生成器(generator)能够很大程度上解决这个问题,生成器并不一开始直接创建所有的数据,而是进行一种"惰性的运算",即创建的时候,我们创建的只是一个生成器的对象,里面记录的是方法,而没有生成数据,可以使用特殊的方法,进行随用随取,并且生成器只能遍历一遍。

1、创建生成器

 第一种:表达式

g=(x**2 for x in range(1,10))
print(g) #<generator object <genexpr> at 0x0000022898B6C0F8>

第二种:使用了 yield 的函数被称为生成器(generator)。
def foo():
print('ok1')
yield 1
print('ok2')
yield 2
return None

2、调用生成器
第一种:for循环遍历
for i in g:
print(i) #1 4 9
for i in foo():
print(i)

第二种:s.__next__()方法或者next(s):
print(g.__next__())  #1
print(next(g)) #4 (常用写法)
print(g.__next__()) #9

3、装饰器send的使用:就是交互给yield前面的赋值,交互作用(要先next进去)
def foo():
print('ok1')
count=yield 1
print(count) #交互,打印123
yield 2
# return None

b=foo()
next(b)
b.send('123')

4、简单的例子:消费者生产者小程序

import time
def consumer(name):
print('%s 准备吃包子了'%name)
while True:
baozi=yield #接收做的包子
print('包子%s来了,被%s吃了'%(baozi,name))

def producer(name):
c=consumer('A')
c2=consumer('B')
next(c)
next(c2)
print("%s开始做包子了"%name)
for i in range(10):
time.sleep(1)
print('做了两个包子')
c.send(i) #做的包子传给消费者
c2.send(i) #做的包子传给消费者
producer('chen')

二、迭代器
1、迭代器简介

  迭代器是一个可以记住遍历的位置的对象。

  迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

  迭代器有两个基本的方法:iter() 和 next()

  字符串,列表或元组对象都可用于创建迭代器。

  生成器都是迭代器,迭代器不一定是生成器。

猜你喜欢

转载自www.cnblogs.com/chenxiaozan/p/12154197.html