
diff -r fccb3551c7d5 -r fc74987a475d day1/Session-4.tex
--- a/day1/Session-4.tex	Wed Oct 07 15:12:17 2009 +0530
+++ b/day1/Session-4.tex	Wed Oct 07 15:21:29 2009 +0530
@@ -78,7 +78,7 @@
 \author[FOSSEE Team] {Asokan Pichai\\Prabhu Ramachandran}
 
 \institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
-\date[] {10, October 2009}
+\date[] {10, October 2009\\Day 1, Session 4}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 %\pgfdeclareimage[height=0.75cm]{iitmlogo}{iitmlogo}
@@ -213,8 +213,7 @@
   \frametitle{Functions: default arguments}
   \small
   \begin{lstlisting}
-def ask_ok(prompt, retries=4,
-           complaint='Yes or no!'):
+def ask_ok(prompt, complaint='Yes or no!'):
     while True:
         ok = raw_input(prompt)
         if ok in ('y', 'ye', 'yes'): 
@@ -222,10 +221,10 @@
         if ok in ('n', 'no', 'nop',
                   'nope'): 
             return False
-        retries = retries - 1
-        if retries < 0: 
-            raise IOError, 'bad user'
         print complaint
+
+ask_ok('?')
+ask_ok('?', '[Y/N]')
   \end{lstlisting}
 \end{frame}
 
@@ -233,49 +232,21 @@
   \frametitle{Functions: keyword arguments}
   \small
   \begin{lstlisting}
-def parrot(voltage, state='a stiff', 
-           action='voom', type='Royal Blue'):
-    print "-- This parrot wouldn't", action,
-    print "if you supply", voltage, "Volts."
-    print "-- Lovely plumage, the", type
-    print "-- It's", state, "!"
-
-parrot(1000)
-parrot(action = 'VOOOOOM', voltage = 1000000)
-parrot('a thousand',
-       state = 'pushing up the daisies')
-parrot('a million', 'bereft of life', 'jump')
-\end{lstlisting}
-\end{frame}
+def ask_ok(prompt, complaint='Yes or no!'):
+    while True:
+        ok = raw_input(prompt)
+        if ok in ('y', 'ye', 'yes'): 
+            return True
+        if ok in ('n', 'no', 'nop',
+                  'nope'): 
+            return False
+        print complaint
 
-\begin{frame}[fragile]
-  \frametitle{Functions: arbitrary argument lists}
-  \begin{itemize}
-  \item Arbitrary number of arguments using \verb+*args+ or
-    \verb+*whatever+
-  \item Keyword arguments using \verb+**kw+
-  \item Given a tuple/dict how do you call a function?
-    \begin{itemize}
-    \item Using argument unpacking
-    \item For positional arguments: \verb+foo(*[5, 10])+
-    \item For keyword args: \verb+foo(**{'a':5, 'b':10})+
-    \end{itemize}
-  \end{itemize}
-\end{frame}
-
-  \begin{frame}[fragile]
-\begin{lstlisting}
-def foo(a=10, b=100):
-    print a, b
-def func(*args, **keyword):
-    print args, keyword
-# Unpacking:
-args = [5, 10]
-foo(*args)
-kw = {'a':5, 'b':10}
-foo(**kw)
+ask_ok(prompt='?')
+ask_ok(prompt='?', complaint='[Y/N]')
+ask_ok(complaint='[Y/N]', prompt='?')
 \end{lstlisting}
-    \inctime{15} 
+\inctime{15} 
 \end{frame}
 
 \subsection{Functional programming}
@@ -286,9 +257,43 @@
 \typ{map, reduce, filter}\\
 list comprehension\\
 generators
-    \inctime{15} 
+\end{frame}
+
+\begin{frame}[fragile]
+    \frametitle{List Comprehensions}
+Lets say we want to squares of all the numbers from 1 to 100
+    \begin{lstlisting}
+squares = []
+for i in range(1, 100):
+    squares.append(i * i)
+    \end{lstlisting}
+    \begin{lstlisting}
+# list comprehension
+squares = [i*i for i in range(1, 100)]
+     \end{lstlisting}
+Which is more readable?
 \end{frame}
 
+\begin{frame}[fragile]
+    \frametitle{List Comprehensions}
+What if you had a more complex function?
+Lets say we want squares of numbers from 1 to 100 ending in 1, 2, 5, 7 only
+    \begin{lstlisting}
+squares = []
+for i in range(1, 100):
+    if i % 10 in [1, 2, 5, 7]:
+        squares.append(i * i)
+    \end{lstlisting}
+    \begin{lstlisting}
+# list comprehension
+squares = [i*i for i in range(1, 100)
+           if i % 10 in [1, 2, 5, 7]]
+     \end{lstlisting}
+Which is more readable?
+\inctime{15}
+\end{frame}
+
+
 \subsection{Debugging}
 \begin{frame}[fragile]
  \frametitle{Errors}
@@ -325,7 +330,6 @@
         \item Process: Hypothesis, test, refine, rinse-repeat
         \item Using \typ{\%debug} and \typ{\%pdb} in IPython
     \end{itemize}
-    \inctime{15} 
 \end{frame}
 
 \begin{frame}[fragile]
@@ -369,10 +373,23 @@
       0     print spam
 ipdb>
 \end{lstlisting}
+\inctime{15} 
 \end{frame}
 
 \begin{frame}[fragile]
 \frametitle{Debugging: Exercise}
+\inctime{10}
 \end{frame}
 
+\begin{frame}
+  \frametitle{What did we learn?}
+  \begin{itemize}
+    \item Creating and using Dictionaries
+    \item Creating and using Sets
+    \item Advances Functions: default arguments, keyword arguments
+    \item Functional Programming, list comprehensions
+    \item Errors and Exceptions in Python
+    \item Debugging: How to use pdb, \%pdb and \%debug in IPython
+  \end{itemize}
+\end{frame}
 \end{document}




