迭代器(iterator)
itertion: 就是迭代,一个接一个(one after another),是一个通用的概念,比如一个循环遍历某个数组。
iterable: 这个是可迭代对象,属于python的名词,范围也很广,可重复迭代,满足如下其中之一的都是iterable:
- 可以for循环: for i in iterable
- 可以按index索引的对象,也就是定义了getitem方法,比如list,str;
- 定义了iter方法。可以随意返回。
- 可以调用iter(obj)的对象,并且返回一个iterator
iterator: 迭代器对象,也属于python的名词,只能迭代一次。需要满足如下的迭代器协议
- 定义了iter方法,但是必须返回自身
- 定义了next方法,在python3.x是next。用来返回下一个值,并且当没有数据了,抛出StopIteration可以保持当前的状态
迭代是Python最强大的功能之一,是访问集合元素的一种方式
迭代器是一个可以记住遍历的位置的对象
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退
迭代器有两个基本的方法:iter() 和 next()
字符串,列表或元组对象都可用于创建迭代器
list=[1,2,3,4]
it = iter(list)
print (next(it)) #1
print (next(it)) #2
生成器(generator)
在 Python 中,使用了 yield 的函数被称为生成器(generator)
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行
调用一个生成器函数,返回的是一个迭代器对象
一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用
打个比方的话,yield有点像断点。 加了yield的函数,每次执行到有yield的时候,会返回yield后面的值 并且函数会暂停,直到下次调用或迭代终止
yield后面可以加多个数值(可以是任意类型),但返回的值是元组类型的
logging
Logging 函数允许用户对应用程序进行日志记录,并把日志消息发送到电子邮件、系统日志或其他的机器
装饰器语法糖
闭包的重要特性:封存上下文,这一特性可以巧妙的被用于现有函数的包装,从而为现有函数增加功能。而这就是装饰器
闭包
使用像javascript和python这样支持面向对象范式的语言进行编程时,都会涉及到闭包的概念以及闭包的使用。我们今天就从这两个方面来讨论一下闭包
首先是维基百科中关于闭包的概念:
在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。闭包可以用来在一个函数与一组“私有”变量之间创建关联关系。在给定函数被多次调用的过程中,这些私有变量能够保持其持久性。
根据这句话,其实我们自己就可以总结出在python语言中形成闭包的三个条件,缺一不可:
1)必须有一个内嵌函数(函数里定义的函数)——这对应函数之间的嵌套
2)内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量
3)外部函数必须返回内嵌函数——必须返回那个内部函数