生成器:
*读取生成器元素的两种方式
1.g.next()
列表生成式,当生成元素即打印,会占用内存;
g = [i for i in range(100000000)]
g.next()
g.next()
g.next()
2.for 循环读取(生成器实质上是可迭代对象)
from collections import Iterable
g = (i**2for i in range(3)) ##从0开始往后的3个自然数
print isinstance(g,Iterable)
for i in g:
print i
True014
Fibonacci数列:
1,1,2,3,5,8,13,21....
生成fib数列的函数,m代表最终生成的数列元素个数;
deffib(m):
n,a,b = 0,0,1while n < m:
print b
a,b = b,a+b
n += 1
fib(5)
yield关键字:
1.生成fib数列的函数,m代表最终生成的数列元素个数;
def fib(m):
n,a,b = 0,0,1while n < m:
yield b
a,b = b,a+b
n += 1
g = fib(5)
for i in g:
print i
2.def g_yield():
print"first"
yield 1print"second"
yield 2
g = g_yield()
print g.next()
print g.next()
#在pycharm里,选中,shift+tab 消除空格
例:(厂<-->中间商<-->买家)
#!/usr/bin/env python#coding:utf-8
product_agency = []
def consumer(name):
print"%s 准备制作产品..."%(name)
while1:
kind = yield
product_agency.remove(kind)
print"[%s]买了[%s]类型的产品"%(name,kind)
import time
def producer(name,*kind):
print"准备制作产品..."for i in kind:
time.sleep(1)
print"[%s]制作了[%s]类新的产品,准备提供给客户..."%(name,i)
product_agency.append(i)
producer('小名','产品1','产品2','产品3','产品4')
c1 = consumer('工厂')
c1.next()
c1.send('产品1')
print"目前产品类型有:",
for i in product_agency:
print i,
例:(简型机器人对话系统)
#函数中yield,代表调用函数,返回值为生成器
def chat_robet():
res = ''while1:
#遇到yield停止
received = yield res
if'hello' in received or'hi' in received:
res = 'hello,I am sari!'
elif 'name' in received:
res = 'secret!I am saucer man!'
elif 'price' in received:
res = 'only 998!'
elif 'bey' in received:
res = 'bey'else:
res = 'I dont no what you said[%s]!'%(received)
Chat = chat_robet() #Chat是生成器next(Chat) #Chat.next和next(Chat)效果相同while1:
r_input = raw_input("beauty>>:")
ifnot r_input:
continue
elif r_input.lower() == 'q':
print"Robot is going..."breakelse:
response = Chat.send(r_input)
print response