More on list comprehension and generators Intermediate Python Tutorial part 5

Welcome to part 5 of the intermediate Python programming tutorial series. In this part, we're going to talk more about list comprehension and generators.

Let's show a more realistic use case for generators and list comprehension:

Generator expression with a function:

input_list = [5,6,2,1,6,7,10,12]

def div_by_five(num):
    if num % 5 == 0:
        return True
        return False

xyz = (i for i in input_list if div_by_five(i))

What we're doing is going through input_list, and seeing if the number is divisble by five. If it is, then we're putting it in a new list. With the generator, we didn't copy input_list, we went through it one step at a time, and then only populated the new list if the number was indeed divisible by five. Let's do this with list comprehension:

xyz = [i for i in input_list if div_by_five(i)]

Before we leave this basic example, let's express a few more examples. For now, I will just do it with list comprehension, but you could use this logic with either.

You don't have to have an if statement or a function to be at the end, you could do:

[print(i) for i in range(5)]

You could have any function in place of the print(i).

You can also embed:

[[print(i,ii) for ii in range(3)] for i in range(5)]

These are a bit more difficult to write out on your first attempts. You can build these by writing out the for loops regularly:

for i in range(5):
    for ii in range(3):

Then, start from the end:

    for ii in range(3):

Do a list comprehension just for that:

[print(i,ii) for ii in range(3)]

Then do the next part (for i in range(5)), so it'd be something like:

[...  for i in range(5)]]

What goes in the ...? the first one!

[[print(i,ii) for ii in range(3)] for i in range(5)]

You can just keep on embedding these things, and get pretty crazy. If you do find yourself embedding a bunch of these, you're *probably* doing something wrong, and probably should instead be doing a zip, enumerate, or something else, which we'll talk about soon.

We also have a fair amount more to cover with generators, but we'll have to come back to them.

For now, we're going to talk about the timeit module in the next tutorial, which can help us to actually weigh the values of speed vs processing, as well as understand the main differences between a generator and list comprehension.

The next tutorial:

  • Intermediate Python Programming introduction
  • String Concatenation and Formatting Intermediate Python Tutorial part 2
  • Argparse for CLI Intermediate Python Tutorial part 3
  • List comprehension and generator expressions Intermediate Python Tutorial part 4
  • More on list comprehension and generators Intermediate Python Tutorial part 5
  • Timeit Module Intermediate Python Tutorial part 6
  • Enumerate Intermediate Python Tutorial part 7
  • Python's Zip function
  • More on Generators with Python
  • Multiprocessing with Python intro
  • Getting Values from Multiprocessing Processes
  • Multiprocessing Spider Example
  • Introduction to Object Oriented Programming
  • Creating Environment for our Object with PyGame
  • Many Blobs - Object Oriented Programming
  • Blob Class and Modularity - Object Oriented Programming
  • Inheritance - Object Oriented Programming
  • Decorators in Python Tutorial
  • Operator Overloading Python Tutorial
  • Detecting Collisions in our Game Python Tutorial
  • Special Methods, OOP, and Iteration Python Tutorial
  • Logging Python Tutorial
  • Headless Error Handling Python Tutorial
  • __str__ and __repr_ in Python 3
  • Args and Kwargs
  • Asyncio Basics - Asynchronous programming with coroutines