【问题标题】:How to make a repeatable iterator with python如何用python制作一个可重复的迭代器
【发布时间】:2020-07-02 08:22:00
【问题描述】:

有没有办法让一个迭代器可以重复使用?

我正在尝试用 CNN 模型训练不是图片的东西。为了节省内存,我使用fit_generate() 来拟合数据。据我所知,只有迭代器对象可以在fit_generate() 中使用。但我不能使用 Keras 的函数ImageDataGernerater()。唯一的方法是自己制作一个迭代器。我试过iter(),肯定不是可重复的迭代器。

【问题讨论】:

    标签: python iterator


    【解决方案1】:

    您可以制作可重复的迭代器,是的。他们究竟将如何在这里工作?

    我可以想象的一件事是让生成器可重复,只需调用__iter__ 重新初始化生成器即可:

    from functools import wraps
    
    def repeatable(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            return RepeatableGenerator(fn, *args, **kwargs)
        return wrapper
    
    
    class RepeatableGenerator:
        def __init__(self, gen, *args, **kwargs):
            self.gen = gen
            self.args = args
            self.kwargs = kwargs
            self.it = None
    
        def __iter__(self):
            self.it = self.gen(*self.args, **self.kwargs)
            return self
    
        def __next__(self):
            return next(self.it)
    

    然后你可以用它来装饰你自己的生成器:

    >>> @repeatable
    >>> def generator():
    ...     yield 1
    ...     yield 2
    >>> g = generator()
    >>> list(g)
    [1, 2]
    >>> list(g)
    [1, 2]
    

    或者你可以将它应用到一些现有的生成器:

    from foo_lib import bar_generator
    
    bar_generator = repeatable(bar_generator)
    

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 2018-08-19
      • 2019-08-23
      • 2019-03-23
      • 2015-07-09
      • 2015-09-20
      • 1970-01-01
      • 2015-08-03
      • 2014-12-12
      相关资源
      最近更新 更多