代码之家  ›  专栏  ›  技术社区  ›  jsbueno

执行生成器表达式的最python的方法是什么?

  •  3
  • jsbueno  · 技术社区  · 15 年前

    表达式和其他类型的迭代器。 然而,有时我看到自己想要滚动一行“for”循环,只是为了执行一些操作。

    要真正执行循环,什么是最具python风格的?

    a = open("numbers.txt", "w")
    (a.write ("%d " % i) for i in xrange(100))
    a.close()
    

    不是真正的代码,但你明白我的意思。如果使用列表生成器,则会产生副作用,即创建一个N长度的列表,其中填充“None”。

    目前我所做的是在调用“any”或“all”时使用表达式作为参数。但是我想找到一种不依赖于在循环中执行的表达式的结果的方法-“any”和“all”都可以根据所计算的表达式停止。

    很明显,这些方法我已经知道了,每种方法都有缺点:

    [a.write ("%d " % i) for i in xrange(100))]
    
    any((a.write ("%d " % i) for i in xrange(100)))
    
    for item in (a.write ("%d " % i) for i in xrange(100)): pass
    
    3 回复  |  直到 15 年前
        1
  •  10
  •   Jerub    15 年前

    有一个显而易见的方法,那就是你应该这样做。用聪明的方法做这件事是没有理由的。

    a = open("numbers.txt", "w")
    for i in xrange(100):
        a.write("%d " % i)
    d.close()
    

    延迟执行给了您一个很大的好处:它允许您将一个序列传递给另一段代码,而不必将整个代码保存在内存中。它用于创建作为数据类型的有效序列。

    在这种情况下,您不希望延迟执行。你想要处决。你可以。。。执行。用一个 for

        2
  •  7
  •   Darius Bacon    15 年前

    如果我想做这个具体的例子,我会写

    for i in xrange(100): a.write('%d ' % i)
    

    如果我经常需要使用迭代器来实现它的效果,我会定义

    def for_effect(iterable):
        for _ in iterable:
            pass
    
        3
  •  6
  •   Alex Martelli    15 年前

    有很多 accumulators 它们的作用是消耗它们所给的全部可数,例如 min max --但即使是他们也没有完全忽视这个过程中产生的结果( 最小 最大值

    def consume(iterable):
        for item in iterable: pass
    

    我想,主要原因是Python有 for 声明,你应该使用它时,它适合像手套(即,为案件你想要的) consume

    顺便说一句, a.write 退货 None ,这是福西什,所以 any 会消耗掉它(而且 a.writelines 会做得更好的!)。但我知道你只是举个例子;-)。

        4
  •  1
  •   jsbueno    5 年前

    现在是2019年- recent thread in one of Python's mailing lists spammed over 70 e-mails on this subject ,他们再次拒绝添加 consume

    import deque
    
    consume = deque(maxlen=0).extend 
    

    然后使用 消费 可调用以处理生成器表达式。

    结果发现 deque cPython中的本机代码实际上是针对 maxlen=0 情况下,将只消耗iterable。
    这个 any all 我在问题中提到的调用应该同样有效,但是人们必须担心表达式的真实性,以便使用iterable。


    我知道这可能还是有争议的,毕竟,一个显式的两行for循环可以处理这个问题-我记得这个问题,因为我只是做了一个提交,在这里我创建了一些线程,然后开始,然后连接,然后返回-没有 消费 可调用的,即4行,大部分是锅炉板,在本机代码中不受益于循环使用iterable: https://github.com/jsbueno/extracontext/blob/a5d24be882f9aa18eb19effe3c2cf20c42135ed8/tests/test_thread.py#L27