python3--生成器,闭包与装饰器

生成器:

             一个一般函数中使用yield关键字,可以实现一个最简单的生成器,

             此时这个函数变成一个生成器函数。yieldreturn返回相同的值,

             区别在于return返回后,函数状态终止,而yield会保存当前函数的执行状态,

            在返回后,函数又回到之前保存的状态继续执行。

    

              生成器函数包含一个或者多个yield

             当调用生成器函数时,函数将返回一个对象,但是不会立刻向下执行

              像__iter__()__next__()方法等是自动实现的,所以我们可以通过next()方法对对象进行迭代

              一旦函数被yield,函数会暂停,控制权返回调用者

              局部变量和它们的状态会被保存,直到下一次调用

              函数终止的时候,StopIteraion会被自动抛出 

闭包

      在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。

根据这句话,其实我们自己就可以总结出在python语言中形成闭包的三个条件,缺一不可:
1)必须有一个内嵌函数(函数里定义的函数)——这对应函数之间的嵌套
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3)外部函数必须返回内嵌函数——必须返回那个内部函数

前两个条件我们比较好理解,那什么会有第三条规定呢?其实闭包一词指的就是上文中提到的那个“内部的函数”,我们下面就会发现,只有那个内部函数才有所谓的__closure__属性。


装饰器

装饰器就是闭包,但装饰器传入的参数是函数

因为python是一门胶水语言,在python一切皆是对象,python中全部都是引用类型

因此函数可以像变量一样被指向和传递。


猜你喜欢

转载自blog.csdn.net/qq_42242750/article/details/80657475