生成器:
一个一般函数中使用yield
关键字,可以实现一个最简单的生成器,
此时这个函数变成一个生成器函数。yield
与return
返回相同的值,
区别在于return
返回后,函数状态终止,而yield
会保存当前函数的执行状态,
在返回后,函数又回到之前保存的状态继续执行。
生成器函数包含一个或者多个yield
当调用生成器函数时,函数将返回一个对象,但是不会立刻向下执行
像__iter__()
和__next__()
方法等是自动实现的,所以我们可以通过next()
方法对对象进行迭代
一旦函数被yield
,函数会暂停,控制权返回调用者
局部变量和它们的状态会被保存,直到下一次调用
函数终止的时候,StopIteraion
会被自动抛出
闭包
在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
根据这句话,其实我们自己就可以总结出在python语言中形成闭包的三个条件,缺一不可:
1)必须有一个内嵌函数(函数里定义的函数)——这对应函数之间的嵌套
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3)外部函数必须返回内嵌函数——必须返回那个内部函数
前两个条件我们比较好理解,那什么会有第三条规定呢?其实闭包一词指的就是上文中提到的那个“内部的函数”,我们下面就会发现,只有那个内部函数才有所谓的__closure__属性。
装饰器
装饰器就是闭包,但装饰器传入的参数是函数
因为python是一门胶水语言,在python一切皆是对象,python中全部都是引用类型
因此函数可以像变量一样被指向和传递。