Python 具有无穷多个生成器的赋值的左侧

Python 具有无穷多个生成器的赋值的左侧,python,generator,lazy-evaluation,infinite,Python,Generator,Lazy Evaluation,Infinite,很抱歉把我先前的问题翻了一番,但我想问一些具体的数据,这些数据可以解决这个问题。我想要这个结果 tuple_of_vars = (item for _, item for zip(tuple_of_vars, new_vals_generator)) 因为这是不可能的 a, b, c, d = (val for val in infite_generator) 实际上,我想在一行中做 for var in var_list: var = next(infinite_generator

很抱歉把我先前的问题翻了一番,但我想问一些具体的数据,这些数据可以解决这个问题。我想要这个结果

tuple_of_vars = (item for _, item for zip(tuple_of_vars, new_vals_generator))
因为这是不可能的

a, b, c, d = (val for val in infite_generator)
实际上,我想在一行中做

for var in var_list:
    var = next(infinite_generator)
是否有解释器钩子来获取赋值左侧变量数量的元信息?更好的做法是,我可以自动完成最后一段代码(包括左侧的情况,即带有可变索引和步骤的切片)

还有一种方法可以使变量生成器成为赋值的左侧

编辑:这不会在Python3中停止:

def incr(a):
    while True:
        yield a
        a += 1


a = [None for i in range(20)]

a[3:3:3], *_ = incr(1)

print(a)
同:

a,b,c,d, *_ = incr(1)

print(a, b, c, d)
即使它没有切片(实际上索引是变量,这只是测试)。我知道islice等,但它太慢了

这也会产生错误:

a = 1000*[True]

bound = int(len(a) ** 0.5)

for i in range(3, bound, 2):
    a[3::i], *x = [[False] for _ in range(bound)]

""" Error:
ValueError: attempt to assign sequence of size 1 to extended slice of size 333
"""
这是:

a = 1000*[True]

bound = int(len(a) ** 0.5)

for i in range(3, bound, 2):
    a[3::i], *x = [False] * bound

""" Error:
TypeError: must assign iterable to extended slice
"""

当您知道
var\u列表的长度时,您可以切断无限生成器:

>>> import itertools
>>> infgen = itertools.cycle([1,4,9])
>>> a,b,c,d = itertools.islice(infgen, 4)
>>> a,b,c,d
(1, 4, 9, 1)
它也适用于分配给列表的一部分

>>> lst = [0]*20
>>> lst[2:10:2] = itertools.islice(infgen, 4)
>>> lst
[0, 0, 4, 0, 9, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

哦,看起来我应该对psyco和Python2 unicode说,然后继续!但左手边的切片怎么样<代码>我的切片[a:b:c],*?我得到了无效的语法。@Tony:您需要使用
islice
来实现这一点(也适用于Python 2.x)。值的数量事先不知道,因为它是由变量动态生成的。@Tony:如果是一个片段,值的数量可以很容易地计算出来。实际问题是什么?速度,但当然用例并没有那么严重(因为numpy模块有更好的解决方案),