bugl
bugl
HomeLearnPatternsPathsSearchPremium
HomeLearnPatternsPaths
Learn/Python/Foundations
Python•Foundations

Python Generators

Generators

Generators are functions that can pause and resume their execution.

When a generator function is called, it returns a generator object , which is an iterator.

The code inside the function is not executed yet, it is only compiled. The function only executes when you iterate over the generator.

Example

def my_generator():
  yield 1
  yield 2
  yield 3

  for value in my_generator():
    print(value)

Generators allow you to iterate over data without storing the entire dataset in memory.

Instead of using return , generators use the yield keyword.

The yield Keyword

The yield keyword is what makes a function a generator.

When yield is encountered, the function's state is saved, and the value is returned. The next time the generator is called, it continues from where it left off.

Example

def count_up_to(n):
  count = 1
  while count <= n:
    yield count
    count += 1

    for num in count_up_to(5):
      print(num)

Unlike return , which terminates the function, yield pauses it and can be called multiple times.

Generators Saves Memory

Generators are memory-efficient because they generate values on-the-fly instead of storing everything in memory.

For large datasets, generators save memory:

Example

def large_sequence(n):
  for i in range(n):
    yield i

    # This doesn't create a million numbers in memory

    gen = large_sequence(1000000)

    print(next(gen))

    print(next(gen))

    print(next(gen))

Using next() with Generators

You can manually iterate through a generator using the next() function:

Example

def simple_gen():
  yield "Emil"
  yield "Tobias"
  yield "Linus"

  gen = simple_gen()

  print(next(gen))

  print(next(gen))

  print(next(gen))

When there are no more values to yield, the generator raises a StopIteration exception:

Example

def simple_gen():
  yield 1
  yield 2

  gen = simple_gen()

  print(next(gen))

  print(next(gen))

  print(next(gen))  # This will raise StopIteration

Generator Expressions

Similar to list comprehensions, you can create generators using generator expressions with parentheses instead of square brackets:

Example

# List comprehension - creates a list

list_comp = [x * x for x in range(5)]

print(list_comp)

# Generator expression - creates a generator

gen_exp = (x * x for x in range(5))

print(gen_exp)

print(list(gen_exp))

Example

# Calculate sum of squares without creating a list

total = sum(x * x for x in range(10))

print(total)

Fibonacci Sequence Generator

Generators can be used to create the Fibonacci sequence.

It can continue generating values indefinitely, without running out of memory:

Example

def fibonacci():
  a, b = 0, 1
  while True:
    yield a
    a, b = b, a + b

    # Get first 100 Fibonacci numbers

    gen = fibonacci()

    for _ in range(100):
      print(next(gen))

Generator Methods

Generators have special methods for advanced control:

send() Method

The send() method allows you to send a value to the generator:

Example

def echo_generator():
  while True:
    received = yield
    print("Received:", received)

    gen = echo_generator()

    next(gen)  # Prime the generator

    gen.send("Hello")

    gen.send("World")

close() Method

Example

def my_gen():
  try:
    yield 1
    yield 2
    yield 3
  finally:
    print("Generator closed")

    gen = my_gen()

    print(next(gen))

    gen.close()

Previous

Python Recursion

Next

Python range

This chapter

Overview
100

Lessons

265m

Read time

1. Python Tutorial2. Python Introduction3. Python Getting Started4. Python Syntax5. Python Statements6. Python Output / Print7. Python Output Numbers8. Python Comments9. Python Variables10. Python - Variable Names11. Python Variables - Assign Multiple Values12. Python - Output Variables13. Python - Global Variables14. Python Data Types15. Python Numbers16. Python Casting17. Python Strings18. Python - Slicing Strings19. Python - Modify Strings20. Python - String Concatenation21. Python - Format - Strings22. Python - Escape Characters23. Python - String Methods24. Python Booleans25. Python Operators26. Python Arithmetic Operators27. Python Assignment Operators28. Python Comparison Operators29. Python Logical Operators30. Python Identity Operators31. Python Membership Operators32. Python Bitwise Operators33. Python Operator Precedence34. Python Lists35. Python - Access List Items36. Python - Change List Items37. Python - Add List Items38. Python - Remove List Items39. Python - Loop Lists40. Python - List Comprehension41. Python - Sort Lists42. Python - Copy Lists43. Python - Join Lists44. Python - List Methods45. Python Tuples46. Python - Access Tuple Items47. Python - Update Tuples48. Python - Unpack Tuples49. Python - Loop Tuples50. Python - Join Tuples51. Python - Tuple Methods52. Python Sets53. Python - Access Set Items54. Python - Add Set Items55. Python - Remove Set Items56. Python - Loop Sets57. Python - Join Sets58. Python frozenset59. Python - Set Methods60. Python Dictionaries61. Python - Access Dictionary Items62. Python - Change Dictionary Items63. Python - Add Dictionary Items64. Python - Remove Dictionary Items65. Python - Loop Dictionaries66. Python - Copy Dictionaries67. Python - Nested Dictionaries68. Python Dictionary Methods69. Python If Statement70. Python Elif Statement71. Python Else Statement72. Python Shorthand If73. Python Logical Operators74. Python Nested If75. Python Pass Statement76. Python Match77. Python While Loops78. Python For Loops79. Python Functions80. Python Function Arguments81. Python *args and **kwargs82. Python Scope83. Python Decorators84. Python Lambda85. Python Recursion86. Python Generators87. Python range88. Python Arrays89. Python Iterators90. Python Modules91. Python Datetime92. Python Math93. Python JSON94. Python RegEx95. Python PIP96. Python Try Except97. Python String Formatting98. Python None99. Python User Input100. Python Virtual Environment

On this page

GeneratorsThe yield KeywordGenerators Saves MemoryUsing next() with GeneratorsGenerator ExpressionsFibonacci Sequence GeneratorGenerator Methodssend() Methodclose() Method