%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Tutorial slides on Python. % % Author: Prabhu Ramachandran % 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] % Modified from: generic-ornate-15min-45min.de.tex \mode { \usetheme{Warsaw} \useoutertheme{split} \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]{\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:\\A formal approach} \author[FOSSEE Team] {The FOSSEE Group} \institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} \date[] {1, November 2009\\Day 2, Session 1} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\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} \frametitle{Outline} \tableofcontents[currentsection,currentsubsection] \end{frame} } \AtBeginSection[] { \begin{frame} \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{Data types} \begin{frame} \frametitle{Primitive Data types} \begin{itemize} \item Numbers: float, int, complex \item Strings \item Boolean \end{itemize} \end{frame} \subsection{Numbers} \begin{frame}[fragile] \frametitle{Numbers} \begin{itemize} \item \kwrd{int}\\ Any whole number is an \kwrd{int}, no matter what the size! \begin{lstlisting} In [1]: a = 13 In [2]: b = 99999999999999999999 \end{lstlisting} \item \kwrd{float} \begin{lstlisting} In [3]: fl = 3.141592 \end{lstlisting} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Complex numbers} \begin{lstlisting} In [1]: cplx = 3+4j In [2]: abs(cplx) Out[2]: 5.0 In [3]: cplx.imag Out[3]: 4.0 In [4]: cplx.real Out[4]: 3.0 \end{lstlisting} \end{frame} \subsection{Boolean} \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{Strings} Strings were introduced previously, let us now look at them in a little more detail. \begin{lstlisting} 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 () 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} \begin{itemize} \item We saw split() yesterday \item join() is the opposite of split() \end{itemize} \begin{lstlisting} In [1]: ''.join(['a', 'b', 'c']) Out[1]: 'abc' \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{String formatting} \begin{lstlisting} 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} \emphbar{ \url{http://docs.python.org/library/stdtypes.html}\\ } \inctime{10} \end{frame} \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) / in () 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 [1]: pos, zer, neg = 1, 0, -1 In [2]: pos == neg Out[2]: False In [3]: pos >= neg Out[3]: True In [4]: neg < zer < pos Out[4]: True In [5]: pos + neg != zer Out[5]: False \end{lstlisting} \inctime{5} \end{frame} \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} \begin{frame} {A classic problem} \begin{block} {Interchange values} How to interchange values of two variables? \end{block} \pause \begin{block}{Note:} This Python idiom works for all types of variables.\\ They need not be of the same type! \end{block} \inctime{10} \end{frame} \section{Simple IO} \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} \section{Control flow} \begin{frame} \frametitle{Control flow constructs} \begin{itemize} \item \kwrd{if/elif/else}: branching \item \kwrd{while}: looping \item \kwrd{for}: iterating \item \kwrd{break, continue}: modify loop \item \kwrd{pass}: syntactic filler \end{itemize} \end{frame} \subsection{Basic Conditional flow} \begin{frame}[fragile] \frametitle{\typ{If...elif...else} example} \begin{lstlisting} x = int(raw_input("Enter an integer:")) if x < 0: print 'Be positive!' elif x == 0: print 'Zero' elif x == 1: print 'Single' else: print 'More' \end{lstlisting} \end{frame} \subsection{Basic Looping} \begin{frame}[fragile] \frametitle{\typ{while}} Example: Fibonacci series \begin{lstlisting} # the sum of two elements # defines the next a, b = 0, 1 while b < 10: print b, a, b = b, a + b \end{lstlisting} \typ{1 1 2 3 5 8}\\ \end{frame} \begin{frame}[fragile] \frametitle{\typ{range()}} \kwrd{range([start,] stop[, step])}\\ \begin{itemize} \item \alert {range() returns a list of integers} \item \alert {The start and the step arguments are optional} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{\typ{for} \ldots \typ{range()}} Example: print squares of first \typ{n} numbers \begin{lstlisting} In []: for i in range(5): ....: print i, i * i ....: ....: 0 0 1 1 2 4 3 9 4 16 \end{lstlisting} \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} \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} \end{frame} \section{Dictionaries} \begin{frame}[fragile] \frametitle{Dictionary: Recall} \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 \end{lstlisting} \begin{itemize} \item Duplicate keys are not allowed! \item Dictionaries are iterable through keys. \end{itemize} \end{frame} \end{document}