目录
一、迭代器
二、生成器
一、迭代器
迭代器有两个基本的方法:iter() 和 next(),“迭代器是Python最优良的特性之一”
之前一直理解不了这句话,因为说这句话的人,解释的时候通常是拿迭代器和for循环做比较,一起计算同一个循环,如下所示:
|
结果一模一样,所以很难直观体会迭代器的优势,觉得他和普通的for循环并无差异,这导致我一直对它无感。
后来我才理解,迭代器其实是一种Python协议,举个例子,python中可以使用For循环对文件进行遍历,这才其它编程语言中是无法实现的:
>>> with open(‘/etc/passwd’) as f: # 文件对象提供迭代器协议
... for line in f: # for循环使用迭代器协议访问文件
... print line
...
在Python中,文件对象实现了迭代器协议,for循环并不知道它遍历的是一个文件对象,它只管使用迭代器协议访问对象即可。正是由于Python的文件对象实现了迭代器协议,我们才得以使用如此方便的方式访问文件。
相信大家内心能更好的理解迭代器是啥了,下面大概介绍一下:
- 迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代
- 可迭代对象就是:实现了迭代器协议的对象
- 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象。
二、生成器
生成器和函数表达语法一致,区别在于函数用return返回数据,生成器用yield如果有C语言基础的话,Python中的生成器类似于C语言中的静态变量:
- 静态变量static:每次操作都指向同一地址内存,可以对内存连续操作;
- 动态变量auto则每次都会初始化
个人觉得这样的好处在于提高程序计算速度,且省内存,使用Python3举个例子:
#---------------使用生成器--------------#
def gensquares(N):
for i in range(N):
yield i ** 2
for item in gensquares(5):
print(item)
#-----------使用常规函数--------------#
def gensquares(N):
res = []
for i in range(N):
res.append(i*i)
return res
for item in gensquares(5):
print(item)
可以看到,每次for循环输出item时,生成器属于用的时候再计算,而常规函数则是提前把所有结果计算出来,再输出。这样速度慢了不少,内存也占了。
借鉴:
- https://www.runoob.com/python3/python3-iterator-generator.html
- https://www.zhihu.com/question/20829330/answer/133606850