\section{Strings} \begin{frame}[fragile] \frametitle{What are Strings?} \begin{itemize} \item Anything quoted is a string \item Single quotes, double quotes or triple single/double quotes \item Any length --- single character, null string, \ldots \end{itemize} \begin{lstlisting} In[]: 'This is a string' In[]: "This is a string too' In[]: '''This is a string as well''' In[]: """This is also a string""" In[]: '' # empty string \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Why so many?} \begin{itemize} \item Reduce the need for escaping \end{itemize} \begin{lstlisting} In[]: "Python's strings are powerful!" In[]: 'He said, "I love Python!"' \end{lstlisting} \begin{itemize} \item Triple quoted strings can be multi-line \item Used for doc-strings \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Assignment \& Operations} \begin{lstlisting} In[]: a = 'Hello' In[]: b = 'World' In[]: c = a + ', ' + b + '!' \end{lstlisting} \begin{itemize} \item Strings can be multiplied with numbers \end{itemize} \begin{lstlisting} In[]: a = 'Hello' In[]: a * 5 \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Accessing Elements} \begin{lstlisting} In[]: print a[0], a[4], a[-1], a[-4] \end{lstlisting} \begin{itemize} \item Can we change the elements? \end{itemize} \begin{lstlisting} In[]: a[0] = 'H' \end{lstlisting} \begin{itemize} \item Strings are immutable! \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Problem - Day of the Week?} \begin{itemize} \item Strings have methods to manipulate them \end{itemize} \begin{block}{Problem} Given a list, \texttt{week}, containing names of the days of the week and a string \texttt{s}, check if the string is a day of the week. We should be able to check for any of the forms like, \emph{sat, saturday, Sat, Saturday, SAT, SATURDAY} \end{block} \begin{itemize} \item Get the first 3 characters of the string \item Convert it all to lower case \item Check for existence in the list, \texttt{week} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Slicing} \begin{lstlisting} In[]: q = "Hello World" In[]: q[0:3] In[]: q[:3] In[]: q[3:] In[]: q[:] In[]: q[-1:1] In[]: q[1:-1] \end{lstlisting} \begin{itemize} \item One or both of the limits, is optional \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Striding} \begin{lstlisting} In[]: q[0:5:1] In[]: q[0:5:2] In[]: q[0:5:3] In[]: q[0::2] In[]: q[2::2] In[]: q[::2] In[]: q[5:0:-1] In[]: q[::-1] \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{String Methods} \begin{lstlisting} In[]: s.lower() In[]: s.upper() s. \end{lstlisting} \begin{itemize} \item \alert{Strings are immutable!} \item A new string is being returned \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Solution - Day of the Week?} \begin{lstlisting} In[]: s.lower()[:3] in week \end{lstlisting} OR \begin{lstlisting} In[]: s[:3].lower() in week \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{join} a list of strings} \begin{itemize} \item Given a list of strings \item We wish to join them into a single string \item Possibly, each string separated by a common token \end{itemize} \begin{lstlisting} In[]: email_list = ["info@fossee.in", "enquiries@fossee.in", "help@fossee.in"] \end{lstlisting} \begin{lstlisting} In[]: '; '.join(email_list) In[]: ', '.join(email_list) \end{lstlisting} \end{frame} \section{Conditionals} \begin{frame}[fragile] \frametitle{\texttt{if-else} block} \begin{lstlisting} In[]: a = 5 In[]: if a % 2 == 0: ....: print "Even" ....: else: ....: print "Odd" \end{lstlisting} \begin{itemize} \item A code block -- \texttt{:} and indentation \item Exactly one block gets executed in the \texttt{if-else} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{if-elif-else}} \begin{lstlisting} In[]: if a > 0: ....: print "positive" ....: elif a < 0: ....: print "negative" ....: else: ....: print "zero" \end{lstlisting} \begin{itemize} \item Only one block gets executed, depending on \texttt{a} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{else} is optional} \begin{lstlisting} In[]: if user == 'admin': ....: admin_Operations() ....: elif user == 'moderator': ....: moderator_operations() ....: elif user == 'client': ....: customer_operations() \end{lstlisting} \begin{itemize} \item Note that there is no \texttt{else} block \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Ternary operator} \begin{itemize} \item \texttt{score\_str} is either \texttt{'AA'} or a string of one of the numbers in the range 0 to 100. \item We wish to convert the string to a number using \texttt{int} \item Convert it to 0, when it is \texttt{'AA'} \item \texttt{if-else} construct or the ternary operator \end{itemize} \begin{lstlisting} In[]: if score_str != 'AA': ....: score = int(score_str) ....: else: ....: score = 0 \end{lstlisting} \begin{lstlisting} In[]: ss = score_str In[]: score = int(ss) if ss != 'AA' else 0 \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{pass}} \begin{itemize} \item \texttt{pass} is a syntactic filler \item When a certain block has no statements, a \texttt{pass} is thrown in \item Mostly, when you want to get back to that part, later. \end{itemize} \end{frame} \section{Loops} \begin{frame}[fragile] \frametitle{\texttt{while}} \begin{itemize} \item Print squares of all odd numbers less than 10 using \texttt{while} \end{itemize} \begin{lstlisting} In[]: i = 1 In[]: while i<10: ....: print i*i ....: i += 2 \end{lstlisting} \begin{itemize} \item The loops runs as long as the condition is \texttt{True} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{for}} \begin{itemize} \item Print squares of all odd numbers less than 10 using \texttt{for} \end{itemize} \begin{lstlisting} In[]: for n in [1, 2, 3]: ....: print n \end{lstlisting} \begin{itemize} \item \texttt{for} iterates over each element of a sequence \end{itemize} \begin{lstlisting} In[]: for n in [1, 3, 5, 7, 9]: ....: print n*n In[]: for n in range(1, 10, 2): ....: print n*n \end{lstlisting} \begin{itemize} \item \alert{range([start,] stop[, step])} \item Returns a list; Stop value is not included. \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{break}} \begin{itemize} \item breaks out of the innermost loop. \item Squares of odd numbers below 10 using \texttt{while} \& \texttt{break} \end{itemize} \begin{lstlisting} In[]: i = 1 In[]: while True: ....: print i*i ....: i += 2 ....: if i>10: ....: break \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{\texttt{continue}} \begin{itemize} \item Skips execution of rest of the loop on current iteration \item Jumps to the end of this iteration \item Squares of all odd numbers below 10, not multiples of 3 \end{itemize} \begin{lstlisting} In[]: for n in range(1, 10, 2): ....: if n%3 == 0: ....: continue ....: print n*n \end{lstlisting} \end{frame} \section{Lists} \begin{frame}[fragile] \frametitle{Creating Lists} \begin{lstlisting} In[]: empty = [] In[]: p = ['spam', 'eggs', 100, 1.234] In[]: q = [[4, 2, 3, 4], 'and', 1, 2, 3, 4] \end{lstlisting} \begin{itemize} \item Lists can be empty, with no elements in them \item Lists can be heterogeneous -- every element of different kind \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Accessing Elements} \begin{lstlisting} In[]: print p[0], p[1], p[3] In[]: print p[-1], p[-2], p[-4] In[]: print p[10] \end{lstlisting} \begin{itemize} \item Indexing starts from 0 \item Indexes can be negative \item Indexes should be in the valid range \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Accessing Elements \& length} \begin{lstlisting} In[]: print p[0], p[1], p[3] In[]: print p[-1], p[-2], p[-4] In[]: print len(p) In[]: print p[10] \end{lstlisting} \begin{itemize} \item Indexing starts from 0 \item Indexes can be negative \item Indexes should be within the \texttt{range(0, len(p))} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Adding \& Removing Elements} \begin{itemize} \item The append method adds elements to the end of the list \end{itemize} \begin{lstlisting} In[]: p.append('onemore') In[]: p In[]: p.append([1, 6]) In[]: p \end{lstlisting} \begin{itemize} \item Elements can be removed based on their index OR \item based on the value of the element \end{itemize} \begin{lstlisting} In[]: del p[1] In[]: p.remove(100) \end{lstlisting} \begin{itemize} \item \alert{When removing by value, first element is removed} \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Concatenating lists} \begin{lstlisting} In[]: a = [1, 2, 3, 4] In[]: b = [4, 5, 6, 7] In[]: a + b In[]: print a+b, a, b \end{lstlisting} \begin{itemize} \item A new list is returned; None of the original lists change \end{itemize} \begin{lstlisting} In[]: c = a + b In[]: c \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Slicing \& Striding} \begin{lstlisting} In[]: primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] In[]: primes[4:8] In[]: primes[:4] In[]: num = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] In[]: num[1:10:2] In[]: num[:10] In[]: num[10:] In[]: num[::2] In[]: num[::-1] \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Sorting} \begin{lstlisting} In[]: a = [5, 1, 6, 7, 7, 10] In[]: a.sort() In[]: a \end{lstlisting} \begin{itemize} \item \texttt{sort} method sorts the list in-place \item Use \texttt{sorted} if you require a new list \end{itemize} \begin{lstlisting} In[]: a = [5, 1, 6, 7, 7, 10] In[]: sorted(a) In[]: a \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Reversing} \begin{lstlisting} In[]: a = [5, 1, 6, 7, 7, 10] In[]: a.reverse() In[]: a \end{lstlisting} \begin{itemize} \item \texttt{reverse} method reverses the list in-place \item Use \texttt{[::-1]} if you require a new list \end{itemize} \begin{lstlisting} In[]: a = [5, 1, 6, 7, 7, 10] In[]: a[::-1] In[]: a \end{lstlisting} \end{frame}