--- /dev/null
+
+
+## Exercise 1
+
+In the episode on [Randomness](http://software-carpentry.org/4_0/invperc/random)
+we discussed how it is important (and saves time!) to use well-tested library
+routines to generate random numbers. This principle of reuse is also true for
+any other task you need to carry out. Python is packaged with an [extensive
+library of modules](http://docs.python.org/library/index.html). What module
+could you use to...
+
+* parse a string containing a date or time (e.g. "Thursday, 27 May, 2010")?
+ > [`datetime`](http://docs.python.org/library/datetime.html) and in particular,
+ > the function [`datetime.strptime()`](http://docs.python.org/library/datetime.html#datetime.datetime.strptime)
+
+
+* inspect a bunch of files in a folder or subfolders?
+ > One module for doing this is the
+ > [`os.path`](http://docs.python.org/library/os.path.html). It has lots of
+ > functions for manipulating path names, and also this gem of a function:
+ > [`os.path.walk`](http://docs.python.org/library/os.path.html#os.path.walk).
+
+* manage command line arguments to your program?
+ > [`argparse`](http://docs.python.org/library/argparse.html)
+
+* access data on the web?
+ > For very basic operations like downloading files, check out:
+ > [`urllib`](http://docs.python.org/library/urllib.html)
+
+
+## Exercise 2
+
+In this lecture we wrote roughly the following snippet to parse the command line arguments.
+
+```python
+import sys
+
+def fail(message):
+ print message
+ sys.exit(1)
+
+def parse_arguments(arguments):
+ '''Parse strings to get controlling parameters.'''
+
+ try:
+ grid_size = int(arguments[0])
+ value_range = int(arguments[1])
+ random_seed = int(arguments[2])
+ except IndexError:
+ fail('Expected 3 arguments, got %d' % len(arguments))
+ except ValueError:
+ fail('Expected int arguments, got %s' % str(arguments))
+
+ return grid_size, value_range, random_seed
+
+if __name__ == '__main__':
+ arguments = sys.argv[1:]
+ grid_size, value_range, random_seed = parse_arguments(arguments)
+
+ # print out the arguments
+ print "grid size = %i \t value range = %i \t seed = %i" % \
+ (grid_size, value_range, random_seed)
+```
+
+As we learned in Exercise 1, python comes with a library,
+[`argparse`](http://docs.python.org/library/argparse.html), to do this in a way
+that's easier to extend and with better error messages.
+
+In this exercise, you'll rework the above code to use the argparse library.
+You'll need to import the `argparse` module, and rewrite `parse_arguments` to
+use it.
+
+**A hint on getting started:**
+
+> You'll need to create an ArgumentParser object, and then call it's
+> `add_argument` method for each of the arguments.
+
+
+**A hint on setting up `argparse`:**
+
+> The arguments are positional arguments so when you call `add_argument` you just
+> need to supply a
+> [name](http://docs.python.org/library/argparse.html#name-or-flags), and a type
+> (extra hint: `int`). Passing in a help message, default value, and so on is not
+> mandatory.
+
+**A hint if you're really stuck:**
+
+> ```python
+> parser.add_argument('grid_size', type=int, help="Grid size")
+> ```
+
+**A hint on accessing the parsed arguments:**
+
+> If you created an argument named "foo", you can access it by calling:
+>
+> ```python
+> args = parser.parse_args()
+> print args.foo
+> ```
+
+**Our answer:**
+> ```python
+> import sys, argparse
+>
+> def parse_arguments(arguments):
+> '''Parse strings to get controlling parameters.'''
+>
+> parser = argparse.ArgumentParser()
+> parser.add_argument('grid_size', type=int, help='Grid size')
+> parser.add_argument('value_range', type=int, help='Value range')
+> parser.add_argument('random_seed', type=int, help='Random seed')
+> args = parser.parse_args(arguments)
+>
+> return args.grid_size, args.value_range, args.random_seed
+>
+> if __name__ == '__main__':
+> arguments = sys.argv[1:]
+> grid_size, value_range, random_seed = parse_arguments(arguments)
+> print "grid size = %i \t value range = %i \t seed = %i" % \
+> (grid_size, value_range, random_seed)
+> ```
+>
+> The `fail()` function is no longer necessary since `argparse.parse_args`
+> exits and prints a help message if incorrect arguments are passed in. Try
+> running your program with only the argument "-h" to get a more verbose help
+> message.