Python: generator expression vs. yield

前端 未结 8 763
悲哀的现实
悲哀的现实 2020-12-07 08:43

In Python, is there any difference between creating a generator object through a generator expression versus using the yield statement?

8条回答
  •  抹茶落季
    2020-12-07 09:06

    In usage, note a distinction between a generator object vs a generator function.

    A generator object is use-once-only, in contrast to a generator function, which can be reused each time you call it again, because it returns a fresh generator object.

    Generator expressions are in practice usually used "raw", without wrapping them in a function, and they return a generator object.

    E.g.:

    def range_10_gen_func():
        x = 0
        while x < 10:
            yield x
            x = x + 1
    
    print(list(range_10_gen_func()))
    print(list(range_10_gen_func()))
    print(list(range_10_gen_func()))
    

    which outputs:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    Compare with a slightly different usage:

    range_10_gen = range_10_gen_func()
    print(list(range_10_gen))
    print(list(range_10_gen))
    print(list(range_10_gen))
    

    which outputs:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    []
    []
    

    And compare with a generator expression:

    range_10_gen_expr = (x for x in range(10))
    print(list(range_10_gen_expr))
    print(list(range_10_gen_expr))
    print(list(range_10_gen_expr))
    

    which also outputs:

    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    []
    []
    

提交回复
热议问题