生成器

一.列表生成式

a=[x**2 for x in range(10)]
print(a)
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

def f(i):
return i*5
a=[f(x) for x in range(10)]
print(a)
#[0, 5, 10, 15, 20, 25, 30, 35, 40, 45]
二.生成器
#生成器:是一个可迭代对象(内部有_iter_方法),内存中不存在数据
b=(x**2 for x in range(10))
for i in b:
print(i,'',end='')
# 0 1 4 9 16 25 36 49 64 81
#*******************************************************
# 生成器两种创建方式
# 1. b=(x**2 for x in range(10))
# 2. yield
def foo():
print('ok','',end='')
yield 1
print('ko','',end='')
yield 2
a=foo()
next(a)#返回1但没被打印
next(a)#返回2但没被打印
#ok ko
for i in a:#for循环含有next
print(i,'',end='')
#ok 1 ko 2
#*********************************************************
#裴波那契数列
def fib(max):
n,before,after=0,0,1
while n<max:
# print(after,'',end='')
yield after
before,after = after,before+after
n+=1
g=fib(10)
print(g)#<generator object fib at 0x0000000001E97410>
print(next(g),'',end='')
print(next(g),'',end='')
print(next(g),'',end='')
print(next(g),'',end='')
print(next(g),'',end='')
#1 1 2 3 5
#***********************************************************
def fo():
print('ok','',end='')
m=yield 1
print(m,'',end='')
print('ko','',end='')
yield 2
v=fo()
v.send(None)#=next(a) 如果seed前没有next则参数只能传None 因为第一次找不到对应的yield而去传值
y2=v.send('bbb')#改变m(找到对应的yield)的值
print(y2)
#ok bbb ko 2
 
go go go! ! !
原文地址:https://www.cnblogs.com/zbooo/p/8982859.html