summaryrefslogtreecommitdiff
path: root/advanced_python/03_varargs_kwargs.tex
diff options
context:
space:
mode:
Diffstat (limited to 'advanced_python/03_varargs_kwargs.tex')
-rw-r--r--advanced_python/03_varargs_kwargs.tex181
1 files changed, 181 insertions, 0 deletions
diff --git a/advanced_python/03_varargs_kwargs.tex b/advanced_python/03_varargs_kwargs.tex
new file mode 100644
index 0000000..29f7e88
--- /dev/null
+++ b/advanced_python/03_varargs_kwargs.tex
@@ -0,0 +1,181 @@
+\documentclass[14pt,compress,aspectratio=169]{beamer}
+
+\input{macros.tex}
+
+\title[*args, **kw]{Advanced Python}
+\subtitle{Arbitrary arguments for functions}
+
+\author[FOSSEE] {The FOSSEE Group}
+
+\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay}
+\date[] {Mumbai, India}
+
+\begin{document}
+
+\begin{frame}
+ \titlepage
+\end{frame}
+
+\begin{frame}
+ \frametitle{Overview}
+ \begin{itemize}
+ \item Advanced unpacking
+ \item Variable arguments
+ \item Arbitrary keyword arguments
+ \item Unpacking arguments
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Advanced unpacking}
+ \vspace*{-0.1in}
+\begin{lstlisting}
+In []: a, b = 1, 2 # We know this!
+\end{lstlisting}
+ \pause
+ \begin{itemize}
+ \item In Python 3.x we can also do
+ \end{itemize}
+\begin{lstlisting}
+In []: first, *rest = range(5)
+
+In []: first
+Out[]: 0
+
+In []: first, *middle, last = range(5)
+
+In []: middle
+Out[]: [1, 2, 3]
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Advanced unpacking ...}
+ \begin{itemize}
+ \item Also works for files
+ \end{itemize}
+\begin{lstlisting}
+In []: f = open('file.txt')
+
+In []: first, *ign, last = f.readlines()
+
+In []: f.close()
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Arbitrary positional arguments}
+ \vspace*{-0.1in}
+ \begin{itemize}
+ \item Arbitrary positional arguments: \lstinline{*arg}
+ \end{itemize}
+
+\begin{lstlisting}
+In []: def func(a, b, *args):
+ ...: print(a, b, args)
+\end{lstlisting}
+\pause
+\begin{lstlisting}
+In []: func(1, 2)
+1 2 ()
+
+In []: func(1, 2, 'a')
+1 2 ('a',)
+
+In []: func(1, 2, 3, 'a')
+1 2 (3, 'a')
+\end{lstlisting}
+
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Arbitrary positional arguments}
+
+ Nothing special about \lstinline{args}:
+
+\begin{lstlisting}
+In []: def func(a, b, *rest):
+ ...: print(a, b, rest)
+
+\end{lstlisting}
+Also is perfectly valid
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Arbitrary keyword arguments}
+ \vspace*{-0.1in}
+ \begin{itemize}
+ \item Keyword arguments using \lstinline{**kw}
+ \end{itemize}
+\begin{lstlisting}
+In []: def func(a, b='b', **kw):
+ ...: print(a, b, kw)
+\end{lstlisting}
+ \pause
+\begin{lstlisting}
+In []: func(1)
+1 b {}
+
+In []: func(1, 2)
+1 2 {}
+
+In []: func(1, b=2)
+1 2 {}
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Arbitrary keyword arguments}
+\begin{lstlisting}
+In []: def func(a, b='b', **k):
+ ...: print(a, b, k)
+
+In []: func(1, c=3)
+1 b {'c': 3}
+
+In []: func(1, c=3, d=4)
+1 b {'c': 3, 'd': 4}
+\end{lstlisting}
+\end{frame}
+
+
+\begin{frame}[fragile]
+ \frametitle{Argument unpacking}
+\begin{lstlisting}
+In []: def func(a, b):
+ ...: print(a, b)
+
+In []: func(*[5, 10])
+5 10
+
+In []: func(*(5, 10))
+5 10
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Argument unpacking ...}
+\begin{lstlisting}
+In []: def func(a=1, b=2):
+ ...: print(a, b)
+
+In []: func(**{'a':5, 'b':10})
+5 10
+
+In []: func(**dict(a=5, b=10))
+5 10
+\end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+ \frametitle{Summary}
+ \begin{itemize}
+ \item Advanced unpacking
+ \item Arbitrary positional arguments with \lstinline{*args}
+ \item Arbitrary keyword arguments with \lstinline{**kw}
+ \item Argument unpacking
+ \end{itemize}
+\end{frame}
+
+
+\end{document}