%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Tutorial slides on Python.
%
% Author: FOSSEE 
% Copyright (c) 2009, FOSSEE, IIT Bombay
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\documentclass[14pt,compress]{beamer}
%\documentclass[draft]{beamer}
%\documentclass[compress,handout]{beamer}
%\usepackage{pgfpages} 
%\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm]

% Modified from: generic-ornate-15min-45min.de.tex
\mode<presentation>
{
  \usetheme{Warsaw}
  \useoutertheme{infolines}
  \setbeamercovered{transparent}
}

\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}

\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}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Macros
\setbeamercolor{emphbar}{bg=blue!20, fg=black}
\newcommand{\emphbar}[1]
{\begin{beamercolorbox}[rounded=true]{emphbar} 
      {#1}
 \end{beamercolorbox}
}
\newcounter{time}
\setcounter{time}{0}
\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\tiny \thetime\ m}}

\newcommand{\typ}[1]{\lstinline{#1}}

\newcommand{\kwrd}[1]{ \texttt{\textbf{\color{blue}{#1}}}  }

%%% 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[Basic Python]{Python language: Functions, modules and objects}

\author[FOSSEE Team] {The FOSSEE Group}

\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
\date[] {1 May, 2010\\Day 2, Session 3}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%\pgfdeclareimage[height=0.75cm]{iitmlogo}{iitmlogo}
%\logo{\pgfuseimage{iitmlogo}}


%% 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}
}

% If you wish to uncover everything in a step-wise fashion, uncomment
% the following command: 
%\beamerdefaultoverlayspecification{<+->}

%\includeonlyframes{current,current1,current2,current3,current4,current5,current6}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DOCUMENT STARTS
\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}
  \frametitle{Outline}
  \tableofcontents
  % You might wish to add the option [pausesections]
\end{frame}

\section{Functions}
\subsection{Default arguments}
\begin{frame}[fragile]
  \frametitle{Functions: default arguments}
  \begin{lstlisting}
In []: greet = 'hello world'

In []: greet.split()
Out[]: ['hello', 'world']

In []: line = 'Rossum, Guido, 54, 46, 55'

In []: line.split(',')
Out[]: ['Rossum', ' Guido', ' 54',
                        ' 46', ' 55']
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Functions: default arguments \ldots}
  \begin{lstlisting}
In []: def welcome(greet, name="World"):
  ....     print greet, name

In []: welcome("Hello")
Hello World

In []: welcome("Hi", "Guido")
Hi Guido
  \end{lstlisting}
\end{frame} 

\subsection{Keyword arguments}
\begin{frame}[fragile]
  \frametitle{Functions: Keyword arguments}
We have seen the following
\begin{lstlisting}
legend(['sin(2y)'], loc = 'center')

plot(y, sin(y), 'g', linewidth = 2)

annotate('local max', xy = (1.5, 1))

pie(science.values(), 
            labels = science.keys())
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Functions: keyword arguments \ldots}
  \begin{lstlisting}
In []: def welcome(greet, name="World"):
  ....     print greet, name

In []: welcome("Hello", "James")
Hello James

In []: welcome("Hi", name="Guido")
Hi Guido

In []: welcome(name="Guido", greet="Hey")
Hey Guido
  \end{lstlisting}
\end{frame}

\subsection{Built-in functions}
\begin{frame}
  {Before writing a function}
  \begin{itemize}
      \item Variety of built-in functions are available
      \item \typ{abs, any, all, len, max, min}
      \item \typ{pow, range, sum, type}
      \item Refer here:
          \url{http://docs.python.org/library/functions.html}
  \end{itemize}
  \inctime{10} 
\end{frame}

\subsection{Exercises}
\begin{frame}{Problem set 3: Problem 3.1}
  Write a function to return the gcd of two numbers.
\end{frame}

\begin{frame}{Problem 3.2}
Write a program to print all primitive pythagorean triads (a, b, c) where a, b are in the range 1---100 \\
A pythagorean triad $(a,b,c)$ has the property $a^2 + b^2 = c^2$.\\By primitive we mean triads that do not `depend' on others. For example, (4,3,5) is a variant of (3,4,5) and hence is not primitive. And (10,24,26) is easily derived from (5,12,13) and is also not primitive.
\end{frame}

\begin{frame}{Problem 3.3}
  Write a program that generates a list of all four digit numbers that have all their digits even and are perfect squares.\newline\\\emph{For example, the output should include 6400 but not 8100 (one digit is odd) or 4248 (not a perfect square).}

\inctime{15}
\end{frame}

\section{Modules}
\begin{frame}[fragile]
  \frametitle{\texttt{from} \ldots \texttt{import} magic}
  \begin{lstlisting}
from scipy.integrate import odeint

from scipy.optimize import fsolve
  \end{lstlisting}
\emphbar{Above statements import a function to our namespace}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Running scripts from command line}
  \small
  \begin{itemize}
    \item Fire up a terminal
    \item python four\_plot.py
  \end{itemize}
  \pause
  \begin{lstlisting}
Traceback (most recent call last):
  File "four_plot.py", line 1, in <module>
    x = linspace(-5*pi, 5*pi, 500)
NameError: name 'linspace' is not defined
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Remedy \ldots}
  \begin{lstlisting}
from scipy import *
  \end{lstlisting}
\alert{Now run python four\_plot.py again}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Now what?}
  \begin{lstlisting}
Traceback (most recent call last):
  File "four_plot.py", line 1, in <module>
    x = plot(x, x, 'b')
NameError: name 'plot' is not defined
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Remedy \ldots}
  \begin{lstlisting}
from pylab import *
  \end{lstlisting}
\alert{Now run python four\_plot.py again!!}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Modules}
  \begin{itemize}
    \item The \kwrd{import} keyword ``loads'' a module
    \item One can also use:
      \begin{lstlisting}
In []: from scipy import *
In []: from scipy import linspace
      \end{lstlisting}    
    \item What is the difference?
    \item \alert{Use the former only in interactive mode}
    \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{IPython namespace}
  \begin{lstlisting}

In [4]: whos
Interactive namespace is empty.

  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{IPython namespace}
  \begin{lstlisting}

In [5]: from numpy import *

In [6]: whos

  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Package hierarchies}
  \begin{lstlisting}
from scipy.integrate import odeint

from scipy.optimize import fsolve
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{\texttt{from} \ldots \texttt{import} - conventional way!}
  \small
  \begin{lstlisting}
from scipy import linspace, pi, sin
from pylab import plot, legend, annotate
from pylab import xlim, ylim

x = linspace(-5*pi, 5*pi, 500)
plot(x, x, 'b')
plot(x, -x, 'b')
plot(x, sin(x), 'g', linewidth=2)
plot(x, x*sin(x), 'r', linewidth=3)
legend(['x', '-x', 'sin(x)', 'xsin(x)'])
annotate('origin', xy = (0, 0))
xlim(-5*pi, 5*pi)
ylim(-5*pi, 5*pi)
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{\texttt{from} \ldots \texttt{import} - conventional way!}
  \small
  \begin{lstlisting}
import scipy
import pylab

x = scipy.linspace(-5*scipy.pi, 5*scipy.pi, 500)
pylab.plot(x, x, 'b')
pylab.plot(x, -x, 'b')
pylab.plot(x, scipy.sin(x), 'g', linewidth=2)
pylab.plot(x, x*scipy.sin(x), 'r', linewidth=3)
pylab.legend(['x', '-x', 'sin(x)', 'xsin(x)'])
pylab.annotate('origin', xy = (0, 0))
pylab.xlim(-5*scipy.pi, 5*scipy.pi)
pylab.ylim(-5*scipy.pi, 5*scipy.pi)
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]
  \frametitle{\texttt{import} - the community convention}
  \begin{lstlisting}

import numpy as np
np.linspace(-5 * np.pi, 5 * np.pi, 500)

import scipy as sp
sp.linspace(-5 * sp.pi, 5 * sp.pi, 500)

  \end{lstlisting}
\end{frame}

\begin{frame}
  \frametitle{Modules: Standard library}
  \begin{itemize}
  \item Very powerful, ``Batteries included''
  \item Some standard modules:
    \begin{itemize}
    \item Math: \typ{math}, \typ{random}
    \item Internet access: \typ{urllib2}, \typ{smtplib}
    \item System, Command line arguments: \typ{sys}
    \item Operating system interface: \typ{os}
    \item Regular expressions: \typ{re}
    \item Compression: \typ{gzip}, \typ{zipfile}, and \typ{tarfile}
    \item And a whole lot more!
    \end{itemize}
  \item Check out the Python Library reference:
    \url{http://docs.python.org/library/}
  \end{itemize}
\inctime{5}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Modules of special interest}
  \begin{description}[matplotlibfor2d]
    \item[\texttt{pylab}] Easy, interactive, 2D plotting

    \item[\texttt{scipy}] arrays, statistics, optimization, integration, linear
            algebra, Fourier transforms, signal and image processing,
            genetic algorithms, ODE solvers, special functions, and more

    \item[\texttt{Mayavi}] Easy, interactive, 3D plotting
  \end{description}
\end{frame}

\begin{frame}[fragile]
  \frametitle{From which module?}
  
This plot function in pylab is cool, 
from where do I import it to include it in 
my\_nifty\_module.py?
  
\end{frame}

\begin{frame}[fragile]
  \frametitle{From which module?}
  \begin{lstlisting}
   
In [15]: plot.__module__
Out[15]: 'matplotlib.pyplot'

from matplotlib.pyplot import plot

  \end{lstlisting}
\end{frame}

\section{Objects}
\begin{frame}{Everything is an Object!}
  \begin{itemize}
    \item \typ{int}
    \item \typ{float}
    \item \typ{str}
    \item \typ{list}
    \item \typ{tuple}
    \item \typ{string}
    \item \typ{dictionary}
    \item \typ{function}
    \item User defined class is also an object!
  \end{itemize}
\end {frame}

\begin{frame}[fragile]
\frametitle{Using Objects}
  \begin{itemize}
    \item Creating Objects
    \begin{itemize}
      \item Initialization
    \end{itemize}
    \begin{lstlisting}
In []: a = str()

In []: b = "Hello World"
    \end{lstlisting}
    \item Object Manipulation
    \begin{itemize}
      \item Object methods
      \item ``.'' operator
    \end{itemize}
  \begin{lstlisting}
In []: "Hello World".split()
Out[]: ['Hello', 'World']
    \end{lstlisting}
  \end{itemize}
\end{frame}

\begin{frame}[fragile]
  \frametitle{Objects provide consistency}
  \small
  \begin{lstlisting}
for element in (1, 2, 3):
    print element
for key in {'one':1, 'two':2}:
    print key
for char in "123":
    print char
for line in open("myfile.txt"):
    print line
for line in urllib2.urlopen('http://site.com'):
    print line
  \end{lstlisting}
  \inctime{10}
\end{frame}

\begin{frame}
  \frametitle{What did we learn?}
  \begin{itemize}
    \item Functions: Default and Keyword arguments
    \item Modules
    \item Objects
  \end{itemize}
\end{frame}

\end{document}

%% Questions for Quiz %%
%% ------------------ %%

\begin{frame}
    \frametitle{\incqno}
  How many items can a function return?
\end{frame}
