Screwing Up looping in Generator

Deborah Swanson python at deborahswanson.net
Tue Jan 3 01:05:12 EST 2017


Chris Angelico wrote, on January 03, 2017 3:35 PM
>
> On Wed, Jan 4, 2017 at 10:05 AM, Deborah Swanson
> <python at deborahswanson.net> wrote:
> > Ok, I learned how to use generators in Python 2.7.8, which may be
> > different from Python 3 for generators. But I learned from MIT's
> > online introduction to python course, and they certainly
> seem to know
> > python well. So what is the correct way to call the
> generator's next
> > yield in Python 3? We only learned to use the next function. If you
> > don't use the next function, what do you use?
>
> The built-in next function, not the next method.
>
> # don't do this
> gen.next()
>
> # do this
> next(gen)
>
> ChrisA

You speak the truth! I never doubted, but since I still have 2.7.8 on my system 
 I decided to try it out.

For a simple little Fibbonacci number generator:

def genFib ():
        fibn_1 = 1 #fib(n-1)
        fibn_2 = 0 #fib(n-2)
        while True:
                # fib(n) = fib(n-1) + fib(n-2)
                next = fibn_1 + fibn_2
                yield next
                fibn_2 = fibn_1
                fibn_1 = next

and at the console:

>>> fib = genFib()
>>> fib.next()

2.7.8 works, and cranks out as many Fibbonacci numbers as you could want.

But in 3.4.3 you get:

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    fib.next()
AttributeError: 'generator' object has no attribute 'next'

Then, going the other way, next(fib) works in both versions.



More information about the Python-list mailing list