#列表生成器
a=[ i*2 for i in range(10)]
print (a)#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
a1=[]
for i in range(10):
a1.append(i*2)
print(a1) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
b=(i*2 for i in range(10))
print (b)#generator object <genexpr> at 0x0000005E0F89A360>
生成器 :只有在调用时才会生成相应的数据
通过上面的例子可以看出来 当用列表生成器时候后打印a,a的值实际上已经存在内存中,而当使用b的时候只是给出a的内存地址实际上还没有生成,调用b例子:
b=(i*2 for i in range(10))
print (b)#generator object <genexpr> at 0x0000005E0F89A360>
for i in b:
print(i)#0,2,4,6....
生成器next方法(调取下一个值) :
b=(i*2 for i in range(10))
print (b)#generator object <genexpr> at 0x0000005E0F89A360>
print(b.__next__())
print(b.__next__())
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator
def fib(x):
n,a,b=0,0,1
while n<x:
print('我是真的',b)
a,b=b,a+b
n+=1
return "越界"
fib(10)
#生成器
def fib1(x):
n,a,b=0,0,1
while n<x:
yield b
a,b=b,a+b
n+=1
return "越界"
print(fib1(10))#<generator object fib1 at 0x000000C200E1A518>
yi=fib1(10)
print("a",yi.__next__())
#接着next往下循环
for i in yi:
print(i)
单线程:
def consumer(name):
print("准备吃包子了%s"%name)
while True:
baozi=yield
print("包子[%s],被[%s]吃了"%(baozi,name))
# b1="韭菜"
# c=consumer("w")
#
# c.__next__()
# #传值
# c.send(b1)
def producer(name):
c=consumer(name)
c.__next__()
for i in range(10):
print ("做了两个")
c.send("%d个韭菜"%i+2)
producer("w")