Moved exercises and other minor changes in day2/session3.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%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]{\textbf{\texttt{#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[] {SciPy.in 2010, Tutorials}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\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}
\begin{frame}[fragile]
\frametitle{Functions}
\begin{itemize}
\item \kwrd{def} - keyword to define a function
\item Arguments are local to a function
\item Functions can return multiple values
\end{itemize}
\end{frame}
\begin{frame}[fragile]
\frametitle{Functions: example}
\begin{lstlisting}
def signum( r ):
"""returns 0 if r is zero
-1 if r is negative
+1 if r is positive"""
if r < 0:
return -1
elif r > 0:
return 1
else:
return 0
\end{lstlisting}
\emphbar{Note docstrings}
\end{frame}
\begin{frame}[fragile]
\frametitle {What does this function do?}
\begin{lstlisting}
def what( n ):
if n < 0: n = -n
while n > 0:
if n % 2 == 1:
return False
n /= 10
return True
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
{What does this function do?}
\begin{lstlisting}
def what( n ):
i = 1
while i * i < n:
i += 1
return i * i == n, i
\end{lstlisting}
\end{frame}
\begin{frame}[fragile]
\frametitle {What does this function do?}
\begin{lstlisting}
def what( x, n ):
if n < 0:
n = -n
x = 1.0 / x
z = 1.0
while n > 0:
if n % 2 == 1:
z *= x
x *= x
n /= 2
return z
\end{lstlisting}
\end{frame}
\subsection{Exercises}
\begin{frame}{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}
\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}
\section{Modules}
\begin{frame}[fragile]
\frametitle{\typ{from} \ldots \typ{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{\typ{from} \ldots \typ{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{\typ{from} \ldots \typ{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{\typ{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[\typ{pylab}] Easy, interactive, 2D plotting
\item[\typ{scipy}] arrays, statistics, optimization, integration, linear
algebra, Fourier transforms, signal and image processing,
genetic algorithms, ODE solvers, special functions, and more
\item[\typ{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: Definition
\item Functions: Docstrings
\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}