summaryrefslogtreecommitdiff
path: root/basic_python/functions.tex
diff options
context:
space:
mode:
authorPrabhu Ramachandran2018-05-15 19:17:01 +0530
committerPrabhu Ramachandran2018-05-15 19:17:01 +0530
commit2c5145f262e82996c9c2424159e5eb5dde47fae7 (patch)
tree86e1893822781826734eb59dc36ea73cab517066 /basic_python/functions.tex
parentcf7c9cc1bb9e4f004e547aaa728fe6254f3cf704 (diff)
downloadpython-workshops-2c5145f262e82996c9c2424159e5eb5dde47fae7.tar.gz
python-workshops-2c5145f262e82996c9c2424159e5eb5dde47fae7.tar.bz2
python-workshops-2c5145f262e82996c9c2424159e5eb5dde47fae7.zip
Reorganize files so order is obvious.
Diffstat (limited to 'basic_python/functions.tex')
-rw-r--r--basic_python/functions.tex435
1 files changed, 0 insertions, 435 deletions
diff --git a/basic_python/functions.tex b/basic_python/functions.tex
deleted file mode 100644
index 7213fea..0000000
--- a/basic_python/functions.tex
+++ /dev/null
@@ -1,435 +0,0 @@
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%Tutorial slides on Python.
-%
-% Author: FOSSEE
-% Copyright (c) 2017, FOSSEE, IIT Bombay
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\documentclass[14pt,compress]{beamer}
-\input{macros.tex}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Title page
-\title[Functions]{Python language: Functions}
-
-\author[FOSSEE Team] {The FOSSEE Group}
-
-\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
-\date[] {Mumbai, India}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% DOCUMENT STARTS
-\begin{document}
-
-\begin{frame}
- \titlepage
-\end{frame}
-
-\section{Functions}
-
-\begin{frame}[fragile]
- \frametitle{Functions for abstraction}
- \begin{itemize}
- \item Reduce duplication of code
- \item Fewer lines of code: lesser scope for bugs
- \item Re-usability of code
- \item Use functions written by others, without exactly knowing how
- they do, what they are doing
- \item \alert{Enter Functions!}
- \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Defining functions}
- \begin{itemize}
- \item Consider the function \texttt{f(x) = x\textasciicircum{}2}
- \item In Python:
- \end{itemize}
- \begin{lstlisting}
- In []: def f(x):
- .....: return x*x
- .....:
- In []: f(1)
- In []: f(1+2j)
- \end{lstlisting}
- \begin{itemize}
- \item \typ{def} is a keyword
- \item \typ{f} is the name of the function
- \item \typ{x} the parameter of the function
- \item \typ{return} is a keyword
- \end{itemize}
-\end{frame}
-
-
-\begin{frame}[fragile]
- \frametitle{Defining functions \ldots}
- \begin{lstlisting}
- In []: def greet():
- .....: print("Hello World!")
- .....:
-
- In []: greet()
- \end{lstlisting}
- \begin{itemize}
- \item \texttt{greet} is a function that takes no arguments
- \item It returns nothing explicitly
- \item Implicitly, Python returns \typ{None}
- \item \typ{None} is also a built-in, immutable data type
- \end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Defining functions \ldots}
- \begin{lstlisting}
- In []: def avg(a, b):
- .....: return (a + b)/2
- .....:
-
- In []: avg(12, 10)
-\end{lstlisting}
-\begin{itemize}
-\item \typ{avg} takes two arguments
-\item Returns one value
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Doc-strings}
- \begin{itemize}
- \item It's highly recommended that all functions have documentation
- \item We write a doc-string along with the function definition
- \end{itemize}
- \begin{lstlisting}
-def avg(a, b):
- """Returns the average of two
- given numbers."""
- return (a + b)/2
-
-In[]: avg?
-In[]: greet?
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Returning multiple values}
- \begin{itemize}
- \item Return area and perimeter of circle, given radius
- \item Function needs to return two values
- \end{itemize}
- \begin{lstlisting}
-def circle(r):
- """Returns area and perimeter of
- circle given radius r"""
- pi = 3.14
- area = pi * r * r
- perimeter = 2 * pi * r
- return area, perimeter
-
-In []: circle(4)
-In []: a, p = circle(6)
- \end{lstlisting}
-\end{frame}
-
-
-\subsection{Default \& Keyword Arguments}
-
-\begin{frame}[fragile]
- \frametitle{Default arguments}
- \begin{lstlisting}
-In []: round(2.484)
-In []: round(2.484, 2)
-
-In []: s.split() # split on spaces
-In []: s.split(';') # split on ';'
-
-In []: range(10)
-In []: range(1, 10)
-In []: range(1, 10, 2)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Default arguments \ldots}
- \begin{lstlisting}
-In []: def welcome(greet, name="World"):
-.....: print(greet, name)
-.....:
-
-In []: welcome("Hi", "Guido")
-In []: welcome("Hello")
- \end{lstlisting}
-\end{frame}
-\begin{frame}[fragile]
- \frametitle{Default arguments \ldots}
- \begin{itemize}
- \item Arguments with default values, should be placed at the end
- \item The following definition is \alert{WRONG}
- \end{itemize}
- \begin{lstlisting}
-In []: def welcome(name="World", greet):
-.....: print(greet, name)
-.....:
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile,plain]
- \frametitle{Keyword Arguments}
- \begin{lstlisting}
-In []: def welcome(greet, name="World"):
-.....: print(greet, name)
-.....:
-
-In []: welcome("Hello", "James")
-
-In []: welcome("Hi", name="Guido")
-
-In []: welcome(name="Guido",greet="Hey")
-
-In []: welcome(name="Guido", "Hey")
-\end{lstlisting}
-Cannot have non-keyword args after kwargs
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Built-in functions}
- \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}
-\end{frame}
-
-\subsection{Variable Scope}
-
-\begin{frame}[fragile]
- \frametitle{Arguments are local}
- \begin{lstlisting}
- In []: def change(q):
- .....: q = 10
- .....: print(q)
- .....:
-
- In []: change(1)
- In []: print(q)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Variables inside function are local}
- \begin{lstlisting}
- In []: n = 5
- In []: def change():
- .....: n = 10
- .....: print(n)
- .....:
- In []: change()
- In []: print(n)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{If not defined, look in parent scope}
- \begin{lstlisting}
- In []: n = 5
- In []: def scope():
- .....: print(n)
- .....:
- In []: scope()
-\end{lstlisting}
-\begin{itemize}
-\item Note that \typ{n} was not defined in \typ{scope}
-\item It looked for the variable in previous scope
-\item See: \url{pythontutor.com}
-\end{itemize}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{\texttt{global}}
- \begin{itemize}
- \item Use the \texttt{global} statement to assign to global variables
- \end{itemize}
- \begin{lstlisting}
- In[]: def change():
- ....: global n
- ....: n = 10
- ....: print(n)
- ....:
- In[]: change()
- In[]: print(n)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Mutable variables}
- \begin{itemize}
- \item Behavior is different when assigning to a list element/slice
- \item Python looks up for the name, from innermost scope outwards,
- until the name is found
- \end{itemize}
- \begin{lstlisting}
-In []: name = ['Mr.', 'Steve','Gosling']
-In []: def change_name():
-.....: name[0] = 'Dr.'
-.....:
-In []: change_name()
-In []: print(name)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Passing Arguments \ldots}
- \begin{lstlisting}
-In []: n = 5
-In []: def change(n):
-.....: n = 10
-.....: print(n, "inside change")
-.....:
-In []: change(n)
-In []: print(n)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Passing Arguments \ldots}
-\begin{lstlisting}
-In []: name = ['Mr.', 'Steve','Gosling']
-In []: def change_name(x):
-.....: x[0] = 'Dr.'
-.....: print(x, 'in change')
-.....:
-In []: change_name(name)
-In []: print(name)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Passing Arguments \ldots}
-\begin{lstlisting}
-In []: name = ['Mr.', 'Steve','Gosling']
-In []: def change_name(x):
-.....: x = [1,2,3]
-.....: print(x, 'in change')
-.....:
-In []: change_name(name)
-In []: print(name)
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Passing Arguments \ldots}
-\begin{lstlisting}
-In []: name = ['Mr.', 'Steve','Gosling']
-In []: def change_name(x):
-.....: x[:] = [1,2,3]
-.....: print(x, 'in change')
-.....:
-In []: change_name(name)
-In []: print(name)
- \end{lstlisting}
-\end{frame}
-
-
-\subsection{Examples}
-
-\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]
- \frametitle{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}[fragile]
- \frametitle{Nested functions}
- \begin{lstlisting}
- def f(x):
- def g(x):
- return x+1
- return g(x)**2
- \end{lstlisting}
-\end{frame}
-
-\begin{frame}[fragile]
- \frametitle{Nested functions: returning functions}
- \begin{lstlisting}
- def f():
- def g(x):
- return x+1
- return g
-
- In []: func = f()
- In []: func(1)
- In []: f()(1) # Also valid!
- \end{lstlisting}
-\end{frame}
-
-
-\begin{frame}
- \frametitle{Summary}
- \begin{itemize}
- \item Defining functions
- \item Taking either 0, or more arguments
- \item Returning \typ{None} implicitly or any number of values
- \item Default and keyword arguments
- \item Variable scope, \typ{global}
- \item Mutable and immutable arguments
- \item Nested functions
- \end{itemize}
-\end{frame}
-
-\end{document}