What Is Generator Iterator

This section provides a quick introduction of generator iterator, which is created by a generator function or a generator expression.

What Is Generator Iterator - A generator iterator is an iterator object created by a generator function or a generator expression.

A generator iterator is also iterable. iter(generator) returns the generator itself.

What Is Generator Function - A generator function is a special function that contains one or more "yield" statements.

What Is "yield" Statement - A "yield" statement is a simple statement with this syntax:

yield EXPRESSION

The logic of using a generator function can be described as:

In order to understand the behavior of "yield" statements in a generator function, I wrote the following tutorial example, yield_test.py:

#  yield_test.py
#- Copyright 2022 (c) HerongYang.com. All Rights Reserved.
#

def get_squares(n):
   i = 0
   while i < n:
      print('get_squares():', i)
      yield i*i
      print('get_squares(): after yield')
      i += 1

g = get_squares(4)
print("object g: id and type =", id(g), type(g))

i = iter(g)
print("object i: id and type =", id(i), type(i))

print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i))

If you run this sample code, you should get:

herong$ python yield_test.py

('object g: id and type =', 4528495104, <type 'generator'>)
('object i: id and type =', 4528495104, <type 'generator'>)

('get_squares():', 0)
0

get_squares(): after yield
('get_squares():', 1)
1

get_squares(): after yield
('get_squares():', 2)
4

get_squares(): after yield
('get_squares():', 3)
9

get_squares(): after yield
Traceback (most recent call last):
  File "yield_test.py", line 23, in <module>
    print(next(i))
StopIteration

The output confirms that Python system converts the get_squares() function into a "get_squares" class, and implements both __iter()__() and __next__() methods. So the function call get_squares(5) becomes a constructor call to create a "generator" object, which is an "iterable" and "iterator" at the same time.

Of course, you can use get_squares(5) in a "for" loop directly.

for x in get_squares(5):
   print(x)

Table of Contents

 About This Book

 Running Python Code Online

 Python on macOS Computers

 Python on Linux Computers

 Built-in Data Types

 Variables, Operations and Expressions

 Statements - Execution Units

 Function Statement and Function Call

Iterators and Generators

 What Is Iterator Object

 What Is Iterable Object

 Iterable Objects of Built-in Data Types

What Is Generator Iterator

 What Is Generator Expression

 What Is Filtered Generator Expression

 What Is Double-Generator Expression

 List, Set and Dictionary Comprehensions

 Classes and Instances

 Modules and Module Files

 Packages and Package Directories

 "sys" and "os" Modules

 "pathlib" - Object-Oriented Filesystem Paths

 "pip" - Package Installer for Python

 SciPy.org - Python Libraries for Science

 pandas - Data Analysis and Manipulation

 Anaconda - Python Environment Manager

 Jupyter Notebook and JupyterLab

 References

 Full Version in PDF/EPUB