Chapter 6.ABSTRACTION. from 'Beginning Python From Novice to Professional' by Magnus Lie Hetland
fibs = [0, 1]
for i in range(8):
fibs.append(fibs[-2] + fibs[-1])
>>> fibs
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
__________________________
To print fibs for numbers set by user
fibs = [0, 1]
num = input('How many numbers do you want? ')
for i in range(num-2):
fibs.append(fibs[-2] + fibs[-1])
print fibs
______________________________________
Making your own function
def hello(name):
return 'Hello, '+ name +'!'
>>> print hello('John')
Hello, John!
_______________________________________
def fibs(num):
result = [0, 1]
for i in range(num-2):
result.append(result[-2] + result[-1])
return result
>>> fibs(8)
[0, 1, 1, 2, 3, 5, 8, 13]
_______________________________________
'Calculates the square of number x'
return x*x
>>> square(2)
4
>>> square.__doc__
'Calculates the square of number x'
>>> help(square)
Help on function square in module __main__:
square(x)
Calculates the square of number x
________________________________________
Parameters
>>> def change(n):
n[0]='Mr.Gumby'
>>> names = ['Mrs.Entity','Mr.Ben']
>>> change(names)
>>> names
['Mr.Gumby', 'Mr.Ben']
def square(x):
______________________________
OR
>>> names = ['Mrs.Entity','Mr.Ben']
>>> n = names
>>> n[0] = 'Mr.Gumby'
>>> names
['Mr.Gumby', 'Mr.Ben']
_______________________________
>>> names = ['Mrs.Entity','Mr.Ben']
>>> n = names[:]
>>> names
['Mrs.Entity', 'Mr.Ben']
>>> n
['Mrs.Entity', 'Mr.Ben']
>>>
>>> n is names
False
>>> n == names
True
_______________________________
>>> n[0] = 'Mr.Gumby'
>>> names
['Mrs.Entity', 'Mr.Ben']
>>> n
['Mr.Gumby', 'Mr.Ben']
_______________________________
USING A FUNCTION
a program that stores
names and that allows you to look up people by their first, middle, or last names.
storage = {}
storage['first'] = {}
storage['middle'] = {}
storage['last'] = {}
>>> me = 'Magnus Lie Hetland'
>>> storage['first']['Magnus'] = [me]
>>> storage['middle']['Lie'] = [me]
>>> storage['last']['Hetland'] = [me]
>>> storage['middle']['Lie']
['Magnus Lie Hetland']
def init(data):
data['first'] = {}
data['middle'] = {}
data['last'] = {}
>>> storage = {}
>>> init(storage)
>>> storage
{'middle': {}, 'last': {}, 'first': {}}
def lookup(data, label, name):
return data[label].get(name)
>>> lookup(storage, 'middle', 'Lie')
['Magnus Lie Hetland']
>>> my_sister = 'Anne Lie Hetland'
>>> storage['first'].setdefault('Anne', []).append(my_sister)
>>> storage['middle'].setdefault('Lie', []).append(my_sister)
>>> storage['last'].setdefault('Hetland', []).append(my_sister)
>>> storage['first']['Anne']
['Anne Lie Hetland']
>>> storage['middle']['Lie']
['Magnus Lie Hetland', 'Anne Lie Hetland']
>>> lookup(storage,'last','Hetland')
['Magnus Lie Hetland', 'Anne Lie Hetland']
___________________________________________________________
Immutable parameters. (f.e. integers). Solution
>>> def inc(x): return x+1
>>> foo = 1
>>> foo = inc(foo)
>>> foo
2
___________________________________________________________
If you really wanted to modify your parameter, you could use a trick such as wrapping your
value in a list, like this:
>>> def inc(x): x[0] = x[0] + 1
...
>>> foo = [10]
>>> inc(foo)
>>> foo
[11]
__________________________________________________________
Keyword Parameters and Defaults
positional parameters because their
positions are important—more important than their names, in fact
def hello(greeting,name):
return '%s, %s!' % ('Hello','world')
>>> hello ('greeting = hello','name = world')
'Hello, world!'
def hello(name,greeting):
return '%s, %s!' % ('Hello','world')
>>> hello ('greeting = hello','name = world')
'Hello, world!'
_________________________________________
It's possible to supply function with default values
def hello(greeting = 'Hello',name = 'world'):
return '%s, %s!' % (greeting,name)
>>> hello()
'Hello, world!'
>>> hello('Hi','Iurii')
'Hi, Iurii!'
>>> hello('Buenos Dias')
'Buenos Dias, world!'
>>> hello(name = 'Dude')
'Hello, Dude!'
__________________________________________
def hello_1(name,greeting = 'Hello',punctuation = '!'):
return '%s, %s%s' % (greeting,name,punctuation)
>>> hello_1('Bob')
'Hello, Bob!'
>>> hello_1('Bob','Hey')
'Hey, Bob!'
>>> hello_1('Bob','No','...')
'No, Bob...'
>>> hello_1('Bob',punctuation='.')
'Hello, Bob.'
>>> hello_1('Mohito',greeting = 'Idiot')
'Idiot, Mohito!'
>>>
____________________________________________
Collecting Parameters
def print_params (*params):
print params
>>> print_params('window')
('window',)
>>> print_params(1)
(1,)
>>> print_params(1,2,3)
(1, 2, 3)
_______________________________
def print_params (title,*params):
print title
print params
>>> print_params('Params:',1,2,3)
Params:
(1, 2, 3)
>>> print_params('Nothing:')
Nothing:
()
_______________________________
** - makes dictionary
def print_params(**params):
print params
>>> print_params(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
_______________________________
def print_params(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
print keypar
>>> print_params(1,2,3,4,5,6,foo=3,bar=5)
1 2 3
(4, 5, 6)
{'foo': 3, 'bar': 5}
>>> print_params(1,2,7,4,5,6,8,foo=3,bar=5)
1 2 7
(4, 5, 6, 8)
{'foo': 3, 'bar': 5}
_____________________________________
Reversing the process
def add(x,y):
return x+y
>>> params = (1,2)
>>> add(*params)
3
______________________________________
def hello(name = 'Hello',greeting = 'world'):
print '%s, %s!' % (greeting,name)
>>> arg = {'name':'Mr.Gumby','greeting':'Hello'}
>>> hello(**arg)
Hello, Mr.Gumby!
>>> hello(*arg)
greeting, name!
>>> arg = ('Grey','Bill')
>>> hello(*arg)
Bill, Grey!
________________________________________
In the next two functions result is the same, so stars are really useful only if you use them either when defining a function (to allow a varying
number of arguments) or when calling a function (to “splice in” a dictionary or a sequence
>>> def with_stars(**kwds):
print kwds['name'],'is',kwds['age'],'years old'
>>> args = {'name':'Gumby','age':42}
>>> with_stars(**args)
Gumby is 42 years old
_________________________________________
>>> def without_stars(kwds):
print kwds['name'],'is',kwds['age'],'years old'
>>> args = {'name':'Gumby','age':42}
>>> without_stars(args)
Gumby is 42 years old
____________________________________________
def story(**kwds):
return 'Once upon a time,' \
'a %(who)s was %(what)s' % kwds
>>> print story(who='king',what='killed')
Once upon a time,a king was killed
>>> params = {'job': 'language', 'name': 'Python'}
>>> print story(**params)
Once upon a time, there was a language called Python.
>>> del params['job']
>>> print story(job='stroke of genius', **params)
Once upon a time, there was a stroke of genius called Python.
____________________________________________
def power(x,y,*others):
if others:
print 'Received redundant params: ', others
return pow(x,y)
>>> power(2,3)
8
>>> power(2,5,'glory')
Received redundant params: ('glory',)
32
>>> power(x=4,y=5)
1024
>>> params = (5,)*2
>>> print params
(5, 5)
>>> power(*params)
3125
____________________________________________
for i in range(8):
fibs.append(fibs[-2] + fibs[-1])
>>> fibs
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
__________________________
To print fibs for numbers set by user
fibs = [0, 1]
num = input('How many numbers do you want? ')
for i in range(num-2):
fibs.append(fibs[-2] + fibs[-1])
print fibs
______________________________________
Making your own function
def hello(name):
return 'Hello, '+ name +'!'
>>> print hello('John')
Hello, John!
_______________________________________
def fibs(num):
result = [0, 1]
for i in range(num-2):
result.append(result[-2] + result[-1])
return result
>>> fibs(8)
[0, 1, 1, 2, 3, 5, 8, 13]
_______________________________________
'Calculates the square of number x'
return x*x
>>> square(2)
4
>>> square.__doc__
'Calculates the square of number x'
>>> help(square)
Help on function square in module __main__:
square(x)
Calculates the square of number x
________________________________________
Parameters
>>> def change(n):
n[0]='Mr.Gumby'
>>> names = ['Mrs.Entity','Mr.Ben']
>>> change(names)
>>> names
['Mr.Gumby', 'Mr.Ben']
def square(x):
______________________________
OR
>>> names = ['Mrs.Entity','Mr.Ben']
>>> n = names
>>> n[0] = 'Mr.Gumby'
>>> names
['Mr.Gumby', 'Mr.Ben']
_______________________________
>>> names = ['Mrs.Entity','Mr.Ben']
>>> n = names[:]
>>> names
['Mrs.Entity', 'Mr.Ben']
>>> n
['Mrs.Entity', 'Mr.Ben']
>>>
>>> n is names
False
>>> n == names
True
_______________________________
>>> n[0] = 'Mr.Gumby'
>>> names
['Mrs.Entity', 'Mr.Ben']
>>> n
['Mr.Gumby', 'Mr.Ben']
_______________________________
USING A FUNCTION
a program that stores
names and that allows you to look up people by their first, middle, or last names.
storage = {}
storage['first'] = {}
storage['middle'] = {}
storage['last'] = {}
>>> me = 'Magnus Lie Hetland'
>>> storage['first']['Magnus'] = [me]
>>> storage['middle']['Lie'] = [me]
>>> storage['last']['Hetland'] = [me]
>>> storage['middle']['Lie']
['Magnus Lie Hetland']
def init(data):
data['first'] = {}
data['middle'] = {}
data['last'] = {}
>>> storage = {}
>>> init(storage)
>>> storage
{'middle': {}, 'last': {}, 'first': {}}
def lookup(data, label, name):
return data[label].get(name)
>>> lookup(storage, 'middle', 'Lie')
['Magnus Lie Hetland']
>>> my_sister = 'Anne Lie Hetland'
>>> storage['first'].setdefault('Anne', []).append(my_sister)
>>> storage['middle'].setdefault('Lie', []).append(my_sister)
>>> storage['last'].setdefault('Hetland', []).append(my_sister)
>>> storage['first']['Anne']
['Anne Lie Hetland']
>>> storage['middle']['Lie']
['Magnus Lie Hetland', 'Anne Lie Hetland']
>>> lookup(storage,'last','Hetland')
['Magnus Lie Hetland', 'Anne Lie Hetland']
___________________________________________________________
Immutable parameters. (f.e. integers). Solution
>>> def inc(x): return x+1
>>> foo = 1
>>> foo = inc(foo)
>>> foo
2
___________________________________________________________
If you really wanted to modify your parameter, you could use a trick such as wrapping your
value in a list, like this:
>>> def inc(x): x[0] = x[0] + 1
...
>>> foo = [10]
>>> inc(foo)
>>> foo
[11]
__________________________________________________________
Keyword Parameters and Defaults
positional parameters because their
positions are important—more important than their names, in fact
def hello(greeting,name):
return '%s, %s!' % ('Hello','world')
>>> hello ('greeting = hello','name = world')
'Hello, world!'
def hello(name,greeting):
return '%s, %s!' % ('Hello','world')
>>> hello ('greeting = hello','name = world')
'Hello, world!'
_________________________________________
It's possible to supply function with default values
def hello(greeting = 'Hello',name = 'world'):
return '%s, %s!' % (greeting,name)
>>> hello()
'Hello, world!'
>>> hello('Hi','Iurii')
'Hi, Iurii!'
>>> hello('Buenos Dias')
'Buenos Dias, world!'
>>> hello(name = 'Dude')
'Hello, Dude!'
__________________________________________
def hello_1(name,greeting = 'Hello',punctuation = '!'):
return '%s, %s%s' % (greeting,name,punctuation)
>>> hello_1('Bob')
'Hello, Bob!'
>>> hello_1('Bob','Hey')
'Hey, Bob!'
>>> hello_1('Bob','No','...')
'No, Bob...'
>>> hello_1('Bob',punctuation='.')
'Hello, Bob.'
>>> hello_1('Mohito',greeting = 'Idiot')
'Idiot, Mohito!'
>>>
____________________________________________
Collecting Parameters
def print_params (*params):
print params
>>> print_params('window')
('window',)
>>> print_params(1)
(1,)
>>> print_params(1,2,3)
(1, 2, 3)
_______________________________
def print_params (title,*params):
print title
print params
>>> print_params('Params:',1,2,3)
Params:
(1, 2, 3)
>>> print_params('Nothing:')
Nothing:
()
_______________________________
** - makes dictionary
def print_params(**params):
print params
>>> print_params(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
_______________________________
def print_params(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
print keypar
>>> print_params(1,2,3,4,5,6,foo=3,bar=5)
1 2 3
(4, 5, 6)
{'foo': 3, 'bar': 5}
>>> print_params(1,2,7,4,5,6,8,foo=3,bar=5)
1 2 7
(4, 5, 6, 8)
{'foo': 3, 'bar': 5}
_____________________________________
Reversing the process
def add(x,y):
return x+y
>>> add(*params)
3
______________________________________
def hello(name = 'Hello',greeting = 'world'):
print '%s, %s!' % (greeting,name)
>>> arg = {'name':'Mr.Gumby','greeting':'Hello'}
>>> hello(**arg)
Hello, Mr.Gumby!
>>> hello(*arg)
greeting, name!
>>> arg = ('Grey','Bill')
>>> hello(*arg)
Bill, Grey!
________________________________________
In the next two functions result is the same, so stars are really useful only if you use them either when defining a function (to allow a varying
number of arguments) or when calling a function (to “splice in” a dictionary or a sequence
>>> def with_stars(**kwds):
print kwds['name'],'is',kwds['age'],'years old'
>>> args = {'name':'Gumby','age':42}
>>> with_stars(**args)
Gumby is 42 years old
_________________________________________
>>> def without_stars(kwds):
print kwds['name'],'is',kwds['age'],'years old'
>>> args = {'name':'Gumby','age':42}
>>> without_stars(args)
Gumby is 42 years old
____________________________________________
def story(**kwds):
return 'Once upon a time,' \
'a %(who)s was %(what)s' % kwds
>>> print story(who='king',what='killed')
Once upon a time,a king was killed
>>> params = {'job': 'language', 'name': 'Python'}
>>> print story(**params)
Once upon a time, there was a language called Python.
>>> del params['job']
>>> print story(job='stroke of genius', **params)
Once upon a time, there was a stroke of genius called Python.
____________________________________________
def power(x,y,*others):
if others:
print 'Received redundant params: ', others
return pow(x,y)
>>> power(2,3)
8
>>> power(2,5,'glory')
Received redundant params: ('glory',)
32
>>> power(x=4,y=5)
1024
>>> params = (5,)*2
>>> print params
(5, 5)
>>> power(*params)
3125
____________________________________________