生成器
读取生成器元素的两种方式:
g.next()
for 循环读取;(生成器实质上是可迭代对象)
1. 列表生成式,当生成元素即打印,会占用内存;
[i for i in range(10000000)] #打印i会占用系统内存
g= (i for i in range(1000000)) #如果给予赋值的话 就变成生成器
g.next() #使 g.next() 就可调用生成器的值,每次运行只产生一个值 这样就不占用系统内存了
下面是一些生成器使用的例子:
>>> g = (i**2 for i in range(3))
>>> print g.next()
0
>>> print g.next()
1
>>> print g.next()
4
>>> print g.next() #当没有第四个值的时候在调用生成器就会报错!!!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> g = (i**2 for i in range(3))
>>> for i in g: #生成器的值也可以使用for循环来获取
... print i
...
0
1
4
Fibonacci数列:
1, 1, 2, 3, 5, 8, 13, 21……..
def fib(max):
n, a,b = 0, 0, 1
while n < max:
print b
a, b = b, a+b
n += 1
fib(10)
python中两值交换
In [1]: x = 3
In [2]: y =4
先构造右边的元组(y,x),即(4,3);
然后将元组的值依次赋给x,y;
In [3]: x, y = y, x
In [4]: print x
4
In [5]: print y
3
In [7]: x,y = (4,3)
yield关键字
生成fib数列的函数,max 代表最终生成的数列元素个数:
def fib(max):
n, a,b = 0, 0, 1
while n < max:
yield b #yield是一个关键词,类似return, 不同之处在于,yield返回的是一个生成器
a, b = b, a+b
n += 1
g = fib(10)
for i in g:
print i
yield 一些使用的例子:
def test_yield():
print "first"
yield 1
print "second"
yield 2
print "third"
yield 3
g = test_yield()
print g.next()
print g.next()
print g.next()
返回值
first
1
second
2
third
3
生成器实战应用: 实现生产者消费者模型(有无缓冲区)
无缓冲区的:
#!/usr/bin/env pyhton
#coding:utf-8
def consumer(name):
print "%s 准备买辣条" %(name)
while True:
kind = yield
print "客户[%s]买了[%s]口味的辣条......" %(name, kind)
----------
import time #倒入时间模块
def producer(name):
# c1 和 c2 是生成器对象;
c1 = consumer("用户1")
c2 = consumer("用户2")
c1.next()
c2.next()
print "准备制作辣条......."
for i in ["酸甜", "五香", "微辣", "特辣"]:
time.sleep(1)
print "[%s]制作了[%s]口味的辣条, 准备提供给消费者....." %(name, i)
c1.send(i)
c2.send(i)
producer("厨师")
有缓冲区的:
#!/usr/bin/env pyhton
#coding:utf-8
latiao_agency = []
def consumer(name):
print "%s 准备买辣条" %(name)
while True:
kind = yield
latiao_agency.remove(kind)
print "客户[%s]买了[%s]口味的辣条......" %(name, kind)
import time
## *kind 是可变参数, 实质 kind 是元组;
def producer(name, *kind):
print "准备制作辣条......."
for i in kind:
time.sleep(1)
print "[%s]制作了[%s]口味的辣条, 准备提供给消费者....." %(name, i)
latiao_agency.append(i)
producer("厨师", "酸甜", "五香", "微辣", "特辣")
c1 = consumer("客户1")
c1.next()
c1.send("五香")
print "目前本店辣条口味:",
for i in latiao_agency:
print i,