20
Introduction to Computing Using Py Dictionary container class + modules Container Class dict Modules, revisited

Introduction to Computing Using Python Dictionary container class + modules Container Class dict Modules, revisited

Embed Size (px)

Citation preview

Page 1: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Dictionary container class + modules

Container Class dict Modules, revisited

Page 2: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

User-defined indexes and dictionaries

>>> employee[987654321]['Yu', 'Tsun']>>> employee[864209753]['Anna', 'Karenina']>>> employee[100010010]['Hans', 'Castorp']

Goal: a container of employee records indexed by employee SS#

Problems:• the range of SS#s is huge• SS#s are not really integers

Solution: the dictionary class dict

>>> employee = {'864-20-9753': ['Anna',

'Karenina'],'987-65-4321': ['Yu', 'Tsun'],'100-01-0010': ['Hans', 'Castorp']}

>>>

A dictionary contains(key, value) pairs

>>> employee = {'864-20-9753': ['Anna',

'Karenina'],'987-65-4321': ['Yu', 'Tsun'],'100-01-0010': ['Hans', 'Castorp']}

>>> employee['987-65-4321']['Yu', 'Tsun']>>> employee['864-20-9753']['Anna', 'Karenina']

key value'864-20-9753' ['Anna', 'Karenina']

'987-65-4321' ['Yu', 'Tsun']

'100-01-0010' ['Hans', 'Castorp']

A key can be used as an index to access the corresponding value

Page 3: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Properties of dictionaries>>> employee = {

'864-20-9753': ['Anna', 'Karenina'],

'987-65-4321': ['Yu', 'Tsun'],'100-01-0010': ['Hans', 'Castorp']}

>>> employee{'100-01-0010': ['Hans', 'Castorp'], '864-20-9753': ['Anna', 'Karenina'], '987-65-4321': ['Yu', 'Tsun']}>>>

Dictionaries are not ordered

Dictionaries are mutable

>>> employee = {'864-20-9753': ['Anna',

'Karenina'],'987-65-4321': ['Yu', 'Tsun'],'100-01-0010': ['Hans', 'Castorp']}

>>> employee{'100-01-0010': ['Hans', 'Castorp'], '864-20-9753': ['Anna', 'Karenina'], '987-65-4321': ['Yu', 'Tsun']}>>> employee['123-45-6789'] = 'Holden Cafield'>>> employee{'100-01-0010': ['Hans', 'Castorp'], '864-20-9753': ['Anna', 'Karenina'], '987-65-4321': ['Yu', 'Tsun'], '123-45-6789': 'Holden Cafield'}>>>

>>> employee = {'864-20-9753': ['Anna',

'Karenina'],'987-65-4321': ['Yu', 'Tsun'],'100-01-0010': ['Hans', 'Castorp']}

>>> employee{'100-01-0010': ['Hans', 'Castorp'], '864-20-9753': ['Anna', 'Karenina'], '987-65-4321': ['Yu', 'Tsun']}>>> employee['123-45-6789'] = 'Holden Cafield'>>> employee{'100-01-0010': ['Hans', 'Castorp'], '864-20-9753': ['Anna', 'Karenina'], '987-65-4321': ['Yu', 'Tsun'], '123-45-6789': 'Holden Cafield'}>>> employee['123-45-6789'] = 'Holden Caulfield'>>> employee{'100-01-0010': ['Hans', 'Castorp'], '864-20-9753': ['Anna', 'Karenina'], '987-65-4321': ['Yu', 'Tsun'], '123-45-6789': 'Holden Caulfield’}

Dictionaries are mutable

• new (key,value) pairs can be added

Dictionaries are mutable

• new (key,value) pairs can be added

• the value corresponding to a key can be modified

The empty dictionary is {}

Dictionary keys must be immutable

>>> employee = {[1,2]:1, [2,3]:3}Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> employee = {[1,2]:1, [2,3]:3}TypeError: unhashable type: 'list'

Page 4: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Dictionary operators

>>> days = {'Mo':1, 'Tu':2, 'W':3}>>> days['Mo']1>>> days['Th'] = 5>>> days{'Mo': 1, 'Tu': 2, 'Th': 5, 'W': 3}>>> days['Th'] = 4>>> days{'Mo': 1, 'Tu': 2, 'Th': 4, 'W': 3}>>> 'Fr' in daysFalse>>> len(days)4

Class dict supports some of the same operators as class list

Class dict does not support all the operators that class list supports• + and * for example

Page 5: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Dictionary methods>>> days{'Mo': 1, 'Tu': 2, 'Th': 4, 'W': 3}>>> days.pop('Tu')2>>> days{'Mo': 1, 'Th': 4, 'W': 3}>>> days2 = {'Tu':2, 'Fr':5}>>> days.update(days2)>>> days{'Fr': 5, 'W': 3, 'Th': 4, 'Mo': 1, 'Tu': 2}>>> days.items()dict_items([('Fr', 5), ('W', 3), ('Th', 4), ('Mo', 1), ('Tu', 2)])>>> days.keys()dict_keys(['Fr', 'W', 'Th', 'Mo', 'Tu'])>>> >>> vals = days.values()>>> valsdict_values([5, 3, 4, 1, 2])>>>

Operation Explanation

d.items() Returns a view of the (key, value) pairs in d

d.keys() Returns a view of the keys of d

d.pop(key) Removes the (key, value) pair with key key from d and returns the value

d.update(d2) Adds the (key, value) pairs of dictionary d2 to d

d.values() Returns a view of the values of d

The containers returned by d.items(), d.keys(), and d.values() (called views) can be iterated over

>>> days{'Mo': 1, 'Tu': 2, 'Th': 4, 'W': 3}>>> days.pop('Tu')2>>> days{'Mo': 1, 'Th': 4, 'W': 3}>>> days2 = {'Tu':2, 'Fr':5}>>> days.update(days2)>>> days{'Fr': 5, 'W': 3, 'Th': 4, 'Mo': 1, 'Tu': 2}>>> days.items()dict_items([('Fr', 5), ('W', 3), ('Th', 4), ('Mo', 1), ('Tu', 2)])>>> days.keys()dict_keys(['Fr', 'W', 'Th', 'Mo', 'Tu'])>>> >>> vals = days.values()>>> valsdict_values([5, 3, 4, 1, 2])>>> for val in vals:

print(val, end=' ')

5 3 4 1 2 >>>

Page 6: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Dictionary vs. multi-way if statement

Uses of a dictionary:• container with custom indexes

def complete(abbreviation): 'returns day of the week corresponding to abbreviation'

if abbreviation == 'Mo': return 'Monday' elif abbreviation == 'Tu': return 'Tuesday' elif ...... else: # abbreviation must be Su return 'Sunday'

def complete(abbreviation): 'returns day of the week corresponding to abbreviation'

days = {'Mo': 'Monday', 'Tu':'Tuesday', 'We': 'Wednesday', 'Th': 'Thursday', 'Fr': 'Friday', 'Sa': 'Saturday', 'Su':'Sunday'}

return days[abbreviation]

Uses of a dictionary:• container with custom indexes• alternative to the multi-way if statement

Page 7: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Dictionary as a container of counters

>>> grades = [95, 96, 100, 85, 95, 90, 95, 100, 100]>>> frequency(grades){96: 1, 90: 1, 100: 3, 85: 1, 95: 3}>>>

Problem: computing the number of occurrences of items in a list

Solution: Iterate through the list and, for each grade, increment the counter corresponding to the grade.

Problems:• impossible to create counters before seeing what’s in the list• how to store grade counters so a counter is accessible using the

corresponding grade

Solution: a dictionary mapping a grade (the key) to its counter (the value)

Uses of a dictionary:• container with custom indexes• alternative to the multi-way if statement• container of counters

Page 8: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Dictionary as a container of counters

>>> grades = [95, 96, 100, 85, 95, 90, 95, 100, 100]

Problem: computing the number of occurrences of items in a list

95

1

def frequency(itemList): 'returns frequency of items in itemList'

counters = {}

⌃ ⌃ ⌃ ⌃ ⌃ ⌃ ⌃

counters96

1

100

1

85

1

90

1

def frequency(itemList): 'returns frequency of items in itemList'

counters = {} for item in itemList: if item in counters: # increment item counter counters[item] += 1 else: # create item counter counters[item] = 1 return counters

95

2

95

3

Page 9: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Exercise

def numChars(filename): 'returns the number of characters in file filename'

infile = open(filename, 'r') content = infile.read() infile.close()

return len(content)

Implement function wordcount() that takes as input a text—as a string— and prints the frequency of each word in the text; assume there is no punctuation in the text.

def wordCount(text): 'prints frequency of each word in text'

wordList = text.split() # split text into list of words

counters ={} # dictionary of counters for word in wordList: if word in counters: # counter for word exists counters[word] += 1 else: # counter for word doesn't exist counters[word] = 1

for word in counters: # print word counts if counters[word] == 1: print('{:8} appears {} time.'.format(word, counters[word])) else: print('{:8} appears {} times.'.format(word, counters[word]))

>>> text = 'all animals are equal but some animals are more equal than other'>>> wordCount(text)all appears 1 time.animals appears 2 times.some appears 1 time.equal appears 2 times.but appears 1 time.other appears 1 time.are appears 2 times.than appears 1 time.more appears 1 time.>>>

Page 10: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Built-in class tuple

>>> lst = ['one', 'two', 3]>>> lst[2]3>>> lst[2] = 'three'>>> lst['one', 'two', 'three']>>> tpl = ('one', 'two', 3)>>> tpl('one', 'two', 3)>>> tpl[2]3>>> tpl[2] = 'three'Traceback (most recent call last): File "<pyshell#131>", line 1, in <module> tpl[2] = 'three'TypeError: 'tuple' object does not support item assignment>>>

The class tuple is the same as class list … except that it is immutable

Why do we need it? Why do we need it? Sometimes, we need to have an “immutable list”.• For example, when we need a dictionary that has lists as keys

Page 11: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Exercise

Implement function lookup() that implements a phone book lookup application. Your function takes, as input, a dictionary representing a phone book,mappingtuples (containing the first and last name) to strings(containing phone numbers)

def lookup(phonebook): '''implements interactive phone book service using the input phonebook dictionary''' while True: first = input('Enter the first name: ') last = input('Enter the last name: ')

person = (first, last) # construct the key

if person in phonebook: # if key is in dictionary print(phonebook[person]) # print value else: # if key not in dictionary print('The name you entered is not known.')

>>> phonebook = {('Anna','Karenina'):'(123)456-78-90',('Yu', 'Tsun'):'(901)234-56-78',('Hans', 'Castorp'):'(321)908-76-54'}

>>> lookup(phonebook)Enter the first name: AnnaEnter the last name: Karenina(123)456-78-90Enter the first name:

Page 12: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

>>> import math>>>>>> import math>>> dir(math)['__doc__', '__file__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc’]>>>

>>> import math>>> dir(math)['__doc__', '__file__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc’]>>> math.sqrt<built-in function sqrt>>>> math.pi3.141592653589793

Introduction to Computing Using Python

Modules, revisited

When the module is executed (imported), then the module is (also) a namespace.

A module is a file containing Python code.

When the module is executed (imported), then the module is (also) a namespace.

• This namespace has a name, typically the name of the module.

When the module is executed (imported), then the module is (also) a namespace.

• This namespace has a name, typically the name of the module.• In this namespace live the names that are defined in the global scope of the

module: the names of functions, values, and classes defined in the module. • These names are the module’s attributes.

When the module is executed (imported), then the module is (also) a namespace.

• This namespace has a name, typically the name of the module.• In this namespace live the names that are defined in the global scope of the

module: the names of functions, values, and classes defined in the module.

Built-in function dir() returns the names defined in a namespace

To access the imported module’s attributes, the name of the namespace must be specified

Page 13: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Importing a module

When the Python interpreter executes an import statement, it:1. Looks for the file corresponding to the module to be imported.2. Runs the module’s code to create the objects defined in the module.3. Creates a namespace where the names of these objects will live.

An import statement only lists a name, the name of the module• without any directory information or .py suffix.

Python uses the Python search path to locate the module.• The search path is a list of directories where Python looks for modules.• The variable name path defined in the Standard Library module sys refers

to this list.

When the Python interpreter executes an import statement, it:1. Looks for the file corresponding to the module to be imported.

>>> import sys>>> sys.path['/Users/me', '/Library/Frameworks/Python.framework/Versions/3.2/lib/python32.zip', . . .'/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages']>>>

current working directory Standard Library folders

Page 14: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

>>> ================ RESTART ================>>> dir()['__builtins__', '__doc__', '__name__', '__package__']>>> import exampleTraceback (most recent call last): File "<pyshell#79>", line 1, in <module> import exampleImportError: No module named example>>>

>>> ================ RESTART ================>>> dir()['__builtins__', '__doc__', '__name__', '__package__']>>>

Introduction to Computing Using Python

The Python search path

Suppose we want to import module example stored in folder /Users/me that is not in list sys.path

>>> ================ RESTART ================>>>>>> ================ RESTART ================>>> dir()['__builtins__', '__doc__', '__name__', '__package__']>>> import exampleTraceback (most recent call last): File "<pyshell#79>", line 1, in <module> import exampleImportError: No module named example>>> import sys>>> sys.path.append('/Users/me')>>> import example>>> example.f<function f at 0x10278dc88>>>> example.x0>>>

>>> ================ RESTART ================>>> dir()['__builtins__', '__doc__', '__name__', '__package__']>>> import exampleTraceback (most recent call last): File "<pyshell#79>", line 1, in <module> import exampleImportError: No module named example>>> import sys>>> sys.path.append('/Users/me')>>> import example>>> example.f<function f at 0x10278dc88>>>> example.x0>>> dir()['__builtins__', '__doc__', '__name__', '__package__', 'example', 'sys’]

By just adding folder /Users/me to the search path, module example can be imported

When called without an argument, function dir() returns the names in the top-level module

• the shell, in this case.

'an example module'def f(): 'function f' print('Executing f()')

def g(): 'function g' print('Executing g()') x = 0 # global var

names in the shell namespace; note that example is not inno folder in the Python search path contains module example

Page 15: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Three ways to import module attributes

'an example module'def f(): 'function f' print('Executing f()')

def g(): 'function g' print('Executing g()') x = 0 # global var

example.py

namespace __main__

>>>

f

module example

example

f() 0

g x

g()

1. Import the (name of the) module

>>> import example>>>>>> import example>>> example.x0>>> example.f<function f at 0x10278dd98>>>> example.f()Executing f()>>>

Page 16: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Three ways to import module attributes

'an example module'def f(): 'function f' print('Executing f()')

def g(): 'function g' print('Executing g()') x = 0 # global var

example.py

namespace __main__

>>>

f

module example

f

f() 0

g x

g()

2. Import specific module attributes

>>> from example import f>>> >>> from example import f>>> f()Executing f()>>> xTraceback (most recent call last): File "<pyshell#28>", line 1, in <module> xNameError: name 'x' is not defined>>>

Page 17: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

Three ways to import module attributes

'an example module'def f(): 'function f' print('Executing f()')

def g(): 'function g' print('Executing g()') x = 0 # global var

example.py

namespace __main__

>>>

3. Import all module attributes

>>> from example import *>>> >>> from example import *>>> f()Executing f()>>> g()Executing g()>>> x0>>>

f

module example

f

f() 0

g x

g()

g x

Page 18: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Introduction to Computing Using Python

A class is a namespace

>>> list.pop<method 'pop' of 'list' objects>>>> list.sort<method 'sort' of 'list' objects>>>>

__add__

namespace list

__add__() sort()

count x

count()

pop

pop()

A class is really a namespace

• The name of this namespace is the name of the class

• The names defined in this namespace are the class attributes (e.g., class methods)

. . .

A class is really a namespace

• The name of this namespace is the name of the class

• The names defined in this namespace are the class attributes (e.g., class methods)

• The class attributes can be accessed using the standard namespace notation Function dir() can be used to list

the class attributes

>>> list.pop<method 'pop' of 'list' objects>>>> list.sort<method 'sort' of 'list' objects>>>> dir(list)['__add__', '__class__', ...'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

Page 19: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

A class method is really a function defined in the class namespace; when Python executes

it first translates it to

and actually executes this last statement

Introduction to Computing Using Python

Class methods >>> lst = [9, 1, 8, 2, 7, 3]>>> lst[9, 1, 8, 2, 7, 3]>>> lst.sort()>>> lst[1, 2, 3, 7, 8, 9]>>>

__add__

namespace list

__add__() sort()

count x

count()

pop

pop()

. . .

>>> lst = [9, 1, 8, 2, 7, 3]>>> lst[9, 1, 8, 2, 7, 3]>>> lst.sort()>>> lst[1, 2, 3, 7, 8, 9]>>> lst = [9, 1, 8, 2, 7, 3]>>> lst[9, 1, 8, 2, 7, 3]>>> list.sort(lst)>>> lst[1, 2, 3, 7, 8, 9]>>>

>>> lst = [9, 1, 8, 2, 7, 3]>>> lst[9, 1, 8, 2, 7, 3]>>> lst.sort()>>> lst[1, 2, 3, 7, 8, 9]>>> lst = [9, 1, 8, 2, 7, 3]>>> lst[9, 1, 8, 2, 7, 3]>>> list.sort(lst)>>> lst[1, 2, 3, 7, 8, 9]>>> lst.append(6)>>> lst[1, 2, 3, 7, 8, 9, 6]>>>

>>> lst = [9, 1, 8, 2, 7, 3]>>> lst[9, 1, 8, 2, 7, 3]>>> lst.sort()>>> lst[1, 2, 3, 7, 8, 9]>>> lst = [9, 1, 8, 2, 7, 3]>>> lst[9, 1, 8, 2, 7, 3]>>> list.sort(lst)>>> lst[1, 2, 3, 7, 8, 9]>>> lst.append(6)>>> lst[1, 2, 3, 7, 8, 9, 6]>>> list.append(lst, 5)>>> lst[1, 2, 3, 7, 8, 9, 6, 5]

lst.sort()

list.sort(lst)

lst.append(6)instance.method(arg1, arg2, …)

list.append(lst, 6)class.method(instance, arg1, arg2, …)

The function hasan extra argument,which is the objectinvoking the method

Page 20: Introduction to Computing Using Python Dictionary container class + modules  Container Class dict  Modules, revisited

Rewrite the below Python statement so that instead of making the usual method invocations

you use the notation

Introduction to Computing Using Python

Exercise

>>> s = 'hello'>>> s = 'ACM'>>> s.lower()'acm'>>> s.find('C')1>>> s.replace('AC', 'IB')'IBM'

lst.sort()

list.sort(lst)

lst.append(6)instance.method(arg1, arg2, …)

list.append(lst, 6)class.method(instance, arg1, arg2, …)

>>> s = 'ACM'>>> str.lower(s)'acm'>>> str.find(s, 'C')1>>> str.replace(s, 'AC', 'IB')'IBM'>>>