浅谈Python语法中的迭代器与生成器

目录

一、迭代器

二、生成器


一、迭代器

        迭代器有两个基本的方法: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

           

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值