 I want to talk about iter tools too. Or let me print it out. There we go. All right. Now I know my screen's not 80 characters wide. Cool. I talked about iter tools last month, and now I want to talk on to the second part. So let's start by importing iter tools. The first function I want to talk about is combinatoric functions. There's a whole slew of them. All your basic discrete math combinatoric functions, like, for example, product. So let's say you have a list of two items. So again, iter tools always spits out generators. So I always throw out a list to show what it does, or else it doesn't make it. You just get a generator object, which is not very impressive. So product, what it'll take is, given two sequences, so this is in this case a list of two items, and then a string of two characters, will return a sequence of them productized against one another. This is basically like a for loop inside a for loop. It's not brain surgery, but these are all sort of weird functions that aren't always trivial to implement. That's product. That's the most simplest one. You can also do permutations, right? So what you do is you give a list of things. That list go? No, that list got cut off. Sorry. If I make this full size, there we go. Give a list of things, and how many items you want in your permutations. And I'll give you all the permutations of two items of this list, as I gave it. And then if I join it, boom. So what I did here is I just took every item, and I joined them together. And you get every item with every other element of the list. So for example, you would have qualified quasar and also quasar qualified, right? So it's not combinations, which is no surprise. The next function. So if you don't want those doubles coming up, again, same as permutations. And do the same function to join them together. This will do the same thing except remove all the doubles. So instead of qualified quasar and quasar qualified, you just get qualified quasar, in this case. But that with all the others. Again, these are conceptually very simple, but a bit hard to implement. And Python just does it for you with any sort of lists or objects or whatever. As generators, so they don't take up a ton of memory. And it's really handy in that corner case when you need it. You can also do it with replacements. And again, and this time, exactly like regular combinations except you get qualified, qualified twice, right? So this time you didn't replace. So it's like picking out of a bag without, and this time it's you pick out a bag when you put it back in and you get all possible permutations of that input. Basic math, basic discrete math. Sorry, with the plus operator? What do you mean? All right, so what's actually happening here is you're getting a tuple out of this generator, right? So comms two is a tuple of qualified and qualified, qualified and quasar as strings. And I just joined them together to make them easier to print. So you're getting a tuple of things. So in this case, I just joined them with a space but you can do whatever you want. As you want it. To move on, you also have other functions that modify the sequences you have, right? So in this case, one of my favorite, group by. So let's say you have a sequence, all right? So just see a list of off the top of my head functions on the standard lib. Split. That's, if you use Vim, you get really handy. And let's say I want to group them by, I don't know. Okay, let me see. I want to group them by, let's take my packages and let's give a function to group by, right? So this is like the key function in, oh, I got 38 seconds. This is like the key function in sorts. Let's say I want to group them by the first name. And what this will do is create an iterator where it'll give me a key and the group. So all the items grouped together in an other generator. And what I can do is then print out key key, join the groups by a string and it'll group them by that key. So that key in my case is just the first element of the name. And you can do whatever, any function can be put in there. So any ways you want to group your functions, you can do it. Okay, I got 10 seconds. I can do this if I type really fast. Let's take another sequence, the T. What T does is if you spit out from the first one, it stores them in memory for the second one. So you can use the second sequence which starts at the same part as the first one. So basically like the Unix T splits into two parts and splits their sequence into two parts. So if you have a very long, complicated series of generator functions that are tied together, you can use T to create two of them and use them in two parts. Thank you. Thank you.