Is generator.next() visible in Python 3?

iteration, python, python-3.x

Solution

`g.next()` has been renamed to `g.__next__()`. The reason for this is consistency: special methods like `__init__()` and `__del__()` all have double underscores (or "dunder" in the current vernacular), and `.next()` was one of the few exceptions to that rule. This was fixed in Python 3.0. [*]

But instead of calling `g.__next__()`, use `next(g)`.

[*] There are other special attributes that have gotten this fix; `func_name`, is now `__name__`, etc.

Problem

I have a generator that generates a series, for example: ``` def triangle_nums(): '''Generates a series of triangle numbers''' tn = 0 counter = 1 while True: tn += counter yield tn counter += + 1 ``` In Python 2 I am able to make the following calls: ``` g = triangle_nums() # get the generator g.next() # get the next value ``` however in Python 3 if I execute the same two lines of code I get the following error: ``` AttributeError: 'generator' object has no attribute 'next' ``` but, the loop iterator syntax does work in Python 3 ``` for n in triangle_nums(): if not exit_cond: do_something()... ``` I haven't been able to find anything yet that explains this difference in behavior for Python 3.

Original source