2.2. More Classes and Methods¶
The classes and methods introduced here are all used in the revised mad lib program developed in the next section.
2.2.1. Appending to a List¶
Before making a version of the madlib program that is much easier to use with new stories, we need a couple of facts about other types of objects that are built into Python.
So far we have used lists, but we have not changed the contents of
lists. The most obvious way to change a list is to add a new
element onto the end. Lists have the method append
. It
modifies the original list. Another word for modifiable is
mutable. Lists are mutable. Most of the types of object
considered so far (int, str, float) are immutable or not
mutable. Read and see how the list
named words
changes:
>>> words = list()
>>> words
[]
>>> words.append('animal')
>>> words
['animal']
>>> words.append('food')
>>> words
['animal', 'food']
>>> words.append('city')
>>> words
['animal', 'food', 'city']
This is particularly useful in a loop, where we can accumulate a new list. Read the start of this simple example:
def multiplyAll(numList, multiplier):
'''Return a new list containing all of the elements of numList,
each multiplied by multiplier. For example:
>>> print(multiplyAll([3, 1, 7], 5))
[15, 5, 35]
'''
# more to come
Clearly this will be repetitious. We will process each element of the list numList. A for-each loop with numList is appropriate. Also we need to create more and more elements of the new list. The accumulation pattern will work here, with a couple of wrinkles.
Test yourself: If we are going to accumulate a list. How do we initialize the list?
In earlier versions of the accumulation loop, we needed an
assignment statement to change the object doing the accumulating,
but now the method append
modifies its list automatically, so
we do not need an assignment statement. Read and try the example
program multiply1.py
:
def multiplyAll(numList, multiplier): #1
'''Return a new list containing all
of the elements of numList, each
multiplied by multiplier. For example:
>>> print(multiplyAll([3, 1, 7], 5))
[15, 5, 35]
'''
newList = list() #2
for num in numList: #3
newList.append(num*multiplier) #4
return newList #5
print(multiplyAll([3, 1, 7], 5)) #6
Make sure the result makes sense to you or follow the details of playing computer below.
Line | numList | multiplier | newList | num | comment |
---|---|---|---|---|---|
1-5 | - | - | - | - | definition |
6 | - | - | - | - | call function |
1 | [3, 1, 7] | 5 | - | - | set formal parameters |
2 | [3, 1, 7] | 5 | [] | ||
3 | [3, 1, 7] | 5 | [] | 3 | first in list |
4 | [3, 1, 7] | 5 | [15] | 3 | append 3*5 = 15 |
3 | [3, 1, 7] | 5 | [15] | 1 | next in list |
4 | [3, 1, 7] | 5 | [15, 5] | 1 | append 1*5 = 5 |
3 | [3, 1, 7] | 5 | [15, 5] | 7 | last in list |
4 | [3, 1, 7] | 5 | [15, 5, 35] | 7 | append 7*5 = 35 |
3 | [3, 1, 7] | 5 | [15, 5, 35] | 7 | done with list and loop |
5 | [3, 1, 7] | 5 | [15, 5, 35] | 7 | return [15, 5, 35] |
6 | - | - | - | - | print [15, 3, 35] |
Using a for-loop and append
is a powerful and flexible way to
derive a new list, but not the only way.
2.2.2. Sets¶
A list may contain duplicates, as in [2, 1, 3, 2, 5, 5, 2]
.
This is sometimes useful, and sometimes not. You may have learned
in math class that a set is a collection that does not allow
repetitions (a set automatically removes repetitions suggested).
Python has a type set
. Like many type names, it can be used to
convert other types. In this case it makes sense to convert any
collection, and the process removes duplicates. Read and see what
happens:
>>> strList = ['z', 'zz', 'c', 'z', 'bb', 'z', 'a', 'c']
>>> aSet = set(strList)
>>> aSet
{'bb', 'zz', 'a', 'c', 'z'}
(Technically, a set is unordered, so your version of Idle may list the set
in a different order.)
Set literals are enclosed in braces. Like other collections, a set
can be used as a sequence in a for
loop. Read, and check it
makes sense:
>>> for s in aSet:
print(s)
bb
zz
a
c
z
Predict the result of the following, and then paste it into the Shell and test. (You may not guess Python’s order, but see if you can get the right length and the right elements in some order.)
set(['animal', 'food', 'animal', 'food', 'food', 'city'])
2.2.3. Constructors¶
We have now seen several examples of the name of a type being used as a function. Read these earlier examples:
x = int('123')
s = str(123)
nums = list()
aSet = set(numberList)
In all such cases a new object of the specified type is constructed and returned. Such functions are called constructors.