• Python之生成器、迭代器


    生成器

    生成器类似返回值为数组的一个函数,这个函数可以接受参数,可被调用,但只能产生一个值,所以大大节省内存。

    生成器表达式的语法非常简单,只需要将列表推导式的中括号改成小括号就可以了

    1 [x+x for x in range(10) if x%2==0]#会打印出整个列表
    [0, 4, 8, 12, 16]
    1 (x+x for x in range(10) if x%2==0)#按某种程序规则存储起来,只隐士的显示出来
    <generator object <genexpr> at 0x7fbb230ebe50>

    调用生成器的方法也非常简单,用循环直接打出即可,或用next()函数打印单个元素。但是生成器里的对象只能被读取一次,就会从内存中消失。
    1 g=(x+x for x in range(10) if x%2==0)
    2 for i in g:
    3     print(i)
    0
    4
    8
    12
    16

    尝试第二次打印
    1 for i in g:
    2     print(i)#因为被读取过,所以打印为空

    next()获取

    1 c=(x+x for x in range(10) if x%2==0)
    2 next(c)

    0

    1 next(c)

    4

    直到调用最后一个对象之后再用next() 会出现Stopiteration的报错。

     


    迭代器 

    1、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象

    (实际for语句的内部实现应该就是首先调用对象的__iter__方法,获取一个迭代器对象,接着不停的调用迭代器对象的__next__方法,循环遍历取值。)

    2、可迭代对象:简单来讲可用for循环的对象,如list、dict、set等都是可迭代的对象。

    3、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration报错,最后结束迭代。

    4、可迭代对象可通过iter()函数转化成迭代器

    1 a=iter(list("python"))#用iter(可迭代对象)创建迭代器
    2 a
    <list_iterator at 0x7fc9158dbb90>
    next(a)
    'p'

     

    总结:1、简单来讲能被for作用循环的我们可以视为可迭代的对象(iterable),生成器(generator)、迭代器(iterator)、list、set等都为可迭代的对象。
             2、能被next( )作用的对象我们称之迭代器。我们可知生成器也能被next( )调用,其实生成器是特殊的迭代器。
             3、为什么有些可迭代对象不是迭代器,因为迭代器的实质是数据流,是惰性的,(我自己理解为待推到多米骨诺牌),所以迭代器可以用next()一个个激活其中的对象。
             4、生成器、迭代器、可迭代的对象三者关系可理解为:生成器<迭代器<可迭代的对象
  • 相关阅读:
    kill新号专题
    LSB 简介
    linux之eval用法(高级bash程序员的必修之技)
    squid日志配置与轮询
    004_ssh连接慢的问题的解决?
    python操作redis-set
    python操作 redis-list
    python操作redis-hash
    python操作redis--string
    python连接redis002
  • 原文地址:https://www.cnblogs.com/ye20190812/p/13355999.html
Copyright © 2020-2023  润新知