Understanding generators in Python

前端 未结 12 1569
日久生厌
日久生厌 2020-11-21 05:46

I am reading the Python cookbook at the moment and am currently looking at generators. I\'m finding it hard to get my head round.

As I come from a Java background, i

12条回答
  •  长发绾君心
    2020-11-21 06:17

    It helps to make a clear distinction between the function foo, and the generator foo(n):

    def foo(n):
        yield n
        yield n+1
    

    foo is a function. foo(6) is a generator object.

    The typical way to use a generator object is in a loop:

    for n in foo(6):
        print(n)
    

    The loop prints

    # 6
    # 7
    

    Think of a generator as a resumable function.

    yield behaves like return in the sense that values that are yielded get "returned" by the generator. Unlike return, however, the next time the generator gets asked for a value, the generator's function, foo, resumes where it left off -- after the last yield statement -- and continues to run until it hits another yield statement.

    Behind the scenes, when you call bar=foo(6) the generator object bar is defined for you to have a next attribute.

    You can call it yourself to retrieve values yielded from foo:

    next(bar)    # Works in Python 2.6 or Python 3.x
    bar.next()   # Works in Python 2.5+, but is deprecated. Use next() if possible.
    

    When foo ends (and there are no more yielded values), calling next(bar) throws a StopInteration error.

提交回复
热议问题