Generator Expressions

Basic Generator Expression

  1. # generator expression (lazy)
  2. gen = (x**2 for x in range(5))
  3. #ans: <generator object>
  4. list(gen)
  5. #ans: [0, 1, 4, 9, 16]

Generator vs List

  1. # list - all in memory
  2. lst = [x**2 for x in range(1000)]
  3. #ans: generator - on demand
  4. gen = (x**2 for x in range(1000))

Iterating Generator

  1. # iterate once
  2. gen = (x for x in range(3))
  3. for val in gen:
  4. print(val)
  5. #ans: 0, 1, 2
  6. #ans: exhausted after iteration
  7. for val in gen:
  8. print(val)
  9. #ans: (nothing)

Generator in Functions

  1. # use in sum
  2. sum(x**2 for x in range(10))
  3. #ans: 285
  4. #ans: use in max
  5. max(x for x in range(10) if x % 2 == 0)
  6. #ans: 8

Generator with Condition

  1. # filter with generator
  2. gen = (x for x in range(10) if x % 2 == 0)
  3. list(gen)
  4. #ans: [0, 2, 4, 6, 8]

Exercises - Part 1

  1. # generator type?
  2. gen = (x for x in range(3))
  3. type(gen)
  4. #ans: <class 'generator'>

Exercises - Part 2

  1. # can iterate twice?
  2. gen = (x for x in range(3))
  3. list(gen)
  4. #ans: [0, 1, 2]
  5. list(gen)
  6. #ans: [] (exhausted)

Exercises - Part 3

  1. # memory efficiency?
  2. import sys
  3. lst = [x for x in range(1000)]
  4. gen = (x for x in range(1000))
  5. sys.getsizeof(lst)
  6. #ans: ~9000 bytes
  7. sys.getsizeof(gen)
  8. #ans: ~200 bytes

Exercises - Part 4

  1. # next() on generator?
  2. gen = (x for x in range(3))
  3. next(gen)
  4. #ans: 0
  5. next(gen)
  6. #ans: 1

Exercises - Part 5

  1. # generator with if-else?
  2. gen = (x if x > 0 else 0 for x in [-1, 1, 2])
  3. list(gen)
  4. #ans: [0, 1, 2]

Exercises - Part 6

  1. # chaining generators?
  2. gen1 = (x for x in range(5))
  3. gen2 = (x*2 for x in gen1)
  4. list(gen2)
  5. #ans: [0, 2, 4, 6, 8]

Exercises - Part 7

  1. # generator in sum?
  2. sum(x for x in range(101))
  3. #ans: 5050

Exercises - Part 8

  1. # empty generator?
  2. gen = (x for x in [])
  3. list(gen)
  4. #ans: []

Exercises - Part 9

  1. # generator vs range?
  2. #ans: both are lazy
  3. range(10) # range object
  4. (x for x in range(10)) # generator

Exercises - Part 10

  1. # convert to list?
  2. gen = (x**2 for x in range(3))
  3. lst = list(gen)
  4. #ans: [0, 1, 4]
  5. #ans: gen is now exhausted

Google tag (gtag.js)