%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %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 { \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: Data structures and functions} \author[FOSSEE Team] {The FOSSEE Group} \institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} \date[] {23 April, 2010\\Day 2, Session 2} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\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{Control flow} \subsection{Basic Looping} \begin{frame}[fragile] \frametitle{\typ{while}} \begin{block}{Example: Fibonacci series} Sum of previous two elements defines the next \end{block} \begin{lstlisting} In []: a, b = 0, 1 In []: 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 \typ{range()} returns a list of integers \item The \typ{start} and the \typ{step} arguments are optional \item \typ{stop} is not included in the list \end{itemize} \vspace*{.5in} \begin{block}{Documentation convention} \begin{itemize} \item \alert{Anything within \typ{[]} is optional} \item Nothing to do with Python. \end{itemize} \end{block} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{for} \ldots \typ{range()}} Example: print squares of first \typ{5} 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} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{for} \ldots \typ{range()}} Example: print squares of odd numbers from 3 to 9 \begin{lstlisting} In []: for i in range(3, 10, 2): ....: print i, i * i ....: ....: 3 9 5 25 7 49 9 81 \end{lstlisting} \inctime{5} \end{frame} \subsection{Exercises} \begin{frame}{Problem set 1: Problem 1.1} Write a program that displays all three digit numbers that are equal to the sum of the cubes of their digits. That is, print numbers $abc$ that have the property $abc = a^3 + b^3 + c^3$\\ \vspace*{0.2in} \emphbar{These are called $Armstrong$ numbers.} \end{frame} \begin{frame}{Problem 1.2 - Collatz sequence} \begin{enumerate} \item Start with an arbitrary (positive) integer. \item If the number is even, divide by 2; if the number is odd, multiply by 3 and add 1. \item Repeat the procedure with the new number. \item It appears that for all starting values there is a cycle of 4, 2, 1 at which the procedure loops. \end{enumerate} Write a program that accepts the starting value and prints out the Collatz sequence. \inctime{5} \end{frame} \section{Data structures} \subsection{Lists} \begin{frame}[fragile] \frametitle{Lists} \begin{block}{We already know that} \begin{lstlisting} num = [1, 2, 3, 4] \end{lstlisting} is a list \end{block} \end{frame} \begin{frame}[fragile] \frametitle{Lists: methods} \begin{lstlisting} In []: num = [9, 8, 2, 3, 7] In []: num + [4, 5, 6] Out[]: [9, 8, 2, 3, 7, 4, 5, 6] In []: num.append([4, 5, 6]) In []: num Out[]: [9, 8, 2, 3, 7, [4, 5, 6]] \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Lists: methods} \begin{lstlisting} In []: num = [9, 8, 2, 3, 7] In []: num.extend([4, 5, 6]) In []: num Out[]: [9, 8, 2, 3, 7, 4, 5, 6] In []: num.reverse() In []: num Out[]: [6, 5, 4, 7, 3, 2, 8, 9] In []: num.remove(6) In []: num \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Lists: slicing} \begin{itemize} \item \typ{list[initial:final]} \end{itemize} \begin{lstlisting} In []: a = [1, 2, 3, 4, 5] In []: a[1:3] Out[]: [2, 3] In []: a[1:-1] Out[]: [2, 3, 4] In []: a[:3] Out[]: [1, 2, 3] \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Lists: slicing} \begin{itemize} \item \typ{list[initial:final:step]} \end{itemize} \begin{lstlisting} In []: a[1:-1:2] Out[]: [2, 4] In []: a[::2] Out[]: [1, 3, 5] In []: a[-1::-1] Out[]: [5, 4, 3, 2, 1] \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{List containership} \emphbar{Recall \typ{num} is \typ{[9, 8, 2, 3, 7]}} \begin{lstlisting} In []: 4 in num Out[]: False In []: b = 8 In []: b in num Out[]: True In []: b not in num Out[]: False \end{lstlisting} \end{frame} \subsection{Tuples} \begin{frame}[fragile] \frametitle{Tuples: Immutable lists} \begin{lstlisting} In []: t = (1, 2, 3, 4, 5, 6, 7, 8) In []: t[0] + t[3] + t[-1] Out[]: 13 In []: t[4] = 7 \end{lstlisting} \pause \begin{block}{Note:} \begin{itemize} \item Tuples are immutable - cannot be changed \end{itemize} \end{block} \inctime{10} \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} \end{frame} \subsection{Dictionaries} \begin{frame}[fragile] \frametitle{Dictionaries: recall} \begin{lstlisting} In []: player = {'Mat': 134,'Inn': 233, 'Runs': 10823, 'Avg': 52.53} In []: player['Avg'] Out[]: 52.530000000000001 \end{lstlisting} \begin{block}{Note!} Duplicate keys $\Rightarrow$ overwritten!\\ You can iterate through a dictionary using keys. \end{block} \end{frame} \begin{frame}[fragile] \frametitle{Dictionaries: containership} \begin{lstlisting} In []: 'Inn' in player Out[]: True In []: 'Econ' in player Out[]: False \end{lstlisting} \begin{block}{Note} \begin{itemize} \item We can check for the containership of keys only \item Not values \end{itemize} \end{block} \end{frame} \begin{frame}[fragile] \frametitle{Dictionaries: methods} \begin{lstlisting} In []: player.keys() Out[]: ['Runs', 'Inn', 'Avg', 'Mat'] In []: player.values() Out[]: [10823, 233, 52.530000000000001, 134] \end{lstlisting} \end{frame} \begin{frame} {Problem Set 2.1: Problem 2.1.1} You are given date strings of the form ``29 Jul, 2009'', or ``4 January 2008''. In other words a number, a string and another number, with a comma sometimes separating the items.\\Write a program that takes such a string as input and prints a tuple (yyyy, mm, dd) where all three elements are ints. \end{frame} \subsection{Sets} \begin{frame}[fragile] \frametitle{Sets} \begin{itemize} \item Simplest container, mutable \item No ordering, no duplicates \item usual suspects: union, intersection, subset \ldots \item >, >=, <, <=, in, \ldots \end{itemize} \begin{lstlisting} In []: f10 = set([1,2,3,5,8]) In []: p10 = set([2,3,5,7]) In []: f10 | p10 Out[]: set([1, 2, 3, 5, 7, 8]) \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Set \ldots} \begin{lstlisting} In []: f10 & p10 Out[]: set([2, 3, 5]) In []: f10 - p10 Out[]: set([1, 8]) In []: p10 - f10, f10 ^ p10 Out[]: (set([7]), set([1, 7, 8])) In []: set([2,3]) < p10 Out[]: True \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Set \ldots} \begin{lstlisting} In []: set([2,3]) <= p10 Out[]: True In []: 2 in p10 Out[]: True In []: 4 in p10 Out[]: False In []: len(f10) Out[]: 5 \end{lstlisting} \end{frame} \begin{frame} \frametitle{Problem set 2.2: Problem 2.2.1} Given a dictionary of the names of students and their marks, identify how many duplicate marks are there? and what are these? \end{frame} \begin{frame} \frametitle{Problem 2.2.2} Given a list of words, find all the anagrams in the list. \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} \begin{frame} \frametitle{What did we learn?} \begin{itemize} \item Loops: \kwrd{while}, \kwrd{for} \item Advanced Data structures: \begin{itemize} \item Lists \item Tuples \item Dictionaries \item Sets \end{itemize} \item Functions \item Docstrings \end{itemize} \end{frame} \end{document} %% Questions for Quiz %% %% ------------------ %% \begin{frame} \frametitle{\incqno} How do you find the presence of an element \emph{x} in the list \emph{a}? \end{frame} \begin{frame}[fragile] \frametitle{\incqno} \begin{lstlisting} In []: set([1, 2, 8, 2, 13, 8, 9]) \end{lstlisting} What is the output? \end{frame} \begin{frame}[fragile] \frametitle{\incqno} \begin{lstlisting} In []: a = {'a': 1, 'b': 2} In []: a['a'] = 10 In []: print a \end{lstlisting} What is the output? \end{frame} \begin{frame}[fragile] \frametitle{\incqno} \begin{lstlisting} In []: for i in range(3, 10, 2): ...: print i \end{lstlisting} What is the output? \end{frame} \begin{frame}[fragile] \frametitle{\incqno} \begin{lstlisting} In []: a = [1, 2, 3] In []: a.extend([5, 6]) \end{lstlisting} What is the value of a? \end{frame} \begin{frame}[fragile] \frametitle{\incqno} \begin{lstlisting} In []: a = (1, 2, 3) In []: a[1] = 10 \end{lstlisting} What is the result? \end{frame} \begin{frame}[fragile] \frametitle{\incqno} \begin{lstlisting} def func(x, y=10): print x+1, y+10 func(1) \end{lstlisting} What is the output? \end{frame}