- Okay, so we've taken a look at loops and now we're going to just take a little bit of a look at some of the operations that you can do with loops. - Um, Python has this, as we'll soon learn, object orient approach to its operators. And, the plus can add strings and it can add numbers, it can add floating-point numbers, integer numbers, strings, etc. And, so the plus similarly works this way with lists. The plus looks to its left and looks to its right and says, what am I adding? And in the case that I'm adding the list one, two, three and the list four, five, six. It concatenates them together and in this way it sort of functions like a string. And so, we get one, two, three, four, five, six. It just concatenates lists, this list to another list. And, it doesn't change a or b, just like in any kind of assignment statement Its calculations on the right side don't change the variables and then produce a new variable and then assign that into c. You can also use list slicing. It's easy to remember, if you remember how strings work, lists work exactly the same way. So, of course, it's a little tricky, the first number's the starting position. They start at zero. So, one is right there, so it's the zero position, one position, start at one, right, but go up to but not including three. There's one, two, three. So, this goes up to but not including three. And, that's why we get forty-one, twelve out of that. So, up to but not including, I'll just say that over and over and over again. If we do, you can leave the first part out, you can leave the first part out here and you can say up to but not including four. So, that starts at the beginning goes up to but not including four, and so that's how we get that piece right there. We can say, um, start at the position three, zero, one, two, three. Start at position three and go to the end. Now, the fact the number three is in here, is sort of irrelevant. Um, three to the end is those three numbers. And, then you can do the whole list with slicing as well. Again, these are pretty much the exact same examples I used when I was doing strings, they're pretty much the same. There's a number of different methods and you can look up all the documentation in the list. I often just use the dir command to remind myself of them, append we'll look at, count looks for certain values in the list, extend adds things to the end of the list, index looks things up in the list, insert allows them, the list to sort of be expanded in the middle, pop pulls things off the top, remove removes an item in the middle, reverse flips the order of them, and sort puts them sort of into order based on the values. So, let's look at a couple of these. Um, so if we build a list from scratch, we have a way to ask for an empty list. There are a couple of different ways to ask for an empty list. We could use just two square brackets next to each other. But, this is a form we call a constructor form where we say, hey Python, make a list. And, in this case the word list is like a reserved word to Python, it's really reserve class, but, um. Say list, list parenthesis says makes me an empty list and then, assign that list into stuff. So, stuff is now a list object, it's a type list but it has nothing in it. And, then we can call the append methods, stuff out of append and stick book in. And then, we say oh, and that knows how long, and the stuff knows how long it is, where the end is and how to add something to it, then add a ninety-nine to it and we print it out. And, we got book and ninety-nine, reminding ourselves that lists, while they're often the same types of variables, same types of values, in the various positions in the list, it doesn't always have to be that way. Then we say, oh, we'll stuff append cookie, you can keep on going and then we end up with three things and the cookie. We have an in operator, it works pretty much like the in operator in a string. Uh, is nine in my list? And, that's pretty simple and the answer of course is yes, nine is in my list. Is fifteen in my list? Looking through, no it's not, fifteen is not in my list. And then, there's the not in operator, you can think of that as kind of like one operator. Is twenty not in the list? And the answer, since it's not there, is true. And, so that's a way to just, you know, it's kind of like starts with or end for strings. Same kind of stuff. Lists are in order and they're sortable, and so this is something we take good advantage of. A lot of what computers want to do is sort stuff, you know look all these things up, append them and then get them sorted. And so, there is this method inside of list that's just the sort method. So, here we you know put three values in zero, one, two positions. Zero, one, and two, Joseph, Glenn, and Sally. And, then we tell the list to sort itself and then we print it out. Now, this is actually sorting the list in place which is different like than upper and lower, because if you remember strings are not mutable, but lists are mutable and so you say, hey, just sort yourself. Okay, and so just sort yourself and then it sorts it. And then, it's in alphabetical order, Glenn, Joseph, and Sally. I happen to be clever, I only put strings in there and I put my uppercase and lowercase in a very consistent pattern. But, the list has changed, and if I look at list sub one that is the second item, which is Joseph, that prints out right down there. There's a whole bunch of built in functions to help manipulate lists, the other things I was showing was method sort is a method that's part of lists but there are other functions that take lists as their arguments. Um, we already talked about the len function, it tells you how many items there are. There is, pretty obvious, max, it says go through and find the largest. Min, go through and find the smallest. Sum, goes through adds them all up. And, we can say, let's do average by taking the sum of all of them and dividing it by the length. And you might think to yourself, oh wow, I wish we'd had known this a few chapters back when we were having to write all those loops to do max, min, sum, largest, smallest, etc. You can kind of think in your mind that inside each one of these functions is a loop that does, pretty much, what you did in those chapters. Part of the reason we did that back then, was even though these things were here, was they're kind of easy loops to understand. And so, those are there and basically there allows two different ways of building loops to do the maximum and minimum. Now, it's not necessarily all that much easier to do something using these because you either can do them the old way or you can make a list and use these functions. So, let's take a look, and I'll just say that these two bits of code are doing the exact same thing, and what they are is implementing a program, that's going to repeatedly ask for numbers until we type the word done, and then it's going to compute the average and tell us what they are. And, so using sort of the stuff from the loop chapter, we start with a total variable and a count variable, set them to zero and then we read a number, check for done to break out, but then we convert it to a floating-point value and then we say total equals total plus value and count equals count plus one. So, this is gonna run over and over and over again, how ever many times we're going to do this. And then, it's going to pop out and when it's done, it's going to have this value of total, the running total will become the overall total divided by count and then it'll print the average out, okay. So, that, that's kind of how we would have done this before we knew how to do this with lists. Now, let's take a look at the other one. And, the other one, we say lets make an empty list, remember this is that constructive syntax that says to Python, make me an empty list and assign the empty list. It has nothing in it. Right. But it is a list. Has nothing in it, into the variable numlist. Now, we're going to write another loop, we're going to, this part here is the same. These three lines. Read the number, if it's done, quit and convert to value. But instead of doing the actual calculation right now, all we're going to do is just append it to the list. So, the list will start out empty, then the three will be in the list, then the nine will be in the list, then the five will be in the list. So, we're appending each time through the loop we're appending into the list. So, we're just growing the list every time I read it value. Instead of actually computing something with the value that we've got, so in either case we get value and in one case we append it to the list. And then finally, it finishes, the break happens and then we just say, oh hey Python, sum up everything in the list, add these three numbers together, and then take the, divide it by the length of all those things and you'll have the average. And, so these two things give us exactly the same output. Now, there is one difference, if there was like one million or one billion numbers, they actually all have to be stored in the memory simultaneously. Where as here, it's actually doing the calculation of the billion numbers and not using up so much memory. For most of the things you're going to be doing, the difference in memory, there is a difference in memory, this uses, this one here uses more memory, but I can't draw very well. More memory, um, it uses more memory, but it doesn't really matter by the time it's all said and done. And so, for you, the difference between these things is not all that significant, but it's important to understand that they're just two techniques to accomplish the same thing with lists.