【问题标题】:Issue in accessing the output using generator functions in python在 python 中使用生成器函数访问输出的问题
【发布时间】:2020-12-02 09:37:17
【问题描述】:

我有下面的代码,我需要一次使用从 CSV 文件中检索到的数据的一个元组执行一些操作,然后在再次调用 step 函数时移动到下一个元组。我不明白如何使用 obs 变量。当我检索时,我得到一个生成器对象。非常感谢您的帮助。

  def get_state(self):
    def createGenerator(self):
     obs_data = [tuple(x) for x in self.data[['value_1']], 
           'value_2']].to_numpy()]
     for obs in obs_data:
        yield obs

  def step(self):
    ob = self.get_state()

【问题讨论】:

  • 你可以做类似for o in ob: …的事情。但是现在编写代码的方式使用生成器似乎有点毫无意义。您正在将数据收集到一个列表中,对其进行迭代,然后生成它。

标签: python python-3.x iterator generator yield


【解决方案1】:
  1. 您没有在外部方法中返回任何内容,只在内部生成器函数中返回。
  2. 您永远不会调用内部函数来实际创建生成器。

我无法准确说出您的要求,但下面是可以运行的代码:

def get_state(self):
    def createGenerator():
       obs_data = [tuple(x) for x in self.data[['value_1']], 
           'value_2']].to_numpy()]
       for obs in obs_data:
          yield obs
    if self.gen is None:
        self.gen = createGenerator()
    return next(self.gen)

def step(self):
    ob = self.get_state()

您应该使用next() 来获取值,或者您可以使用 for 循环并将生成器视为可迭代对象。

【讨论】:

  • @emandavis 我不确定您的问题是什么,您是否遇到错误?
  • 在您的__init__ 中将self.gen 初始化为None。为了使其无缝,您可能还需要做一些其他的调试工作。这只是一个起点,因为我不知道你所拥有的一切
  • 对不起,我已经解决了这个问题。感谢您的帮助,它的工作就像一个魅力
  • 抱歉,您能再澄清一下吗? env.step() 每次调用时都应该有不同的ob
猜你喜欢
  • 2020-09-17
  • 2013-09-26
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多