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