\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} \usepackage{pgf} % Taken from Fernando's slides. \usepackage{ae,aecompl} \usepackage{mathpazo,courier,euler} \usepackage[scaled=.95]{helvet} \usepackage{amsmath} \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} } \newcommand{\myemph}[1]{\structure{\emph{#1}}} \newcommand{\PythonCode}[1]{\lstinline{#1}} \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}}} } \newcommand\BackgroundPicture[1]{% \setbeamertemplate{background}{% \parbox[c][\paperheight]{\paperwidth}{% \vfill \hfill \pgfimage[width=1.0\paperwidth,height=1.0\paperheight]{#1} \hfill \vfill }}} % For non-wide pictures, set the width so that the height scales % appropriately. \newcommand\BackgroundPictureWidth[1]{% \setbeamertemplate{background}{% \parbox[c][\paperheight]{\paperwidth}{% \vfill \hfill \pgfimage[width=1.0\paperwidth]{#1} \hfill \vfill }}} % For shorter pictures, set the height so that the width scales % appropriately. \newcommand\BackgroundPictureHeight[1]{% \setbeamertemplate{background}{% \parbox[c][\paperheight]{\paperwidth}{% \vfill \hfill \pgfimage[height=1.0\paperheight]{#1} \hfill \vfill }}} %%% 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[Better code]{Introductory Scientific Computing with Python} \subtitle{Writing better code} \author{FOSSEE} \institute[FOSSEE -- IITB] {Department of Aerospace Engineering\\IIT Bombay} \date[] { Mumbai, India } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\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} \maketitle \end{frame} \begin{frame} \frametitle{Basic tools} \begin{itemize} \item Use a good editor \item Master it \end{itemize} \end{frame} \begin{frame} \frametitle{Editor features} \begin{itemize} \item Command completion \item Documentation \item PEP8 \item Linting support \item Jump to source \item Integration with IPython (bonus) \end{itemize} \end{frame} \begin{frame} \frametitle{Other handy command line tools} \begin{itemize} \item Don't hesitate to read code \item Learn git and use it \end{itemize} \end{frame} \begin{frame} \frametitle{The purpose of programming} \Large \begin{quote} Programs must be written for people to read, \vspace*{0.5in} \pause and only incidentally for machines to execute. \hfill -- Harold Abelson, SICP \end{quote} \end{frame} \begin{frame} \frametitle{Simple guidelines} \begin{itemize} \item Name things well \item Code should be a pleasure to read \item Comments should be superfluous (remove!) \end{itemize} \end{frame} \begin{frame}[fragile,fragile] \frametitle{Bad variable names} \begin{lstlisting} a = ('jan feb mar apr may jun jul ' 'aug sep oct nov dec').split() d = {} for i in range(len(a)): d[a[i]] = i + 1 i = input()[:3].lower() print(d[i]) \end{lstlisting} \end{frame} \begin{frame}[fragile,fragile] \frametitle{Better variable names} \begin{lstlisting} months = ('jan feb mar apr may jun jul' ' aug sep oct nov dec').split() month2mm = {} for i in range(len(months)): month2mm[months[i]] = i + 1 month = input()[:3].lower() print(month2mm[month]) \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Remove superfluous comments} \begin{lstlisting} # Store month names. months = ('jan feb mar apr may jun jul' ' aug sep oct nov dec').split() # A dict to map the names to ints month2mm = {} for i in range(len(months)): month2mm[months[i]] = i + 1 # Get input from user. month = input()[:3].lower() print(month2mm[month]) \end{lstlisting} \end{frame} \begin{frame} \frametitle{Signs} \begin{itemize} \item A comment signals that things can be clearer \item Cut pasting: begs refactoring and reuse \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Comments} \begin{lstlisting} # Initializing arrays. x, y = np.mgrid[0:1:64j, 0:1:64j] phi = sin(x*x + y*y) # Solving equations for i in range(64): for j in range(64): # ... # Plot results. plt.contourf(phi) # ... \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Use functions} \begin{lstlisting} def initialize(n=64): x, y = np.mgrid[0:1:64j, 0:1:64j] return sin(x*x + y*y) def solve(phi): for i in range(64): for j in range(64): # ... def plot(phi): plt.contourf(phi) \end{lstlisting} \end{frame} \begin{frame} \frametitle{Reusable code} \begin{itemize} \item Refactor into functions \item Each function does one thing well \item Small functions \item Convert \lstinline{input}s to function + args/kwargs \end{itemize} \end{frame} \begin{frame} \frametitle{DRY} \begin{center} Don't Repeat Yourself \end{center} \end{frame} \begin{frame} \frametitle{Don't be overwhelmed} \begin{itemize} \item Start writing \item Don't let the rules dictate terms \item Use these as a guideline \item Remember that coding is iterative \item You should be comfortable throwing code away \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Summary} \begin{itemize} \item Learned how to use basic Python \item Builtin Python data structures \item IPython, numpy, scipy, jupyter notebooks \end{itemize} \end{frame} \begin{frame} \frametitle{What next?} \begin{itemize} \item Only covered the basics \item Read the official Python tutorial: \url{docs.python.org/tutorial/} \item Advanced Python course \item Additional topics \end{itemize} \end{frame} \begin{frame} \centering \Huge Thank you! \end{frame} \end{document} \end{document}