假设我有一个要对其执行某些操作的大型数据列表,并且我希望有多个迭代器独立地执行此操作。你知道吗
data = [1,2,3,4,5]
generator = ((e, 2*e) for e in data)
it1 = iter(generator)
it2 = iter(generator)
我希望这些迭代器是不同的代码对象,但是it1 is it2
返回True
。。。更令人困惑的是,以下生成器也是如此:
# copied data
gen = ((e, 2*e) for e in copy.deepcopy(data))
# temp object
gen = ((e, 2*e) for e in [1,2,3,4,5])
这意味着在实际中,当我调用next(it1)
时,it2
也是递增的,这不是我想要的行为。你知道吗
这是怎么回事,有什么办法可以做我想做的吗?我在ubuntu14.04上使用python2.7。你知道吗
编辑:
我也试了一下:
gen = (e for e in [1,2,3,4,5])
it = iter(gen)
next(it)
next(it)
for e in gen:
print e
打印3 4 5
。。。显然,发电机只是我想象中的一个更受约束的概念。你知道吗
生成器是迭代器。所有行为良好的迭代器都有一个
__iter__
方法,该方法应该从docs
因此,考虑另一个迭代器示例:
所以,同样,一个列表是iterable,因为它有一个
__iter__
方法返回一个迭代器。这个迭代器还有一个__iter__
方法,它应该总是返回自己,但是它也有一个__next__
方法。你知道吗因此,请考虑:
对于发电机:
现在,您正在使用生成器表达式。但是你可以用一个生成函数。要完成您正在做的事情,最直接的方法就是使用:
然后使用:
在本例中,
it1
和it2
将是两个独立的迭代器对象。你知道吗两个iter使用的是同一个生成器。调用
iter(thing)
返回对象的iter
(如果它有一个),因此,iter(generator)在调用它的两次都返回相同的对象。https://docs.python.org/3/library/stdtypes.html#generator-types有两种方法可以获得独特的发电机:
或:
两种解决方案都会产生以下效果:
相关问题 更多 >
编程相关推荐