zoukankan      html  css  js  c++  java
  • python 迭代器/iterator与生成器/generator的区别

    i代表迭代器,g代表生成器

    import pickle, time
    
    def gen():
        j = 0
        while j < 7:
            j += 1
            yield j
    
    i = iter([1, 2, 3])
    g = gen()
    
    print('i', type(i))
    print('g', type(g))
    print('i.__dir__()', i.__dir__())
    print('g.__dir__()', g.__dir__())
    print('next(i)', next(i))
    print('next(g)', next(g))
    print('i序列化', pickle.dumps(i))
    time.sleep(1)
    print('g序列化', pickle.dumps(g))

    代码输出如下

    /Users/xxx/PycharmProjects/Test7788/venv/bin/python /Users/xxx/PycharmProjects/Test7788/test5.py
    i <class 'list_iterator'>
    g <class 'generator'>
    i.__dir__() ['__getattribute__', '__iter__', '__next__', '__length_hint__', '__reduce__', '__setstate__', '__doc__', '__repr__', '__hash__', '__str__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
    g.__dir__() ['__repr__', '__getattribute__', '__iter__', '__next__', '__del__', 'send', 'throw', 'close', 'gi_frame', 'gi_running', 'gi_code', '__name__', '__qualname__', 'gi_yieldfrom', '__doc__', '__hash__', '__str__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__init__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
    next(i) 1
    next(g) 1
    i序列化 b'x80x03cbuiltins
    iter
    qx00]qx01(Kx01Kx02Kx03ex85qx02Rqx03Kx01b.'
    Traceback (most recent call last):
      File "/Users/xxx/PycharmProjects/Test7788/test5.py", line 60, in <module>
        print('g序列化', pickle.dumps(g))
    TypeError: can't pickle generator objects
    
    Process finished with exit code 1

    可以看到,i和g是不同类的实例,拥有的属性也不同,虽然都可以使用next方法取值,但是i可以序列化,g不可以序列化,说明g的值是运行时动态生成,而i值是固定生成

  • 相关阅读:
    容器占用空间的小问题
    一个ipv4到ipv6的移植问题
    一个linux内核模块移植到低版本时发生的异常
    一个发包乱序问题记录
    一个docker镜像中的目录删除不了问题
    C/C++(共用体与枚举)
    C/C++(数据结构栈的实现)
    C/C++(结构体)
    C/C++(内存管理)
    C/C++(指针数组)
  • 原文地址:https://www.cnblogs.com/kusy/p/13744097.html
Copyright © 2011-2022 走看看