Beginning Question about Python functions, parameters...

Diez B. Roggisch deets at nospam.web.de
Mon Nov 23 13:17:12 EST 2009


astral orange wrote:

> Hi, I am trying to teach myself Python and have a good book to help me
> but I am stuck on something and I would like for someone to explain
> the following piece of code for me and what it's actually doing.
> Certain parts are very clear but once it enters the "def store(data,
> full_name): ...." function and the "def lookup()..." function things
> get a little confusing for me. Specifically, lines 103-108 *and* Lines
> 110-111.
> 
> Lastly, I am not sure how to print the results I've put into this
> program either, the book I'm reading doesn't tell me. As you can tell,
> I am a beginner and I don't truly understand everything that is going
> on here...a lot, but not all....
> 
> Here is the code:
> 
>  92 def init(data):
>  93     data['first'] = {}
>  94     data['middle'] = {}
>  95     data['last'] = {}
>  96
>  97 def store(data, full_name):
>  98     names = full_name.split()
> 100     if len(names) == 2: names.insert(1, '')
> 101     labels = 'first', 'middle', 'last'
> 103     for label, name in zip(labels, names):

The zip-function takes n iterables, and produces a list with n-tuples out of
it. Type this into the python-prompt:

>>> zip([1, 2, 3], ["a", "b", "c"])

The other thing here is tuple-unpacking. If you know that something has a
specific length, you can unpack it into distinct values like this:

>>> a, b = (10, 20)
>>> print a
10
>>> print b
20

Now 

 for label, name in zip(labels, names):


does

 - create a list of tuples, each tuple having two elements, the first being
the label, the second a name
 - loops over this list
 - for each item in the list (remember, it's a 2-tuple!), unpack it into
label and name




> 104         people = lookup(data, label, name)
> 105     if people:
> 106         people.append(full_name)
> 107     else:
> 108         data[label][name] = [full_name]
> 109
> 110 def lookup(data, label, name):
> 111     return data[label].get(name)

Data here is expected to be a dictionary of dictionaries. The first level of
keys are the labels. The second is the name. It is expected that labels
always exist, but names might be empty, so instead of writing

  return data[label][name]

it uses get(name) on a dict which will return the  value for the key, or
None:

>>> {"foo" : "bar"}.get("foo")
bar
>>> {"foo" : "bar"}.get("baz")
>>> # no output means None


That being said, I agree with Neo that this introduction seems to be rather
bad.

Diez



More information about the Python-list mailing list