## Python Workshop: Basics II

Based on:

this git of Zhiya Zuo

&

tutorials from tutorialspoint

## Control Logics

In the following examples, we show examples of comparison, if-else loop, for loop, and while loop.

### Comparison

Python syntax for comparison is the same as our hand-written convention:

1. Larger (or equal): > (>=)
2. Smaller (or equal): < (<=)
3. Equal to: ==
4. Not equal to: !=
In [1]:
3 == 5

Out[1]:
False
In [2]:
72 >= 2

Out[2]:
True
In [3]:
test_str = "test"
test_str == "test" # can also compare strings

Out[3]:
True

### If-Else

In [4]:
sum_ =0

In [5]:
if sum_ == 0:
print("sum_ is 0")
elif sum_ < 0:
print("sum_ is less than 0")
else:
print("sum_ is above 0 and its value is " + str(sum_)) # Cast sum_ into string type.

sum_ is 0


Comparing strings are similar

In [6]:
store_name = 'Walmart'

In [7]:
if 'Wal' in store_name:
print("The store is not Walmart. It's " + store_name + ".")
else:
print("The store is Walmart.")

The store is not Walmart. It's Walmart.


### For loop

In [8]:
for letter in store_name:
print(letter)

W
a
l
m
a
r
t


range() is a function to create integer sequences:

In [9]:
a_range = range(5)
print(a_range)
print("range(5) gives" + str(list(range(5)))) # By default starts from 0
print("range(1,9) gives: " + str(list(range(1, 9)))) # From 1 to 8 (Again the end index is exclusive.)

range(0, 5)
range(5) gives[0, 1, 2, 3, 4]
range(1,9) gives: [1, 2, 3, 4, 5, 6, 7, 8]

In [10]:
for index in range(len(store_name)): # length of a sequence
print("The %ith letter in store_name is: %s"%(index, store_name[index]))

The 0th letter in store_name is: W
The 1th letter in store_name is: a
The 2th letter in store_name is: l
The 3th letter in store_name is: m
The 4th letter in store_name is: a
The 5th letter in store_name is: r
The 6th letter in store_name is: t


#### List comprehensions

List comprehensions provides an easy way to create lists:

In [11]:
x = [i for i in range(10)]
print(x)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


a lot of cool things can be done in one line!

In [12]:
x = [i + 2 for i in range(10)]
print(x)

x = [i ** 2 for i in range(10) if i%2==0]
print(x)

[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
[0, 4, 16, 36, 64]


### While loop

In [13]:
x = 2

In [14]:
while x < 10:
print(x)
x = x + 1

2
3
4
5
6
7
8
9


#### Notes on break and continue

break means get out of the loop immediately. Any code after the break will NOT be executed.

In [15]:
store_name = 'Walmart'

In [16]:
index = 0
while True:
print(store_name[index])
index += 1 # a += b means a = a + b
if store_name[index] == "a":
print("End at a")
break # instead of setting flag to False, we can directly break out of the loop
print("Hello!") # This will NOT be run

W
End at a


continue means get to the next iteration of loop. It will break the current iteration and continue to the next.

In [17]:
for letter in store_name:
if letter == "a":
continue # Not printing a
else:
print(letter)

W
l
m
r
t


## Functions

Structure of a function

def func_name(arg1, arg2, arg3, ...):
#####################
# Do something here #
#####################
return output


return output is NOT required

### One input one output

In [18]:
def F(n): # bonus- what does this function do?
if n<0:
print("Incorrect input")
elif n==0:
return 0
elif n==1:
return 1
else:
return F(n-1)+F(n-2)

In [19]:
print(F(2))

print(F(3))

print(F(5))

print(F(7))

1
2
5
13


### Multiple outputs

reference- geometric sequence equations:

$a_n = a_1 \cdot q^{n-1}$

$S_n = \frac{a_1\cdot(q^n-1)}{q-1}$

In [20]:
def geo_seq(a_1, q, n):
a_n = a_1 * (q ** (n-1))
S_n = (a_1 * (q ** n - 1)) / (q - 1)
return a_n, S_n

In [21]:
print(geo_seq(2, 2, 1)) # multiple outputs returns as a tuple

print(geo_seq(2, 2, 2))

print(geo_seq(2, 2, 2))

print(geo_seq(2, 2, 3)[1]) # get only second element

(2, 2.0)
(4, 6.0)
(4, 6.0)
14.0


### optional args

In [22]:
def geo_seq_optional_args(a_1, q=2, n=1):
a_n = a_1 * (q ** (n-1))
S_n = (a_1 * (q ** n - 1)) / (q - 1)
return a_n, S_n

In [23]:
print(geo_seq_optional_args(2))

print(geo_seq_optional_args(2, n=2))

(2, 2.0)
(4, 6.0)


## Classes

As been said before- Python is object oriented programing (OOP) language, so every variable is actually an instance of some class.

Here are some class basics:

In [24]:
class Employee:

# the function that is being called each time a new instance is created
def __init__(self, name="Jhon", salary=10000):
# per instance variables
self.name = name
self.salary = salary

def display_employee(self):
print("Name : " + self.name + ", Salary: "+ str(self.salary))

def change_salary(self, new_salary):
self.salary = new_salary

In [25]:
emp1 = Employee() #create new instance
emp1.display_employee()

emp2 = Employee("Bob", salary=20000) #create new instance
emp2.display_employee()

emp2.change_salary(30000)
emp2.display_employee()

# instance variables are also accessible - no such thing private/public vars
emp2.name = "Larry"
emp2.display_employee()

Name : Jhon, Salary: 10000
Name : Bob, Salary: 20000
Name : Bob, Salary: 30000
Name : Larry, Salary: 30000


## FIle I/O

This section is about some basics on reading and writing data, in Python native style

### Write data to a file

In [26]:
f = open("tmp1.csv", "w") # f is a file handler, while "w" is the mode (w for write)
for item in range(6):
f.write(str(item) + "\n")
f.close() # close the filer handler for security reasons.


Note that without the typecasting from int to str, an error will be raised. A more commonly used way:

In [27]:
with open("tmp2.csv", "w") as f:
for item in range(4):
f.write(str(item))
f.write("\n")
# no need to close file, when out of 'with' scope the file closes automatically


Occasionally, we need to append new elements instead of overwriting existing files. In this case, we should use a mode in our open function:

In [28]:
with open("tmp2.csv", "a") as f: # 'a' == append to end of file
for item in range(15, 19):
f.write(str(item)+"\n")


### Read data to a file

To read a text file into Python, we use r mode (for read)

In [29]:
f = open("tmp1.csv", "r") # this time, use read mode
contents = [item.strip("\n") for item in f] # list comprehension. This is the same as for-loop but more concise + stripping newline
print(contents)
f.close()

['0', '1', '2', '3', '4', '5']


Also using with:

In [30]:
with open("tmp2.csv", "r") as f:

['0\n', '1\n', '2\n', '3\n', '15\n', '16\n', '17\n', '18\n']

In [31]:
# delete the files...
import os
os.remove("tmp1.csv")
os.remove("tmp2.csv")


## Packages

Often times, we need either internal or external help for complicated computation tasks. In these occasions, we need to import packages.

### Built-in packages

Python provides many built-in packages to prevent extra work on some common and useful functions

We will use math as an example.

In [32]:
import math # use import to load a library


To use functions from the library, do: library_name.function_name. For example, when we want to calculate the logarithm using a function from math library, we can do math.log

In [33]:
x = 3
print("e^x = e^3 = %f"%math.exp(x))
print("log(x) = log(3) = %f"%math.log(x))

e^x = e^3 = 20.085537
log(x) = log(3) = 1.098612


You can also import one specific function:

In [34]:
from math import exp # You can import a specific function
print(exp(x)) # This way, you don't need to use math.exp but just exp

20.085536923187668


Or all:

In [35]:
from math import * # Import all functions - not recommended do to overriding of functions

In [36]:
print(exp(x))
print(log(x)) # Before importing math, calling exp or log will raise errors

20.085536923187668
1.0986122886681098


You can import a package with a shortened name:

In [37]:
import math as m
m.exp(3)

Out[37]:
20.085536923187668

Depending on what you want to achieve, you may want to choose between importing a few or all (by *) functions within a package.

### External Packages

There are times you'll want some advanced utility functions not provided by Python. There are many useful packages by developers.

We'll use numpy as an example. (numpy, scipy, matplotlib,and probably pandas will be of the most importance to you for data analyses.

Installation of packages for Python is the easiest using pip:

~\$ pip install numpy


We'll see use for external packages later on.

In [ ]:

`