Jed Rembold & Fred Agbo
March 13, 2024
To the right are the contents of a text file named
PBride.txt
. Which code snippet below would
print off the word “father”?
My name is Inigo Montoya.
You killed my father.
Prepare to die.
with open('PBride.txt') as f:
for line in f:
w = line.split()
if w[0] == "You":
print(w[-1])
c = read('PBride.txt')
print(c.find("father"))
with open('PBride.txt') as f:
c = f.read().splitlines()
print(c[1][4])
with open('PBride.txt') as f:
c = f.read()
i = c.find("f")
print(c[i:i+6])
Suppose you had the file contents to the left and wanted to turn it into the contents on the right. Which code snippet below would accomplish this?
food
fooddoof
with open(file) as fh:
data = fh.read()
with open(file, 'w') as fh:
fh.write(data[::-1])
with open(file) as fh:
data = fh.read()
with open(file, 'a') as fh:
fh.write(data[::-1])
with open(file, 'rw') as fh:
data = fh.read()
fh.write(data[::-1])
with open(file) as fh:
data = fh.read()
with open(file, 'a') as fh:
fh.write(data[-2::-1])
employee = ("Bob Cratchit", "clerk", 15)
You can select or slice elements from a tuple just like you can with lists
If using tuples, you can make programs more readable by using a destructuring assignment, which breaks a tuple into named components:
name, title, salary = employee
While modern versions of Python have such thing as a named tuple, we will not look at them here.
One of the most simple examples of tuple usage would be storing location information in 2d space
By storing both \(x\) and \(y\) coordinates in a tuple, it makes that information easier to store and pass around your program
When you need to use the points, best to destructure:
x,y = pt
DELTA
ahead
from pgl import GWindow, GLine, GRect
PEG_SEP = 3
PEG_ACROSS = 300
PEG_DOWN = 150
DELTA = 332
GWIDTH = PEG_ACROSS * PEG_SEP
GHEIGHT = PEG_DOWN * PEG_SEP
def place_pegs():
""" Returns a list of points, where the points are tuples. """
list_pts = []
for i in range(PEG_ACROSS):
list_pts.append((i * PEG_SEP, 0))
for i in range(PEG_DOWN):
list_pts.append((GWIDTH, i * PEG_SEP))
for i in range(PEG_ACROSS):
list_pts.append((GWIDTH - i * PEG_SEP, GHEIGHT))
for i in range(PEG_DOWN):
list_pts.append((0, GHEIGHT - i * PEG_SEP))
return list_pts
def draw_pattern(list_pts, color='black'):
""" Creates a window and draws in the necessary yarn. """
gw = GWindow(GWIDTH, GHEIGHT)
current_i = 0
finished = False
while not finished:
next_i = (current_i + DELTA) % len(list_pts)
x1, y1 = list_pts[current_i]
x2, y2 = list_pts[next_i]
line = GLine(x1, y1, x2, y2)
line.set_line_width(2)
line.set_color(color)
gw.add(line)
current_i = next_i
if current_i == 0:
finished = True
if __name__ == '__main__':
pegs = place_pegs()
draw_pattern(pegs, 'green')
return x, y
is the same as
return (x,y)
enumerate
zip
We have multiple ways to iterate through a string or list:
By element:
for ch in string:
# body of loop using ch
By index:
for i in range(len(string)):
# body of loop using i
Using enumerate
lets us get both!
for i, ch in enumerate(string):
# body of loop using both ch and i
Sometimes you have multiple lists that you want to loop over in a “synced” fashion
The zip
function iterates through
tuples of pairs of elements
For example
zip([1,2,3], ["one", "two", "three"])
would yield (1, "one")
, then
(2, "two")
, and then
(3, "three")
Can unpack or destructure as part of a
for
loop:
for x,y in zip([1,2,3],[4,5,6]):
# body of loop using paired x and y