目录

一、迭代器

二、生成器


一、迭代器

        迭代器有两个基本的方法:iter() 和 next(),“迭代器是Python最优良的特性之一”

        之前一直理解不了这句话,因为说这句话的人,解释的时候通常是拿迭代器和for循环做比较,一起计算同一个循环,如下所示:

>>> list=[1,2,3,4]
 >>> it = iter(list)    # 创建迭代器对象
 >>> print (next(it))   # 输出迭代器的下一个元素
 1
 >>> print (next(it))
 2
 >>> 
list=[1,2,3,4] it = iter(list) # 创建迭代器对象
for x in it:
     print (x, end=" ")

        结果一模一样,所以很难直观体会迭代器的优势,觉得他和普通的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时,生成器属于用的时候再计算,而常规函数则是提前把所有结果计算出来,再输出。这样速度慢了不少,内存也占了。

 

借鉴:

  1. https://www.runoob.com/python3/python3-iterator-generator.html
  2. https://www.zhihu.com/question/20829330/answer/133606850