代码之家  ›  专栏  ›  技术社区  ›  Tony Veijalainen

具有无限生成器的赋值左侧

  •  0
  • Tony Veijalainen  · 技术社区  · 15 年前

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

    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)
    

    即使它没有切片(实际上索引是变量,这只是测试)。我知道小岛等,但太慢了。

    这也会产生错误:

    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
    """
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   kennytm    15 年前

    当你知道 var_list use 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]