• 生成器、迭代器、可迭代对象


    生成器、迭代器、可迭代对象这三者的关系刚刚开始接触可真是让我头疼,总结图如下:

     1、生成器是一种特殊的迭代器,所以生成器一定是迭代器

    2、迭代器一定是可迭代对象

    3、可迭代对象可以通过iter()方法转化程迭代器

    到底什么是可迭代对象?

    可迭代对象其实没什么好说的,我们在python编程中就遇到过很多,比如列表、元祖等都是可迭代对象;

    可迭代对象:可以返回一个迭代器的对象都可以称之可迭代对象,可迭代对象一定会存在__iter__方法

    例如:

    迭代器 

    迭代器:迭代器一定是一个可迭代器对象,可迭代器对象也可以转化程迭代器,同时迭代器肯定会有__next__和__iter__方法,下面我们可以实现一个迭代器

     那么这个迭代器到底有什么作用呢?其实迭代器就相当于一个懒工厂,当我们需要当时候就可以调用next()方法返回值,没有需要当时候就等候,例如:

    list1 = [1, 2334, 44, 34]
    inter = iter(list1)
    print(next(inter))
    print(next(inter))
    print(next(inter))
    print(next(inter))
    1
    2334
    44
    34

    可以看出:上面就通过next方法将迭代器中的值给取出来了

    注意:迭代器中有多少值就只能取几次,超过就会抛出异常:StopIteration

    生成器

    生成器:生成器是一个特殊的迭代器,定义生成器可以通过两种方式:生成器表达式以及函数形式

    生成器表达式:

     通过上面可以看出生成器表达式是否有点像列表推倒式,只是[]换成了()

    函数形式:如果要用函数的形式实现生成器的话就需要用到yield关键字

     注意:生成器中还有一个send方法,该方法是传递值进行替换生成器中的值,但是不能在初始的时候发送值,必须在中间

    def iter3():
        for i in range(1, 10):
            num = yield i
            print(num)
    
    a = iter3()
    print(next(a))
    a.send(100)
    print(next(a))
    1
    100
    None
    3

    看到上述代码指定结果可以得出:a.send(100)就替换了2这个值,只用None这个值是因为iter()值中的print,因为直接替换了2这个值,那么就不会取到2这个值了,所以num为None

  • 相关阅读:
    *** 疑问
    *** C++动态绑定(多态)example code 1
    *** C++纯虚函数使用example code 1
    *** C++实现string各类运算符重载成员函数
    *** C++虚函数表原理相关代码
    *** 自写MyString类:重载操作符 '+'
    *** [转]C++在类的成员函数中,允许直接访问该类的成员对象的私有成员变量
    *** [转] C++基础篇--overload重载&override覆盖&overwrite隐藏
    *** C++ 中的函数重载
    *** 关于虚函数的一些常见问题
  • 原文地址:https://www.cnblogs.com/LCboss/p/13970262.html
Copyright © 2020-2023  润新知