【问题标题】:Return list from generator Python从生成器 Python 返回列表
【发布时间】:2017-06-10 11:53:13
【问题描述】:

我正在尝试从 networkx 的原始版本为 DFS 制作自定义版本。您可以在此处关联 networkx 的 DFS 原始版本:networkx DFS

在我的实现中,我想将标签中包含“if”的子项添加到列表中,然后返回列表,但我做不到

def extract_expression(label):
    m = re.search('if(.+?)goto', label)
    if m:
       return m.group(1)
    return None

def dfs_edges(G, source=None):  
    path = list()
    if source is None:
        nodes = G
    else:
        nodes = [source]
    visited=set()
    for start in nodes:
        if start in visited:
            continue
        visited.add(start)
        stack = [(start,iter(G[start]))]
        while stack:
            parent,children = stack[-1]
            try:
                child = next(children)
                label = G.node[child]['label']
                if "if" in label:
                    print child
                    # print extract_expression(label)
                exp = extract_expression(label)
                path.append(exp)
                if child not in visited:
                    yield parent,child      
                    visited.add(child)
                    stack.append((child,iter(G[child])))
            except StopIteration:
                stack.pop()
    return path

抛出错误

    return path
SyntaxError: 'return' with argument inside generator

【问题讨论】:

  • 生成器用yield 一个一个地返回项目。没有return
  • extract_expression 的作用。
  • @JayParikh:它只是一个从原始字符串中提取子字符串的函数
  • 正如它所说,您不能在生成器中拥有return。如果您想添加到列表中,请从一个空列表开始,然后只需 append()

标签: python networkx yield


【解决方案1】:

生成器函数必须始终产生其结果。

您可以简单地将return path 替换为yield path,但这将是不好的做法并且总体上不一致。 你会返回parent, child,然后突然得到一个列表。

【讨论】:

  • 是的,有没有其他方法可以修改此代码? ,因为我只想返回列表
  • 是的,只需删除 yield parent, child 语句并在末尾保留您的 return path。 :)
猜你喜欢
  • 2016-06-22
  • 2014-03-17
  • 1970-01-01
  • 2016-04-14
  • 2016-04-14
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多