diff options
author | Puneeth Chaganti | 2009-10-28 15:46:21 +0530 |
---|---|---|
committer | Puneeth Chaganti | 2009-10-28 15:46:21 +0530 |
commit | 59ff411333b7e73b3253210c8fb8fe30cf510305 (patch) | |
tree | 511236646168531d5a2b20b04682d219a75f9c15 /day2 | |
parent | 9a82414d19f7be403ac491bac0efa980814d0748 (diff) | |
parent | 493822563e409a8c518c6bc13ef8d46b0446631b (diff) | |
download | workshops-59ff411333b7e73b3253210c8fb8fe30cf510305.tar.gz workshops-59ff411333b7e73b3253210c8fb8fe30cf510305.tar.bz2 workshops-59ff411333b7e73b3253210c8fb8fe30cf510305.zip |
Merged with mainline.
Diffstat (limited to 'day2')
-rw-r--r-- | day2/DebugginDiagram.png | bin | 0 -> 8560 bytes | |||
-rw-r--r-- | day2/session1.tex | 384 | ||||
-rw-r--r-- | day2/session3.tex (renamed from day2/3Dplotting.tex) | 134 | ||||
-rw-r--r-- | day2/session4.tex | 386 | ||||
-rw-r--r-- | day2/session5.tex | 10 |
5 files changed, 684 insertions, 230 deletions
diff --git a/day2/DebugginDiagram.png b/day2/DebugginDiagram.png Binary files differnew file mode 100644 index 0000000..41af377 --- /dev/null +++ b/day2/DebugginDiagram.png diff --git a/day2/session1.tex b/day2/session1.tex index 18feb02..5fb42e0 100644 --- a/day2/session1.tex +++ b/day2/session1.tex @@ -140,13 +140,13 @@ \begin{itemize} \item \kwrd{int}\\ Any whole number is an \kwrd{int}, no matter what the size! \begin{lstlisting} -In []: a = 13 +In [1]: a = 13 -In []: a = 99999999999999999999 +In [2]: b = 99999999999999999999 \end{lstlisting} \item \kwrd{float} \begin{lstlisting} -In []: fl = 3.141592 +In [3]: fl = 3.141592 \end{lstlisting} \end{itemize} \end{frame} @@ -154,101 +154,254 @@ In []: fl = 3.141592 \begin{frame}[fragile] \frametitle{Complex numbers} \begin{lstlisting} -In []: cplx = 3+4j +In [1]: cplx = 3+4j -In []: abs(cplx) -Out[]: 5.0 +In [2]: abs(cplx) +Out[2]: 5.0 -In []: cplx.imag -Out[]: 4.0 +In [3]: cplx.imag +Out[3]: 4.0 -In []: cplx.real -Out[]: 3.0 +In [4]: cplx.real +Out[4]: 3.0 \end{lstlisting} \end{frame} \subsection{Boolean} -\begin{frame}{Boolean} - \begin{itemize} - \item \kwrd{True} - \item \kwrd{False} - \item \kwrd{not} - \item \kwrd{and} - \item \kwrd{or} - \end{itemize} +\begin{frame}[fragile] + \frametitle{Boolean} + \begin{lstlisting} +In [1]: t = True + +In [2]: f = not t +Out[2]: False + +In [3]: f or t +Out[3]: True + +In [4]: f and t +Out[4]: False + \end{lstlisting} \end{frame} \subsection{Strings} + \begin{frame}[fragile] - \frametitle{String methods} + \frametitle{Strings} Strings were introduced previously, let us now look at them in a little more detail. \begin{lstlisting} -In []: a = 'hello world' +In [1]: w = "hello" + +In [2]: print w[0] + w[2] + w[-1] +Out[2]: hlo + +In [3]: len(w) # guess what +Out[3]: 5 + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Strings \ldots} + \begin{lstlisting} +In [1]: w[0] = 'H' # Can't do that! +-------------------------------------------- +TypeError Traceback (most recent call last) -In []: a.startswith('hell') -Out[]: True +/<ipython console> in <module>() -In []: a.endswith('ld') -Out[]: True +TypeError: 'str' object does not + support item assignment + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{String methods} + \begin{lstlisting} +In [1]: a = 'Hello World' +In [2]: a.startswith('Hell') +Out[2]: True + +In [3]: a.endswith('ld') +Out[3]: True + +In [4]: a.upper() +Out[4]: 'HELLO WORLD' + +In [5]: a.lower() +Out[5]: 'hello world' \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Still with strings} -We saw split() previously. join() is the opposite of split() + \begin{itemize} + \item We saw split() yesterday + \item join() is the opposite of split() + \end{itemize} \begin{lstlisting} -In []: ''.join(['a', 'b', 'c']) -Out[]: 'abc' +In [1]: ''.join(['a', 'b', 'c']) +Out[1]: 'abc' \end{lstlisting} - \begin{block}{Note:} -Strings are immutable.\\ That is string variables cannot be changed. - \end{block} \end{frame} \begin{frame}[fragile] \frametitle{String formatting} \begin{lstlisting} -In []: x, y = 1, 1.234 -In []: 'x is %s, y is %s' %(x, y) -Out[]: 'x is 1, y is 1.234' +In [1]: x, y = 1, 1.234 + +In [2]: 'x is %s, y is %s' %(x, y) +Out[2]: 'x is 1, y is 1.234' \end{lstlisting} - \small -\url{docs.python.org/lib/typesseq-strings.html}\\ +\emphbar{ +\url{http://docs.python.org/library/stdtypes.html}\\ +} \inctime{10} \end{frame} -\section{Relational and logical operators} +\section{Operators} +\begin{frame}[fragile] + \frametitle{Arithematic operators} + \begin{lstlisting} +In [1]: 1786 % 12 +Out[1]: 10 + +In [2]: 3124 * 126789 +Out[2]: 396088836 + +In [3]: a = 3124 * 126789 + +In [4]: big = 1234567891234567890 ** 3 + +In [5]: verybig = big * big * big * big + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Arithematic operators \ldots} + \begin{lstlisting} +In [1]: 17/2 +Out[1]: 8 + +In [2]: 17/2.0 +Out[2]: 8.5 + +In [3]: 17.0/2 +Out[3]: 8.5 + +In [4]: 17.0/8.5 +Out[4]: 2.0 + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{String operations} + \begin{lstlisting} +In [1]: s = 'Hello ' + +In [2]: p = 'World' + +In [3]: s + p +Out[3]: 'Hello World' + +In [4]: s * 12 +Out[4]: 'Hello Hello Hello Hello ...' + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{String operations \ldots} + \begin{lstlisting} +In [1]: s * s +-------------------------------------------- +TypeError Traceback (most recent call last) + +/<ipython console> in <module>() + +TypeError: can't multiply sequence by + non-int of type 'str' + \end{lstlisting} +\end{frame} + \begin{frame}[fragile] \frametitle{Relational and logical operators} \begin{lstlisting} -In []: pos, zer, neg = 1, 0, -1 -In []: pos == neg -Out[]: False +In [1]: pos, zer, neg = 1, 0, -1 +In [2]: pos == neg +Out[2]: False -In []: pos >= neg -Out[]: True +In [3]: pos >= neg +Out[3]: True -In []: neg < zer < pos -Out[]: True +In [4]: neg < zer < pos +Out[4]: True -In []: pos + neg != zer -Out[]: False +In [5]: pos + neg != zer +Out[5]: False \end{lstlisting} \inctime{5} \end{frame} -\begin{frame} - {A classic problem} +\begin{frame}[fragile] + \frametitle{Built-ins} + \begin{lstlisting} +In [1]: int(17/2.0) +Out[1]: 8 + +In [2]: float(17/2) # Recall +Out[2]: 8.0 + +In [3]: str(17/2.0) +Out[3]: '8.5' + +In [4]: round( 7.5 ) +Out[4]: 8.0 + \end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Odds and ends} + \begin{itemize} + \item Case sensitive + \item Dynamically typed $\Rightarrow$ need not specify a type + \begin{lstlisting} +In [1]: a = 1 +In [2]: a = 1.1 +In [3]: a = "Now I am a string!" + \end{lstlisting} + \item Comments: + \begin{lstlisting} +In [4]: a = 1 # In-line comments +In [5]: # Comment in a line to itself. +In [6]: a = "# This is not a comment!" + \end{lstlisting} + \end{itemize} + \inctime{15} +\end{frame} + +\begin{frame}[fragile] \frametitle{A question of good style} + \begin{lstlisting} + amount = 12.68 + denom = 0.05 + nCoins = round(amount/denom) + rAmount = nCoins * denom + \end{lstlisting} + \pause + \begin{block}{Style Rule \#1} + Naming is 80\% of programming + \end{block} +\end{frame} + +\section{Simple IO} +\begin{frame}{Simple IO} \begin{block} - {Interchange values} - How to interchange values of two variables? + {Console Input} + \texttt{raw\_input()} waits for user input.\\Prompt string is optional.\\ + All keystrokes are Strings!\\\texttt{int()} converts string to int. \end{block} - \pause - \begin{block}{Note:} - This Python idiom works for all types of variables.\\ -They need not be of the same type! + \begin{block} + {Console output} + \texttt{print} is straight forward. Note the distinction between \texttt{print x} and \texttt{print x,} \end{block} - \inctime{10} \end{frame} \section{Control flow} @@ -279,21 +432,9 @@ else: \end{lstlisting} \end{frame} -\begin{frame}{Simple IO} - \begin{block} - {Console Input} - \texttt{raw\_input()} waits for user input.\\Prompt string is optional.\\ - All keystrokes are Strings!\\\texttt{int()} converts string to int. - \end{block} - \begin{block} - {Console output} - \texttt{print} is straight forward. Note the distinction between \texttt{print x} and \texttt{print x,} - \end{block} -\end{frame} - \subsection{Basic Looping} \begin{frame}[fragile] - \frametitle{\kwrd{while}} + \frametitle{\typ{while}} Example: Fibonacci series \begin{lstlisting} # the sum of two elements @@ -307,7 +448,7 @@ while b < 10: \end{frame} \begin{frame}[fragile] -\frametitle{\kwrd{range()}} +\frametitle{\typ{range()}} \kwrd{range([start,] stop[, step])}\\ \begin{itemize} \item \alert {range() returns a list of integers} @@ -316,7 +457,7 @@ while b < 10: \end{frame} \begin{frame}[fragile] - \frametitle{\kwrd{for}} + \frametitle{\typ{for} \ldots \typ{range()}} Example: print squares of first \typ{n} numbers \begin{lstlisting} In []: for i in range(5): @@ -332,85 +473,44 @@ In []: for i in range(5): \inctime{15} \end{frame} -\section{Lists} -\begin{frame}[fragile] -\frametitle{More List methods} -\begin{lstlisting} -In []: lst = [1,2,3,4,5,6,7,8] -In []: lst.reverse() -In []: lst -Out[]: [8, 7, 6, 5, 4, 3, 2, 1] - -In []: lst.extend([0, -1, -2]) -In []: lst -Out[]: [8, 7, 6, 5, 4, 3, 2, 1, 0, -1] - -In []: lst.remove(0) -In []: lst -Out[]: [8, 7, 6, 5, 4, 3, 2, 1, -1] -\end{lstlisting} -\end{frame} - -\begin{frame}[fragile] -\frametitle{List containership} -\begin{lstlisting} -In []: a = 8 - -In []: a in lst -Out[]: True - -In []: b = 10 -In []: b in lst -Out[]: False - -In []: b not in lst -Out[]: True -\end{lstlisting} -\inctime{10} +\subsection{Exercises} +\begin{frame} + \frametitle{Problem set 1} + \begin{itemize} + \item All the problems can be\\ + solved using \kwrd{if} and \kwrd{while} + \end{itemize} \end{frame} -\section{Tuples} -\begin{frame}[fragile] -\frametitle{Tuples: Immutable lists} -\begin{lstlisting} -In []: tup = (1,2,3,4,5,6,7,8) -In []: tup[0]+tup[3]+tup[-1] -Out[]: 13 -\end{lstlisting} -\begin{block}{Note:} -\begin{itemize} -\item Tuples are immutable - cannot be changed -\item Multiple return values in a function are actually tuples -\item Tuples are working behind the scenes in exchanging values - Tuple Unpacking -\end{itemize} -\end{block} -\inctime{5} +\begin{frame}{Problem 1.1} + Write a program that displays all three digit numbers that are equal to the sum of the cubes of their digits. That is, print numbers $abc$ that have the property $abc = a^3 + b^3 + c^3$\\ +\vspace*{0.2in} +\emphbar{These are called $Armstrong$ numbers.} \end{frame} + +\begin{frame}{Problem 1.2 - Collatz sequence} +\begin{enumerate} + \item Start with an arbitrary (positive) integer. + \item If the number is even, divide by 2; if the number is odd, multiply by 3 and add 1. + \item Repeat the procedure with the new number. + \item It appears that for all starting values there is a cycle of 4, 2, 1 at which the procedure loops. +\end{enumerate} + Write a program that accepts the starting value and prints out the Collatz sequence. -\section{Dictionaries} -\begin{frame}[fragile] -\frametitle{Dictionaries} - \alert {lists and tuples: integer indexes :: dictionaries: string indexes} -\begin{lstlisting} -In []: player = {'Mat': 134,'Inn': 233, - 'Runs': 10823, 'Avg': 52.53} - -In []: player['Avg'] -Out[]: 52.530000000000001 -In []: player.keys() -Out[]: ['Runs', 'Inn', 'Avg', 'Mat'] -In []: player.values() -Out[]: [10823, 233, - 52.530000000000001, 134] -\end{lstlisting} \end{frame} -\begin{frame}{Dictionaries} -\begin{itemize} -\item Duplicate keys are not allowed! -\item Dictionaries are iterable through keys. -\end{itemize} -\inctime{5} +\begin{frame}[fragile]{Problem 1.4} + Write a program that prints the following pyramid on the screen. + \begin{lstlisting} +1 +2 2 +3 3 3 +4 4 4 4 + \end{lstlisting} +The number of lines must be obtained from the user as input.\\ +\pause +\emphbar{When can your code fail?} +\only<2->{\inctime{20}} \end{frame} \end{document} diff --git a/day2/3Dplotting.tex b/day2/session3.tex index 16c0bd2..f623b32 100644 --- a/day2/3Dplotting.tex +++ b/day2/session3.tex @@ -97,7 +97,7 @@ % Title page \title[]{3D data Visualization} -\author[FOSSEE Team] {FOSSEE} +\author[FOSSEE] {FOSSEE} \institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} \date[] {1, November 2009\\Day 2, Session 3} @@ -157,22 +157,22 @@ \end{frame} -\begin{frame} - \frametitle{Is this new?} - \begin{center} - We have moved from: - \end{center} - \begin{columns} - \column{} - \hspace*{-1in} - \includegraphics[width=1.75in,height=1.75in, interpolate=true]{data/3832} - \column{}\hspace*{-0.25in} - To - \column{} - \hspace*{-1in} - \includegraphics[width=1.75in, height=1.75in, interpolate=true]{data/torus} - \end{columns} -\end{frame} +%% \begin{frame} +%% \frametitle{Is this new?} +%% \begin{center} +%% We have moved from: +%% \end{center} +%% \begin{columns} +%% \column{} +%% \hspace*{-1in} +%% \includegraphics[width=1.75in,height=1.75in, interpolate=true]{data/3832} +%% \column{}\hspace*{-0.25in} +%% To +%% \column{} +%% \hspace*{-1in} +%% \includegraphics[width=1.75in, height=1.75in, interpolate=true]{data/torus} +%% \end{columns} +%% \end{frame} \begin{frame} \frametitle{3D visualization} @@ -238,7 +238,7 @@ \frametitle{Using mlab} \begin{lstlisting} ->>> from enthought.mayavi import mlab +In []:from enthought.mayavi import mlab \end{lstlisting} \vspace*{0.5in} @@ -248,9 +248,9 @@ \vspace*{0.25in} \begin{lstlisting} ->>> mlab.test_<TAB> ->>> mlab.test_contour3d() ->>> mlab.test_contour3d?? +In []: mlab.test_<TAB> +In []: mlab.test_contour3d() +In []: mlab.test_contour3d?? \end{lstlisting} \end{frame} @@ -270,72 +270,31 @@ \end{frame} \begin{frame}[fragile] - \frametitle{plotting 3-D Surface: $x^2+y^2-z^2=1$} - \begin{lstlisting} -u,v = mgrid[-2:2:100j, -pi:pi:100j] -x=sqrt(u*u+1)*cos(v) -y=sqrt(u*u+1)*sin(v) -z=u -mlab.mesh(x,y,z) - \end{lstlisting} -\begin{figure} -\includegraphics[width=1in, height=1in, interpolate=true]{data/hyperboloid} -\end{figure} -\end{frame} - -\begin{frame}[fragile] - \frametitle{mgrid} - \begin{itemize} - \item Creates a multidimensional ``meshgrid'' - - \item In this particular case, creates 2 2D arrays: u,v. - \end{itemize} - \begin{lstlisting} -In []: mgrid[0:3,0:3] -Out[]: -array([[[0, 0, 0], - [1, 1, 1], - [2, 2, 2]], - - [[0, 1, 2], - [0, 1, 2], - [0, 1, 2]]]) - \end{lstlisting} -\end{frame} - -\begin{frame}[fragile] - \frametitle{mesh} - \begin{itemize} - \item Plots a surface from data supplied as 2D arrays. - \end{itemize} -\end{frame} - -\begin{frame}[fragile] \frametitle{\mlab\ plotting functions} \begin{columns} \column{0.25\textwidth} - \myemph{Points in 3D space} + \myemph{\Large 0D data} \column{0.5\textwidth} \pgfimage[width=2in]{MEDIA/m2/mlab/points3d_ex} \end{columns} \begin{lstlisting} ->>> from numpy import * ->>> t = linspace(0, 2*pi, 50) ->>> u = cos(t)*pi ->>> x, y, z = sin(u), cos(u), sin(t) +In []: from numpy import * +In []: t = linspace(0, 2*pi, 50) +In []: u = cos(t) * pi +in []: x, y, z = sin(u), cos(u), sin(t) \end{lstlisting} - \emphbar{\PythonCode{>>> mlab.points3d(x, y, z)}} + \emphbar{\PythonCode{In []: mlab.points3d(x, y, z)}} \end{frame} \begin{frame} \begin{columns} \column{0.25\textwidth} - \myemph{Connected points in 3D space} + \myemph{\Large 1D data} \column{0.5\textwidth} \pgfimage[width=2.5in]{MEDIA/m2/mlab/plot3d_ex} \end{columns} - \emphbar{\PythonCode{>>> mlab.plot3d(x, y, z, t)}} + \emphbar{\PythonCode{In []: mlab.plot3d(x, y, z, t)}} Plots lines between the points @@ -349,11 +308,11 @@ array([[[0, 0, 0], \pgfimage[width=2in]{MEDIA/m2/mlab/surf_ex} \end{columns} \begin{lstlisting} ->>> x, y = mgrid[-3:3:100j,-3:3:100j] ->>> z = sin(x*x + y*y) +In []: x, y = mgrid[-3:3:100j,-3:3:100j] +In []: z = sin(x*x + y*y) \end{lstlisting} - \emphbar{\PythonCode{>>> mlab.surf(x, y, z)}} + \emphbar{\PythonCode{In []: mlab.surf(x, y, z)}} \alert{Assumes the points are rectilinear} @@ -363,18 +322,18 @@ array([[[0, 0, 0], \myemph{\Large 2D data: \texttt{mlab.mesh}} \vspace*{0.25in} - \emphbar{\PythonCode{>>> mlab.mesh(x, y, z)}} + \emphbar{\PythonCode{In []: mlab.mesh(x, y, z)}} \alert{Points needn't be regular} \vspace*{0.25in} \begin{lstlisting} ->>> phi, theta = numpy.mgrid[0:pi:20j, +In []: phi, theta = numpy.mgrid[0:pi:20j, ... 0:2*pi:20j] ->>> x = sin(phi)*cos(theta) ->>> y = sin(phi)*sin(theta) ->>> z = cos(phi) ->>> mlab.mesh(x, y, z, +In []: x = sin(phi)*cos(theta) +In []: y = sin(phi)*sin(theta) +In []: z = cos(phi) +In []: mlab.mesh(x, y, z, ... representation= ... 'wireframe') \end{lstlisting} @@ -390,10 +349,10 @@ array([[[0, 0, 0], \pgfimage[width=1.5in]{MEDIA/m2/mlab/contour3d}\\ \end{columns} \begin{lstlisting} ->>> x, y, z = ogrid[-5:5:64j, +In []: x, y, z = ogrid[-5:5:64j, ... -5:5:64j, ... -5:5:64j] ->>> mlab.contour3d(x*x*0.5 + y*y + +In []: mlab.contour3d(x*x*0.5 + y*y + z*z*2) \end{lstlisting} \end{frame} @@ -406,7 +365,7 @@ array([[[0, 0, 0], \pgfimage[width=2in]{MEDIA/m2/mlab/quiver3d_ex}\\ \begin{lstlisting} ->>> mlab.test_quiver3d() +In []: mlab.test_quiver3d() \end{lstlisting} \emphbar{\PythonCode{obj = mlab.quiver3d(x, y, z, u, v, w)}} @@ -552,6 +511,15 @@ mlab.show() \end{lstlisting} \end{frame} - + +\begin{frame} + \frametitle{We have covered:} + \begin{itemize} + \item Need of visualization. + \item Using mlab to create 3 D plots. + \item Mayavi Toolkit. + \end{itemize} +\end{frame} + \end{document} diff --git a/day2/session4.tex b/day2/session4.tex new file mode 100644 index 0000000..d7aae3f --- /dev/null +++ b/day2/session4.tex @@ -0,0 +1,386 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Tutorial slides on Python. +% +% Author: Prabhu Ramachandran <prabhu at aero.iitb.ac.in> +% Copyright (c) 2005-2009, Prabhu Ramachandran +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[compress,14pt]{beamer} +% \documentclass[handout]{beamer} +% \usepackage{pgfpages} +% \pgfpagesuselayout{4 on 1}[a4paper,border, shrink=5mm,landscape] +\usepackage{tikz} +\newcommand{\hyperlinkmovie}{} +%\usepackage{movie15} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Note that in presentation mode +% \paperwidth 364.19536pt +% \paperheight 273.14662pt +% h/w = 0.888 + + +\mode<presentation> +{ + \usetheme{Warsaw} + %\usetheme{Boadilla} + %\usetheme{default} + \useoutertheme{split} + \setbeamercovered{transparent} +} + +% To remove navigation symbols +\setbeamertemplate{navigation symbols}{} + +\usepackage{amsmath} +\usepackage[english]{babel} +\usepackage[latin1]{inputenc} +\usepackage{times} +\usepackage[T1]{fontenc} + +% Taken from Fernando's slides. +\usepackage{ae,aecompl} +\usepackage{mathpazo,courier,euler} +\usepackage[scaled=.95]{helvet} +\usepackage{pgf} + +\definecolor{darkgreen}{rgb}{0,0.5,0} + +\usepackage{listings} +\lstset{language=Python, + basicstyle=\ttfamily\bfseries, + commentstyle=\color{red}\itshape, + stringstyle=\color{darkgreen}, + showstringspaces=false, + keywordstyle=\color{blue}\bfseries} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% My Macros +\setbeamercolor{postit}{bg=yellow,fg=black} +\setbeamercolor{emphbar}{bg=blue!20, fg=black} +\newcommand{\emphbar}[1] +{\begin{beamercolorbox}[rounded=true]{emphbar} + {#1} + \end{beamercolorbox} +} +%{\centerline{\fcolorbox{gray!50} {blue!10}{ +%\begin{minipage}{0.9\linewidth} +% {#1} +%\end{minipage} +% }}} + +\newcommand{\myemph}[1]{\structure{\emph{#1}}} +\newcommand{\PythonCode}[1]{\lstinline{#1}} + +\newcommand{\tvtk}{\texttt{tvtk}} +\newcommand{\mlab}{\texttt{mlab}} + +\newcounter{time} +\setcounter{time}{0} +\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\vspace*{0.1in}\tiny \thetime\ m}} + +\newcommand\BackgroundPicture[1]{% + \setbeamertemplate{background}{% + \parbox[c][\paperheight]{\paperwidth}{% + \vfill \hfill + \hfill \vfill +}}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Configuring the theme +%\setbeamercolor{normal text}{fg=white} +%\setbeamercolor{background canvas}{bg=black} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Title page +\title[]{Debugging and \\Test Driven Approach} + +\author[FOSSEE] {FOSSEE} + +\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} +\date[] {11, October 2009} +\date[] % (optional) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%\pgfdeclareimage[height=0.75cm]{iitblogo}{iitblogo} +%\logo{\pgfuseimage{iitblogo}} + +\AtBeginSection[] +{ + \begin{frame}<beamer> + \frametitle{Outline} + \Large + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} + +%% Delete this, if you do not want the table of contents to pop up at +%% the beginning of each subsection: +\AtBeginSubsection[] +{ + \begin{frame}<beamer> + \frametitle{Outline} + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} + +\AtBeginSection[] +{ + \begin{frame}<beamer> + \frametitle{Outline} + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DOCUMENT STARTS +\begin{document} + +\begin{frame} + \maketitle +\end{frame} + + +\section{Debugging} +\subsection{Errors and Exceptions} +\begin{frame}[fragile] + \frametitle{Errors} + \begin{lstlisting} +>>> while True print 'Hello world' + \end{lstlisting} +\pause + \begin{lstlisting} + File "<stdin>", line 1, in ? + while True print 'Hello world' + ^ +SyntaxError: invalid syntax +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Exceptions} + \begin{lstlisting} +>>> print spam +\end{lstlisting} +\pause +\begin{lstlisting} +Traceback (most recent call last): + File "<stdin>", line 1, in <module> +NameError: name 'spam' is not defined +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Exceptions} + \begin{lstlisting} +>>> 1 / 0 +\end{lstlisting} +\pause +\begin{lstlisting} +Traceback (most recent call last): + File "<stdin>", line 1, in <module> +ZeroDivisionError: integer division +or modulo by zero +\end{lstlisting} +\end{frame} + +\subsection{Strategy} +\begin{frame}[fragile] + \frametitle{Debugging effectively} + \begin{itemize} + \item \kwrd{print} based strategy + \item Process: + \end{itemize} +\begin{center} +\pgfimage[interpolate=true,width=5cm,height=5cm]{DebugginDiagram.png} +\end{center} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Debugging effectively} + \begin{itemize} + \item Using \typ{\%debug} in IPython + \end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Debugging in IPython} +\small +\begin{lstlisting} +In [1]: import mymodule +In [2]: mymodule.test() +--------------------------------------------- +NameError Traceback (most recent call last) +<ipython console> in <module>() +mymodule.py in test() + 1 def test(): +----> 2 print spam +NameError: global name 'spam' is not defined + +In [3]: %debug +> mymodule.py(2)test() + 0 print spam +ipdb> +\end{lstlisting} +\inctime{15} +\end{frame} + +\subsection{Exercise} +\begin{frame}[fragile] +\frametitle{Debugging: Exercise} +\small +\begin{lstlisting} +import keyword +f = open('/path/to/file') + +freq = {} +for line in f: + words = line.split() + for word in words: + key = word.strip(',.!;?()[]: ') + if keyword.iskeyword(key): + value = freq[key] + freq[key] = value + 1 + +print freq +\end{lstlisting} +\inctime{10} +\end{frame} + +%% \begin{frame} +%% \frametitle{Testing} + +%% \begin{itemize} +%% \item Writing tests is really simple! + +%% \item Using nose. + +%% \item Example! +%% \end{itemize} +%% \end{frame} + +\section{Test Driven Approach} +\begin{frame} + \frametitle{Need of Testing!} + + \begin{itemize} + \item Quality + \item Regression + \item Documentation + \end{itemize} + %% \vspace*{0.25in} + %% \emphbar{It is to assure that section of code is working as it is supposed to work} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Example} + \begin{block}{Problem Statement} + Write a function to check whether a given input + string is a palindrome. + \end{block} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Function: palindrome.py} +\begin{lstlisting} +def is_palindrome(input_str): + return input_str == input_str[::-1] +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Test for the palindrome: palindrome.py} +\begin{lstlisting} +from plaindrome import is_palindrome +def test_function_normal_words(): + input = "noon" + assert is_palindrome(input) == True +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Running the tests.} +\begin{lstlisting} +$ nosetests test.py +. +---------------------------------------------- +Ran 1 test in 0.001s + +OK +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Exercise: Including new tests.} +\begin{lstlisting} +def test_function_ignore_cases_words(): + input = "Noon" + assert is_palindrome(input) == True +\end{lstlisting} + \vspace*{0.25in} + Check\\ + \PythonCode{$ nosetests test.py} \\ + \begin{block}{Task} + Tweak the code to pass this test. + \end{block} +\end{frame} + +%\begin{frame}[fragile] +% \frametitle{Lets write some test!} +%\begin{lstlisting} +%#for form of equation y=mx+c +%#given m and c for two equation, +%#finding the intersection point. +%def intersect(m1,c1,m2,c2): +% x = (c2-c1)/(m1-m2) +% y = m1*x+c1 +% return (x,y) +%\end{lstlisting} +% +%Create a simple test for this +% +%function which will make it fail. +% +%\inctime{15} +%\end{frame} +% + +\begin{frame}[fragile] + \frametitle{Exercise} + Based on Euclid's algorithm: + \begin{center} + $gcd(a,b)=gcd(b,b\%a)$ + \end{center} + gcd function can be written as: + \begin{lstlisting} + def gcd(a, b): + if a%b == 0: return b + return gcd(b, a%b) + \end{lstlisting} + \vspace*{-0.15in} + \begin{block}{Task} + \begin{itemize} + \item Write at least + two tests for above mentioned function. + \item Write a non recursive implementation + of gcd(), and test it using already + written tests. + \end{itemize} + \end{block} + +\inctime{15} +\end{frame} + +\begin{frame} + \frametitle{We have learned} + \begin{itemize} + \item Following and Resolving Error Messages. + \item Exceptions. + \item Approach for Debugging. + \item Writting and running tests. + \end{itemize} +\end{frame} + +\end{document} diff --git a/day2/session5.tex b/day2/session5.tex index f3b517e..5a5949d 100644 --- a/day2/session5.tex +++ b/day2/session5.tex @@ -147,14 +147,14 @@ \begin{frame}[fragile] \frametitle{Problem set 4} - Finite difference + Central difference \begin{equation*} - \frac{sin(x+h)-sin(x)}{h} + \frac{sin(x+h)-sin(x-h)}{2h} \end{equation*} \begin{lstlisting} - >>> x = linspace(0,2*pi,100) - >>> y = sin(x) - >>> deltax = x[1] - x[0] + In []: x = linspace(0, 2*pi, 100) + In []: y = sin(x) + In []: deltax = x[1] - x[0] \end{lstlisting} \pause \begin{enumerate} |