使用一种方法来创建生成器的多个新实例

时间:2019-06-24 20:53:54

标签: python loops iterator generator

我最近一直在学习有关Python生成器的问题。在学习Java之前,我曾使用过迭代器,因此我知道它们的基本工作原理。

所以我了解此问题在做什么:Python for loop and iterator behavior

从本质上讲,一旦for循环遍历迭代器,它将在此处停止,因此执行另一个for循环将在迭代器的末尾继续迭代器(并导致不打印任何内容)。对我来说很清楚

我也知道tee method from itertools,它使我可以“复制”一个生成器。当我想对生成器进行任何操作之前检查生成器是否为空时,我发现这很有用(因为我可以检查列表形式中的重复项是否为空)。

在我正在编写的代码中,我需要在代码中的不同实例上创建许多相同的生成器,所以我的思路是:为什么不编写一个生成生成器的方法?因此,每当我需要一个新方法时,都可以调用该方法。也许我的误解与“发电机创建”过程有关,但对我而言这似乎是正确的。

这是我正在使用的代码。当我第一次调用该方法并使用tee复制它时,一切正常,但是一旦遍历它之后再次调用它,该方法将返回一个空的生成器。这种“使用方法”的解决方法不起作用吗?

node_list=[]
generate_hash_2, temp= tee(generate_nodes(...))
for node in list(temp):
    node_list.append(...)
print("Generate_hash_2:{}".format(node_list)) 
for node in generate_hash_2:
    if node.hash_value==x:
         print x
node_list2=[]
generate_hash_3, temp2= tee(generate_nodes(...)) #exact same parameters as before
for node in list(temp2):
    node_list2.append(...)
print("Generate_hash_3:{}".format(node_list2))     

`

def generate_nodes(nodes, type): for node in nodes: if isinstanceof(node.type,type): yield node

请忽略较差的变量名选择,但是temp2可以很好地打印出来,但是temp3可以打印出一个空列表,尽管这些方法采用相同的参数:(请注意,for循环的内部不会修改任何项或任何帮助或解释都很好!

对于示例XML文件,我有以下内容:

<top></top>

对于示例输出,我得到:

Generate_hash_2:["XPath:/*[name()='top'][1], Node Type:UnknownNode, Tag:top, Text:"] Generate_hash_3:[]

如果您有兴趣帮助我进一步了解这一点,我一直在编写这些方法以了解此处的文件:https://github.com/mmoosstt/XmlXdiff/tree/master/lib/diffx,特别是different.py文件

该文件中的代码不断调用_gen_dx_nodes()方法(具有相同的参数),该方法可创建生成器。但是代码的生成器永远不会“结束”,并迫使编写者做一些事情来重置它。所以我很困惑为什么会发生这种情况(因为从不同方法依次调用该方法时,我一直遇到问题)。我也一直在使用相同的测试用例,所以我对如何解决这个问题很迷茫。任何帮助都会很棒!

0 个答案:

没有答案