Skip to content

Commit

Permalink
Removing unneeded code, adding data files
Browse files Browse the repository at this point in the history
  • Loading branch information
AllenDowney committed Jul 2, 2015
1 parent 6a578c7 commit 79ae7d0
Show file tree
Hide file tree
Showing 39 changed files with 245,957 additions and 116,632 deletions.
43 changes: 43 additions & 0 deletions code/BadKangaroo.py
@@ -0,0 +1,43 @@
"""
This program is part of an exercise in
Think Python: An Introduction to Software Design
Allen B. Downey
WARNING: this program contains a NASTY bug. I put
it there on purpose as a debugging exercise, but
you DO NOT want to emulate this example!
"""

class Kangaroo(object):
"""a Kangaroo is a marsupial"""

def __init__(self, contents=[]):
"""initialize the pouch contents; the default value is
an empty list"""
self.pouch_contents = contents

def __str__(self):
"""return a string representaion of this Kangaroo and
the contents of the pouch, with one item per line"""
t = [ object.__str__(self) + ' with pouch contents:' ]
for obj in self.pouch_contents:
s = ' ' + object.__str__(obj)
t.append(s)
return '\n'.join(t)

def put_in_pouch(self, item):
"""add a new item to the pouch contents"""
self.pouch_contents.append(item)

kanga = Kangaroo()
roo = Kangaroo()
kanga.put_in_pouch('wallet')
kanga.put_in_pouch('car keys')
kanga.put_in_pouch(roo)

print kanga

# If you run this program as is, it seems to work.
# To see the problem, trying printing roo.
70 changes: 70 additions & 0 deletions code/GoodKangaroo.py
@@ -0,0 +1,70 @@
"""
This program is part of an exercise in
Think Python: An Introduction to Software Design
Allen B. Downey
This program explains and corrects a bug in BadKangaroo.py.
Before reading this, you should try to debug BadKangaroo.
"""

class Kangaroo(object):
"""a Kangaroo is a marsupial"""

def __init__(self, contents=[]):
# The problem is the default value for contents.
# Default values get evaluated ONCE, when the function
# is defined; they don't get evaluated again when the
# function is called.

# In this case that means that when __init__ is defined,
# [] gets evaluated and contents gets a reference to
# an empty list.

# After that, every Kangaroo that gets the default
# value get a reference to THE SAME list. If any
# Kangaroo modifies this shared list, they all see
# the change.

# The next version of __init__ shows an idiomatic way
# to avoid this problem.
self.pouch_contents = contents

def __init__(self, contents=None):
# In this version, the default value is None. When
# __init__ runs, it checks the value of contents and,
# if necessary, creates a new empty list. That way,
# every Kangaroo that gets the default value get a
# reference to a different list.

# As a general rule, you should avoid using a mutable
# object as a default value, unless you really know
# what you are doing.
if contents == None:
contents = []
self.pouch_contents = contents

def __str__(self):
"""return a string representation of this Kangaroo and
the contents of the pouch, with one item per line"""
t = [ object.__str__(self) + ' with pouch contents:' ]
for obj in self.pouch_contents:
s = ' ' + object.__str__(obj)
t.append(s)
return '\n'.join(t)

def put_in_pouch(self, item):
"""add a new item to the pouch contents"""
self.pouch_contents.append(item)

kanga = Kangaroo()
roo = Kangaroo()
kanga.put_in_pouch('wallet')
kanga.put_in_pouch('car keys')
kanga.put_in_pouch(roo)

print kanga
print ''

print roo
199 changes: 0 additions & 199 deletions code/Highway.py

This file was deleted.

23 changes: 0 additions & 23 deletions code/MathClient.py

This file was deleted.

23 changes: 0 additions & 23 deletions code/MathServer.py

This file was deleted.

30 changes: 0 additions & 30 deletions code/Modifier.py

This file was deleted.

0 comments on commit 79ae7d0

Please sign in to comment.