生成器和迭代器_python
Posted 陈小赞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器和迭代器_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()。
字符串,列表或元组对象都可用于创建迭代器。
生成器都是迭代器,迭代器不一定是生成器。
以上是关于生成器和迭代器_python的主要内容,如果未能解决你的问题,请参考以下文章