Session 3
Functions are your friends
Functions?
Why do we want to use these things?
Simple programs
Won't always have them.
That's totally fine.
Larger programs
Really need them.
But let's back up
Think about driving directions
Driver's ed taught
you a few things
Turning the car on/off
Turning left/right
Stopping...starting...parking...
How do I get to the main library?
Your directions
Do you need to tell me...
- how to cross the road?
- how to go up stairs?
- how to turn left/right?
Seems simpler, then
to focus on the important bits of direction instead of basic functional tasks.
writeresults(
printlist(
getMetadata(each, wantedheaders),
wantedheaders),
wantedheaders,"outputdumps/" + filename)
Some actual code
All these functions are custom
...let's not talk about my poor naming conventions.
Can you imagine how long that would be otherwise?
def writeresults(dict,wantedheaders,filename):
f = open(filename + '.csv','wb')
f.write(u'\ufeff'.encode('utf8'))
w = DictUnicodeWriter(f,wantedheaders)
w.writeheader()
for each in dict:
w.writerow(each)
f.close()
def getMetadata(IDs, headers):
"""Function that takes a list of IDs and metadata values.
Returns a dictionary ID: {prop: value}.
This will populate non-existant values with empty strings.
Allows optional properties to be requested."""
results = {}
for each in IDs:
item = ia.Item(each)
itemresults = {}
for header in headers:
try:
itemresults[header] = item.metadata[header]
except:
itemresults[header] = u''
results[each] = itemresults
return results
def printlist(mydict,headers):
"""Function to transform the metadata result dict for output"""
returnlist = []
for key, value in mydict.iteritems():
tempdict = {}
for each in headers:
if type(value[each]) == list:
tempdict[each] = ":::".join(value[each])
else:
tempdict[each] = value[each]
returnlist.append(tempdict)
return returnlist
Here are those
functions
Are your eyes bleeding yet?
Advantages
- extract complex code out to make your operations easy to understand
- You have no idea what I'm doing, but you might take a guess that I'm getting metadata and writing it out to a file. You'd be right.
- code used in multiple places can be changed in just one place
- write results is used in 5 places
- getmetadata in 3
- and printlist 3
New vocabulary
Defining functions
def sayHello():
print "hello"
Python
keyword
Name of your function
Punctuation
is key
do this stuff...
Calling functions
>>> def sayHello():
... print "Hello"
...
>>> sayHello()
Hello
Make it do stuff
Passing values
Sometimes you want to do stuff on something that changes
>>> def sayHello(name):
... print "Hello", name
...
>>> sayHello("Elizabeth")
Hello Elizabeth
Give the incoming value a variable name
And do stuff with it
Pass a value when you call the function
Return or print
That is the question
print
Prints a value to the console, but you can't capture the value.
You can use an unlimited number of print statements.
return
Returns a value within a function. That value goes away if not captured and dealt with.
You can only have one return statement in a function, and your function exits immediately after evaluating a return statement.
So what?
Ask yourself: do you want to use a value coming out of your function?
Fuction...al practice
Our grader code
if grade >= 100:
result = "A+"
elif grade >= 90:
result = "A"
elif grade >= 80:
result = "B"
elif grade >=70:
result = "C"
elif grade >=60:
result = "D"
elif grade >= 0:
result = "F"
else:
result = "Bad grade"
print result
How can we reuse this code?
What if we had 1,000 grades to process?
Sesson 3
By Elizabeth W.
Sesson 3
- 1,070