Python_生成器_闭包

       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),而是外界调用有外函数的内部函数。

猜你喜欢

转载自blog.csdn.net/qq_52119661/article/details/128624873