[英]Left hand side of assignment with infinite generators
抱歉,我先前提出的问题加倍,但是我想问一下可以解决问题的具体数据。 我想要这个结果
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_list
的长度时,可以使用itertools.islice
切断无限生成器:
>>> 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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.