summaryrefslogtreecommitdiff
path: root/basic_python/08_practice_functions.tex
diff options
context:
space:
mode:
Diffstat (limited to 'basic_python/08_practice_functions.tex')
-rw-r--r--basic_python/08_practice_functions.tex357
1 files changed, 357 insertions, 0 deletions
diff --git a/basic_python/08_practice_functions.tex b/basic_python/08_practice_functions.tex
new file mode 100644
index 0000000..d71168c
--- /dev/null
+++ b/basic_python/08_practice_functions.tex
@@ -0,0 +1,357 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Tutorial slides on Python.
+%
+% Author: FOSSEE
+% Copyright (c) 2017, FOSSEE, IIT Bombay
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\documentclass[14pt,compress]{beamer}
+
+\input{macros.tex}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Title page
+\title[Basic Python]{Practice exercises: functions}
+
+\author[FOSSEE Team] {The FOSSEE Group}
+
+\institute[FOSSEE -- IITB] {Department of Aerospace Engineering\\IIT Bombay}
+\date[] {Mumbai, India}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% DOCUMENT STARTS
+\begin{document}
+
+\begin{frame}
+ \titlepage
+\end{frame}
+
+\begin{frame}[fragile,plain]
+ \frametitle{Note: Python 2.x and 3.x}
+
+ If you are using Python 2.x
+ \begin{itemize}
+ \item Use \typ{raw\_input} instead of \typ{input}
+ \item Use the following for \typ{print}
+ \end{itemize}
+ \begin{lstlisting}
+from __future__ import print_function
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain]
+ \frametitle{Exercise: function without arguments}
+ \begin{enumerate}
+ \item Define a function called \typ{prompt}
+ \item The function should ask the user to enter their name (no prompt)
+ \item The function should not take any arguments
+ \item The function should not return anything
+ \item The function should print \typ{Hello <name>}
+ \end{enumerate}
+ For example if the user enters \typ{Sam}, print:
+ Hello Sam
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Solution}
+\begin{lstlisting}
+ def prompt():
+ name = input()
+ print('Hello', name)
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain]
+ \frametitle{Exercise: function with one argument}
+ \begin{enumerate}
+ \item Define a function called \typ{prompt}
+ \item The function should take a single string argument
+ \item \textbf{Do not ask the user for input, i.e. do not use input}
+ \item The function should not return anything
+ \item The function should print \typ{Hello <name>}
+ \end{enumerate}
+ For example if the function is passed \typ{'Sam'}, print:
+ Hello Sam
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Solution}
+\begin{lstlisting}
+ def prompt(name):
+ print('Hello', name)
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[plain,fragile]
+ \frametitle{Exercise: function with \typ{return}}
+ \begin{enumerate}
+ \item Define a function called \typ{prompt}
+ \item The function should take a single string argument
+ \item The function should return a string with \typ{'Hello'}
+ \item \textbf{Do not use input}
+ \item \textbf{Do not print anything}
+ \end{enumerate}
+ For example if the function is passed \typ{'Sam'}, return:
+ \begin{lstlisting}
+ 'Hello Sam'
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Solution}
+\begin{lstlisting}
+ def prompt(name):
+ return 'Hello ' + name
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain]
+ \frametitle{Exercise: function with two args}
+ \begin{enumerate}
+ \item Define a function called \typ{add}
+ \item The function should take two arguments
+ \item The function should return the sum of the two arguments
+ \item \textbf{Do not use input}
+ \item \textbf{Do not print anything}
+ \end{enumerate}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Solution}
+\begin{lstlisting}
+ def add(a, b):
+ return a + b
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain]
+ \frametitle{Exercise: function returning boolean}
+ \begin{enumerate}
+ \item Define a function called \typ{is\_even}
+ \item The function should take a single integer argument
+ \item The function should return \typ{True} if the number is even and \typ{False} otherwise
+ \item \textbf{Do not use input}
+ \item \textbf{Do not print anything}
+ \end{enumerate}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Naive Solution}
+\begin{lstlisting}
+ def is_even(x):
+ if x%2 == 0:
+ return True
+ else:
+ return False
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Elegant Solution}
+\begin{lstlisting}
+ def is_even(x):
+ return x%2 == 0
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain,fragile]
+ \frametitle{Exercise: function returning two values}
+ \begin{enumerate}
+ \item Define a function called \typ{even\_square}
+ \item The function should take a single argument
+ \item The function should return if the number is even and the square of the number
+ \item \textbf{Do not use input}
+ \item \textbf{Do not print anything}
+ \end{enumerate}
+ For example:
+ \begin{lstlisting}
+ In []: even_square(2)
+ Out[]: (True, 4)
+ In []: even_square(3)
+ Out[]: (False, 9)
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+ \frametitle{Solution}
+ \begin{lstlisting}
+ def even_square(x):
+ return x%2 == 0, x*x
+ \end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[plain,fragile]
+ \frametitle{Exercise: default arguments}
+ \begin{enumerate}
+ \item Define a function called \typ{greet}
+ \item The function should take one positional argument, \typ{name}
+ \item The function should take one optional argument, \typ{message}
+ \item If \typ{message} is not given, it should default to \typ{'Hello'}
+ \item It should return the string with the greeting
+ \end{enumerate}
+ For example:
+ \begin{lstlisting}
+ In []: greet('Sam')
+ Out[]: 'Hello Sam'
+ In []: greet('Sam', 'Hi')
+ Out[]: 'Hi Sam'
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+ \frametitle{Solution}
+ \begin{lstlisting}
+ def greet(name, message='Hello'):
+ return message + ' ' + name
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain, fragile]
+ \frametitle{Exercise: functions and lists}
+ \begin{enumerate}
+ \item Define a function called \typ{to\_lower}
+ \item The function should take a single list of strings
+ \item The function should return the list of strings but all in lowercase
+ \item \textbf{Do not use input}
+ \item \textbf{Do not print anything}
+ \end{enumerate}
+ For example:
+ \begin{lstlisting}
+In []: to_lower(['I', 'am', 'Batman'])
+Out[]: ['i', 'am', 'batman']
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Solution}
+\begin{lstlisting}
+ def to_lower(data):
+ result = []
+ for x in data:
+ result.append(x.lower())
+ return result
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain,fragile]
+ \frametitle{Exercise: list of Fibonacci}
+ \begin{enumerate}
+ \item Define a function called \typ{fib} taking one argument \typ{n}
+ \item Where, \typ{n>0} is an integer but defaults to 8
+ \item Return the first \typ{n} terms of the Fibonacci sequence
+ \end{enumerate}
+ For example:
+ \begin{lstlisting}
+ In []: fib(4)
+ Out[]: [0, 1, 1, 2]
+ In []: fib()
+ Out[]: [0, 1, 1, 2, 3, 5, 8, 13]
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Solution}
+\begin{lstlisting}
+ def fib(n=8):
+ a, b = 0, 1
+ result = [0]
+ for i in range(n-1):
+ result.append(b)
+ a, b = b, a+b
+ return result
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain,fragile]
+ \frametitle{Exercise: returning a function}
+ \begin{enumerate}
+ \item Define a function called \typ{power2()} which takes no argument
+ \item It should return a function which takes a single argument \typ{x} but
+ returns $2^x$
+ \end{enumerate}
+ For example:
+ \begin{lstlisting}
+ In []: f = power2()
+ In []: f(2)
+ Out[]: 4
+ In []: power2()(4)
+ Out[]: 16
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+\frametitle{Solution}
+\begin{lstlisting}
+ def power2():
+ def f(x):
+ return 2**x
+ return f
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile,plain]
+ \frametitle{Another solution}
+ \begin{lstlisting}
+ def power(n=2):
+ def f(x):
+ return n**x
+ return f
+ \end{lstlisting}
+ \begin{itemize}
+ \item This is called a closure.
+ \item Note that \typ{f} ``stores'' the value of \typ{n}
+ \end{itemize}
+ \pause
+ \begin{lstlisting}
+ In []: p2 = power(2)
+ In []: p3 = power(3)
+ In []: p2(2)
+ Out[]: 4
+ In []: p3(2)
+ Out[]: 9
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain,fragile]
+ \frametitle{Exercise: function as an argument}
+ \begin{enumerate}
+ \item Define a function called \typ{apply(f, data)}
+ \item Where \typ{f} is a function taking a single value
+ \item Where \typ{data} is a list
+ \item It should return a list where the function is applied to each element
+ of \typ{data}
+ \end{enumerate}
+ For example:
+ \begin{lstlisting}
+ In []: def double(x):
+ .....: return 2*x
+ .....:
+ In []: apply(double, [1, 2, 3])
+ Out[]: [2, 4, 6]
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}[plain, fragile]
+ \frametitle{Solution}
+ \begin{lstlisting}
+ def apply(f, data):
+ result = []
+ for x in data:
+ result.append(f(x))
+ return result
+ \end{lstlisting}
+\end{frame}
+
+\begin{frame}
+ \centering
+ \Huge
+
+ That's all folks!
+\end{frame}
+\end{document}
+
+\end{document}