1、有时候,序列或集合内的元素的个数非常巨大,如果全制造出来并放入内存,对计算机的压力是非常大的。 比如,假设需要获取一个10**20次方如此巨大的数据序列,把每一个数都生成出来,并放在一个内存的列表内,这是粗暴的方式,有如此大的内存么?如果元素可以按照某种算法推算出来,需要就计算到哪个,就可以在循环的过程中不断推算出后续的元素,而不必创建完整的元素集合,从而节省大量的空间。 在Python中,这种一边循环一边计算出元素的机制,称为生成器:generator。
s=(x*x for x in range(1,4))
print(next(s))
2、通过yield关键字得到生成器。
斐波那契数列:
def createNums():
a,b=0,1
for i in range(5):
yield b#返回生成器类型
#print(b) #输出斐波那契数列
a,b=b,a+b
j=createNums()
#print(j)
print(type(j))
print(next(j))
print(next(j))
在Python中,使用yield返回的函数会变成一个生成器( generator)。在调用生成器的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行。
3、send
yield返回值后自身为空,send可以为其赋值。
def test():
i=0
while i<5:
print("--1--")
temp=yield i
print("--2--")
print(temp)
i+=1
s=test()
print("--3--")
print(next(s))
print("--4--")
print(next(s))
print("--5--")
print(s.send("haha"))
结果:
4、一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,由此构成闭包
def test1(number):
def test2(number_in):
print(number_in)
return number+number_in
return test2#此处不要带括号
ret =test1(20)#因为外函数返回的值为test2(切记不要带括号),使得ret=test2的
print(ret(30))#此处使用ret(30)=test2(30),但是并非单纯调用test2(30),而是外界调用有外函数的内部函数。