diff options
Diffstat (limited to 'day2/session5.tex')
-rw-r--r-- | day2/session5.tex | 563 |
1 files changed, 461 insertions, 102 deletions
diff --git a/day2/session5.tex b/day2/session5.tex index ddb1599..577841f 100644 --- a/day2/session5.tex +++ b/day2/session5.tex @@ -1,33 +1,48 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%Tutorial slides on Python. +% Tutorial slides on Python. % % Author: Prabhu Ramachandran <prabhu at aero.iitb.ac.in> % Copyright (c) 2005-2009, Prabhu Ramachandran %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\documentclass[14pt,compress]{beamer} -%\documentclass[draft]{beamer} -%\documentclass[compress,handout]{beamer} -%\usepackage{pgfpages} -%\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm] +\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 + -% Modified from: generic-ornate-15min-45min.de.tex \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{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} @@ -40,50 +55,65 @@ keywordstyle=\color{blue}\bfseries} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Macros +% 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}{\tiny \thetime\ m}} +\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\vspace*{0.1in}\tiny \thetime\ m}} -\newcommand{\typ}[1]{\texttt{#1}} +\newcommand\BackgroundPicture[1]{% + \setbeamertemplate{background}{% + \parbox[c][\paperheight]{\paperwidth}{% + \vfill \hfill + \hfill \vfill +}}} -\newcommand{\kwrd}[1]{ \texttt{\textbf{\color{blue}{#1}}} } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Configuring the theme +%\setbeamercolor{normal text}{fg=white} +%\setbeamercolor{background canvas}{bg=black} -%%% This is from Fernando's setup. -% \usepackage{color} -% \definecolor{orange}{cmyk}{0,0.4,0.8,0.2} -% % Use and configure listings package for nicely formatted code -% \usepackage{listings} -% \lstset{ -% language=Python, -% basicstyle=\small\ttfamily, -% commentstyle=\ttfamily\color{blue}, -% stringstyle=\ttfamily\color{orange}, -% showstringspaces=false, -% breaklines=true, -% postbreak = \space\dots -% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Title page -\title[Exercises]{Exercises} +\title[Python Development]{Python Development} \author[FOSSEE] {FOSSEE} \institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} -\date[] {1 November, 2009\\Day 2, Session 4} +\date[] {1 November, 2009\\Day 2, Session 3} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%\pgfdeclareimage[height=0.75cm]{iitmlogo}{iitmlogo} -%\logo{\pgfuseimage{iitmlogo}} +%\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: @@ -95,109 +125,438 @@ \end{frame} } - -% If you wish to uncover everything in a step-wise fashion, uncomment -% the following command: -%\beamerdefaultoverlayspecification{<+->} - -%\includeonlyframes{current,current1,current2,current3,current4,current5,current6} - +\AtBeginSection[] +{ + \begin{frame}<beamer> + \frametitle{Outline} + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % DOCUMENT STARTS \begin{document} \begin{frame} - \titlepage + \maketitle \end{frame} -\begin{frame}{Problem 1.1} - The aliquot of a number is defined as: the sum of the \emph{proper} divisors of the number. \\For example: -\center{aliquot(12) = 1 + 2 + 3 + 4 + 6 = 16.}\\ - Write a function that returns the aliquot number of a given number. +\section{Tests: Getting started} +\begin{frame}[fragile] + \frametitle{gcd revisited!} + \begin{itemize} + \item Open gcd.py + \end{itemize} +\begin{lstlisting} + def gcd(a, b): + if a % b == 0: + return b + return gcd(b, a%b) + + print gcd(15, 65) + print gcd(16, 76) +\end{lstlisting} + \begin{itemize} + \item python gcd.py + \end{itemize} \end{frame} -\begin{frame}{Problem 1.2} - Pair of numbers (a, b) is said to be \alert{amicable} if aliquot number of a is b and aliquot number of b is a.\\ - Example: \texttt{220, 284}\\ - Write a program that prints all four digit amicable pairs. - -\inctime{20} +\begin{frame}[fragile] + \frametitle{Find lcm using our gcd module} + \begin{itemize} + \item Open lcm.py + \item $lcm = \frac{a*b}{gcd(a,b)}$ + \end{itemize} +\begin{lstlisting} + from gcd import gcd + def lcm(a, b): + return (a * b) / gcd(a, b) + + print lcm(14, 56) +\end{lstlisting} + \begin{itemize} + \item python lcm.py + \end{itemize} + \begin{lstlisting} +5 +4 +56 + \end{lstlisting} \end{frame} -%% \begin{frame}{Problem 2} -%% Given an empty chessboard and one Bishop placed in any s%quare, say (r, c), generate the list of all squares the Bi%shop could move to. - -%% \end{frame} +\begin{frame}[fragile] + \frametitle{Writing stand-alone module} +Edit gcd.py file to: +\begin{lstlisting} + def gcd(a, b): + if a % b == 0: + return b + return gcd(b, a%b) + + if __name__ == "__main__": + print gcd(15, 65) + print gcd(16, 76) +\end{lstlisting} + \begin{itemize} + \item python gcd.py + \item python lcm.py + \end{itemize} +\end{frame} \begin{frame}[fragile] - \frametitle{Problem Set 2} - Given a string like, ``1, 3-7, 12, 15, 18-21'', produce the list \\ + \frametitle{More use of main} + For automating tests. + \begin{lstlisting} +if __name__ == '__main__': + for line in open('numbers.txt'): + numbers = line.split() + x = int(numbers[0]) + y = int(numbers[1]) + result = (int(numbers[2])) + assert gcd(x, y) == result + \end{lstlisting} +\end{frame} + +\section{Coding Style} +\begin{frame}{Readability and Consistency} + \begin{itemize} + \item Readability Counts!\\Code is read more often than its written. + \item Consistency! + \item Know when to be inconsistent. + \end{itemize} +\end{frame} + +\begin{frame}[fragile] \frametitle{A question of good style} \begin{lstlisting} - [1,3,4,5,6,7,12,15,18,19,20,21] + amount = 12.68 + denom = 0.05 + nCoins = round(amount/denom) + rAmount = nCoins * denom \end{lstlisting} -\inctime{10} + \pause + \begin{block}{Style Rule \#1} + Naming is 80\% of programming + \end{block} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Code Layout} + \begin{itemize} + \item Indentation + \item Tabs or Spaces?? + \item Maximum Line Length + \item Blank Lines + \item Encodings + \end{itemize} +\end{frame} + +\begin{frame}{Whitespaces in Expressions} + \begin{itemize} + \item When to use extraneous whitespaces?? + \item When to avoid extra whitespaces?? + \item Use one statement per line + \end{itemize} +\end{frame} + +\begin{frame}{Comments} + \begin{itemize} + \item No comments better than contradicting comments + \item Block comments + \item Inline comments + \end{itemize} \end{frame} -\begin{frame} - \frametitle{Problem Set 3} - \begin{description} - \item[3.1] Count word frequencies in a file. -\end{description} +\begin{frame}{Docstrings} + \begin{itemize} + \item When to write docstrings? + \item Ending the docstrings + \item One liner docstrings + \end{itemize} +More information at PEP8: http://www.python.org/dev/peps/pep-0008/ \inctime{5} \end{frame} +\section{Debugging} +\subsection{Errors and Exceptions} \begin{frame}[fragile] - \frametitle{Problem set 4} - Central difference - \begin{equation*} - \frac{sin(x+h)-sin(x-h)}{2h} - \end{equation*} + \frametitle{Errors} + \begin{lstlisting} +In []: while True print 'Hello world' + \end{lstlisting} +\pause \begin{lstlisting} - In []: x = linspace(0, 2*pi, 100) - In []: y = sin(x) - In []: deltax = x[1] - x[0] + File "<stdin>", line 1, in ? + while True print 'Hello world' + ^ +SyntaxError: invalid syntax +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Exceptions} + \begin{lstlisting} +In []: 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} +In []: 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} + +\begin{frame}[fragile] + \frametitle{Handling Exceptions} + Python uses \typ{try} and \typ{except} clause. + %%Revisiting the raw\_input + \begin{lstlisting} +a = raw_input('Enter number(Q to quit):') +try: + num = int(a) + print num +except: + if a == 'Q': + print 'Exiting...' + else: + print 'Wrong input!' \end{lstlisting} - \pause - \begin{enumerate} - \item Given this, get the finite difference of sin in the range 0 to 2*pi - \end{enumerate} + + \end{frame} -\begin{frame} - \frametitle{Problem Set 5} - \begin{itemize} - \item[5.1] Write a function that plots any regular n-gon given \typ{n}. - \item[5.2] Consider the logistic map, $f(x) = kx(1-x)$, plot it for - $k=2.5, 3.5$ and $4$ in the same plot. -\end{itemize} +%% \begin{frame}[fragile] +%% \frametitle{Solving it with \typ{try} and \typ{except}} +%% \vspace{-0.2in} +%% \begin{lstlisting} +%% highest = 0 +%% for record in open('sslc1.txt'): +%% fields = record.split(';') +%% try: +%% total = 0 +%% for score_str in fields[3:8]: +%% score = int(score_str) +%% total += score +%% if total > highest: +%% highest = total +%% except: +%% pass +%% print highest +%% \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{Problem Set 5} - \begin{columns} - \column{0.6\textwidth} - \small{ +\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 []: import mymodule +In []: 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 []: %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} +science = {} + +for record in open('sslc1.txt'): + fields = record.split(';') + region_code = fields[0].strip() + + score_str = fields[6].strip() + score = int(score_str) if score_str != 'AA' + else 0 + + if score > 90: + science[region_code] += 1 + +pie(science.values(), labels=science.keys()) +savefig('science.png') +\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 for Testing!} + \begin{itemize} - \item[3] Consider the iteration $x_{n+1} = f(x_n)$ where $f(x) = kx(1-x)$. Plot the successive iterates of this process as explained below. - \end{itemize}} - \column{0.35\textwidth} - \hspace*{-0.5in} - \includegraphics[height=1.6in, interpolate=true]{data/cobweb} -\end{columns} + \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} +def test_function_normal_words(): + input = "noon" + assert is_palindrome(input) == True + +if __name__ == "main'': + test_function_normal_words() +\end{lstlisting} \end{frame} +\begin{frame}[fragile] + \frametitle{Running the tests.} +\begin{lstlisting} +$ nosetests palindrome.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 palindrome.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{Problem Set 5.3} - Plot the cobweb plot as follows: - \begin{enumerate} - \item Start at $(x_0, 0)$ ($\implies$ i=0) - \item Draw a line to $(x_i, f(x_i))$ - \item Set $x_{i+1} = f(x_i)$ - \item Draw a line to $(x_{i+1}, x_{i+1})$ - \item $(i\implies i+1)$ - \item Repeat from 2 for as long as you want - \end{enumerate} -\inctime{20} + \frametitle{Summary} +We have coverd: + \begin{itemize} + \item Following and Resolving Error Messages. + \item Exceptions. + \item Handling exceptions + \item Approach for Debugging. + \item Writting and running tests. + \end{itemize} \end{frame} \end{document} |