Here is a link back to the course syllabus/policy page.
This schedule is will be changing very frequently, please check it at least every class day, and before starting work on any assignment (in case the content of the assignment has changed).
When there is a reading assignment, please read the named section(s) before that day.
If you see the symbol
below, it means that class was videoed and you can
get a link by e-mailing me. Note that if you know ahead of time that
you will miss a class, you should tell me and I will be sure to video
that day for you.

Recall from the syallabus that these are short emails you should send to your instructor about the current readings you've been assigned and/or the material we've been discussing in class.With that understood, please do the following T&Qs (send each in its own email to your instructor) before class on Monday (Tuesday is also OK, if this seems like too much, too soon, or if you have a question you want to ask in class about T&Qs on Monday):
Their content should be a thought or question you might have about the topic in question, expressed in just a few sentences (or even one, very well crafted sentence!).
There is no requirement about depth or sophistication of your T&Qs, other than that they show real engagement with the material. For example, something like"I think American politics suck."does not show engagement [about a reading on current events], while"This article says that the Electoral College has its roots in the racist origins of the US Consstitution, and while I can see that is important, I don't see any path to changing the way we elect presidents in the near future."does.
Also, don't be embarrassed if your T&Q is a question and not a statement. If there is something in the assigned T&Q topic which you don't understand, state clearly and explicitly what that confusing bit is. E.g.,"This article talks about the problem with the Electoral College being that one person does not have one vote, but I don't understand the reasoning there, or the example of big states and small ones — don't big states have more Electoral College votes, so what's the problem with that?"would be fine [on the same current event topic].
Each T&Q is graded 0 or 1 ... you should expect to get pretty much all 1s on your T&Qs, so long as you are actually engaging with the readings and class material, and keeping on schedule with them.
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0,20,1000) y1 = np.sin(x) y2 = np.cos(x) plt.plot(x, y1, '-b', label='sine') plt.plot(x, y2, '-r', label='cosine') plt.legend(loc='upper left') plt.show()
import random
def guess(n=1023):
if n < 1:
print("Input must be a natural number")
return
number = random.randint(0,n)
guesses = 0
while True:
guess_text = input("Guess the number from 0 to %d: " % n)
if guess_text == "I give up":
print("Give up, eh? Well, my number was %d." % number)
return
guess = int(guess_text)
if guess < 0 or guess > n:
print("Your guesses must be integers in the range from 0 to %d." % n)
continue
guesses += 1
if guess > number:
print("Too high")
elif guess < number:
print("Too low")
else:
print("Got it (in %d guesses)!!" % guesses)
return
Try running this to play the game — come up with a good
strategy!
class Quizzer:
def __init__(self, max_val):
import random
self.n = random.randint(0,max_val)
self.max_val = max_val
def try_guess(self, k):
if k < 0 or k >self.max_val:
return 17
if k < self.n:
return -1
elif k > self.n:
return 1
else:
return 0
def __str__(self):
return str(self.n)
For example, it can be used as in the following
q=new Quizzer(65635)
for i in range(65535):
ans=q.try_guess(i)
if ans == -1:
print("Too low, trying again")
elif ans == +1:
print("Too high, how did that happen?")
elif ans == 0:
print("Got it! Answer was %d" % i)
break
else:
print("weird. quitting")
break
which implements the naïve searching algorithm.
class BSTnode:
def __init__(self,data,left=None,right=None):
self.data = data
self.left = left
self.right = right
def is_leaf(self):
return self.left==None and self.right==None
This code includes the possibly convenient method that tells if
a node is a leaf, is_leaf().
class BSTnode:
def __init__(self,data,parent=None,left=None,right=None):
self.data = data
self.parent = parent
self.left = left
self.right = right
def is_leaf(self):
return self.left==None and self.right==None
def is_root(self):
return self.parent==None
This version of the code includes the possibly convenient
method that tells if a node is the root of the tree,
is_root().
def print_letter_counts(string):
counts = {}
for i in string:
if i in counts:
counts[i] += 1
else:
counts[i] = 1
for i in counts:
print("Letter "+i+" ocurred with frequency "+str(counts[i]))
def print_letter_counts_array(string):
import numpy as np
counts = np.zeros(26, np.int)
for i in string:
counts[ord(i)-ord('a')] += 1
for i in range(26):
print("Letter "+chr(i+ord('a'))+" ocurred with frequency "+str(counts[i]))
raise IndexError("Key not found in this hash table")
with open('filename','r') as f:
for line in f:
print(line) # or do anything you want to do with that line
def __iadd__(self, item):
if type(item) == str:
self.add_vertex(item)
elif type(item) == tuple:
self.add_edge(item)
else
raise ValueError("Can only add a vertex [=str] or edge =[tuple].")
[To do the same thing for graphs rather than digraphs, replace
every occurrance of "tuple" in that code with "set".]
import matplotlib.pyplot as plt
import math
def dots_around_the_circle(n, self_loop_locs): # n here is the number of dots;
# self_loop_locs is a list of
# the indices of the self-loops
x = [] # will be the x-coords of the vertices
y = [] # will be the x-coords of the vertices
label_x = [] # will be the x-coords of the labels
label_y = [] # will be the y-coords of the labels
labels="ABCDEFGHIJKLMNOPQRSTUVWXYZ" # will be the label values; not a
# good way to do this! will not work
# if more than 26 vertices; use
# the real labels in your code
for i in range(n):
x.append(math.cos(2*i*math.pi/n))
label_x.append(1.2*math.cos(2*i*math.pi/n))
y.append(math.sin(2*i*math.pi/n))
label_y.append(1.2*math.sin(2*i*math.pi/n))
ax = plt.gca()
ax.set_xlim((-1.5,1.5))
ax.set_ylim((-1.5,1.5))
ax.set_aspect('equal') # set aspect ratio, so circle will be round not oval
plt.scatter(x,y,s=200) # plot the vertices
for i in range(n):
ax.annotate(labels[i],[label_x[i],label_y[i]]) # add the labels
if i in self_loop_locs: # this will # plot the selected self-loops edges
loop = plt.Circle([1.2*x[i],1.2*y[i]], .2, color='b', fill=False)
ax.add_artist(loop)
plt.show()
Try running dots_around_the_circle(6,[1,3,4]), for
example.x == 2*x 1234567890 < x x == x + 1 -x < -123123123123This can make for much cleaner code than using, say, None as an estimated distance value when none is yet known.
class Graph:
...
def add_vertex(...
...
@staticmethod
def rand_adj_mat(...
...
Then you would use this with something like
gr = Graph()
... stuff with gr, such as ,,,
gr.add_vertex("A")
...
... now to make an adjacency matrix
m = Graph.rand_adj_mat(5, .4)
... note that was called with Graph and not gr
... you could even have done that before gr was defined:
... no specific instance of Graph need exist before
... using rand_adj_mat, since it is a staticmethod
def greedy_euler(self, v):
path = []
while True:
successful = False
for e in self.edges:
if v in e:
if e in path:
continue
if len(e) == 1:
w = v
else:
list_version = list(e)
for a in list_version:
if a != v:
w = a
break
path.append(e)
v = w
successful = True
if not successful:
break
if len(path) != len(self.edges):
return ("Failed",path)
return path
>>> from graph import *
>>> m=Graph.rand_adj_mat(5,.5)
>>> m
array([[0, 1, 0, 1, 0],
[1, 0, 1, 0, 0],
[0, 1, 1, 0, 1],
[1, 0, 0, 0, 1],
[0, 0, 1, 1, 1]])
>>> g=Graph()
>>> g.set_adjacency(m)
>>> g.display([{"A","D"},{"D","E"},{"E"},{"E","C"}])
would make the image
ax = plt.gca()
ax.set_xlim((-1.6,1.6))
plt.setp(ax.get_xticklabels(), visible=False)
ax.xaxis.set_tick_params(size=0)
ax.set_ylim((-1.6,1.6))
plt.setp(ax.get_yticklabels(), visible=False)
ax.yaxis.set_tick_params(size=0)
ax.set_aspect('equal')
to set up the axes without tick marks or numbers
[because they are irrelevant to the graph information]
and the aspect ratio

clean_string = ""
for c in input_string.lower():
if c.isalpha():
clean_string += c
This may be useful in implementing cryptosystems in Python.
k=b'asdfjkl;asdfjkl;asdfjkl;asdfjkl;' obj=AES.new(k, AES.MODE_ECB) ciphertext=obj.ecrypt(plaintext)Yes, please use that stupid key b'asdfjkl;asdfjkl;asdfjkl;asdfjkl;' when you encrypt — that way, your instructor will be able to decrypt the message.
from math import gcd
if gcd(a,b) == 1:
print("They're relatively prime.")
else:
print("They are NOT relatively prime.")
since having a non-trivial common factor means their greatest
common factor is not just 1.