Added interpolate and loadtxt section to session 5 day 1.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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{infolines} \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}}\newcommand{\typ}[1]{\lstinline{#1}}\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 \typ{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 mymoduleIn [2]: mymodule.test()---------------------------------------------NameError Traceback (most recent call last)<ipython console> in <module>()mymodule.py in test() 1 def test():----> 2 print spamNameError: global name 'spam' is not definedIn [3]: %debug> mymodule.py(2)test() 0 print spamipdb> \end{lstlisting}\inctime{15} \end{frame}\subsection{Exercise}\begin{frame}[fragile]\frametitle{Debugging: Exercise}\small\begin{lstlisting}import keywordf = 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 + 1print 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_palindromedef 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.001sOK\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}