S1 = "Interesting stuff"S1[0] answer: "I"S1[-1] answer: "f"S1[:len(S1)] answer: "Interesting stuff"rubric: this one should be pretty straightforward. Quotation marks not required.
L1 = [[1,2,3],[],[4,5]]L1[1:] answer: [[],[4,5]]L1[1][0] answer: error (because we are trying to access position 0 (the first element) of an empty list, [])L1 + 2 answer: error (because we can only append lists to lists, not numbers to lists)L1 + [2] answer: [[1,2,3],[],[4,5],2]L1 + [[2]] answer: [[1,2,3],[],[4,5],[2]]rubric: also straightforward. Don’t need to say exactly why/what the error is, just that the result is an error.
time is a numeric value between 0 and 24 (inclusive) and is_weekday and is_mom are logical (Boolean) values, write a function that begins def answer_phone(hour,is_weekday,is_mom): and returns the correct logical value. answer: there are a lot of ways to do this; one isdef answer_phone(hour,is_weekday,is_mom):
    return(is_mom or
           (is_weekday and 7 <= hour <= 21) or
           (not is_weekday and 10 <= hour <= 24))rubric: -1 per mistake/failed case; -1 for not writing a function or failing to return a value. Best to return a true logical (True/False) value, but no deductions for returning something else sensible ("answer"/"don't answer"). Floor of 1 for a reasonable attempt.
(6 points) Write a function that takes a tuple and returns a version that is rotated by a specified integer amount (positive=right, negative=left), i.e. def rot(t,r): For example, rot((1,2,3),2) or rot((1,2,3),-1) should both result in (2,3,1). The tuple can be any length: e.g. rot((7,5,4,9,8),1) should produce (8,7,5,4,9). You can assume that the absolute value of r is less than len(t). rubric: -1 per silly error (failure to return a value, etc.); -2 per logical error. This might be the hardest one to correct. answer:
def rot(t,r):
return(t[-r:]+t[:-r])(4 points) What is the outcome of the following Python code?
L1 = [[0,0],[0,0]]
L2 = L1
L2[0][0] = 2
print(L1)Give a short (single sentence/phrase) explanation of what’s going on here. answer: the answer is [[2,0],[0,0]]. Because lists are mutable and we didn’t do anything fancy to get a deep copy, L2 and L1 point to the same memory location and changing the contents of L2 also changes the value of L1. rubric: 2 points for the right answer; 2 points for the explanation (anything reasonable mentioning “mutability”, “shallow copy”, “pointing to the same memory” should count)
z = 1
def fun(z):
    z = z + 1
    print(z)
    return(z)
print(fun(z))
print(z)answer: prints 2, 2, 1. Since numbers are immutable, changing the copy inside the function leaves the original value unchanged. rubric: 2 answer/2 explanation; explanation should mention something about immutability and function scope.
def fun(x):
    newterm = 1
    k = 0
    v = 0
    while newterm>1e-5:
        newterm = x**(-k)
        v += newterm
    return(v)answer: we forgot to modify k inside the while code block, so the function will loop forever (unless x is 0, but that’s an unnecessary subtlety).
def fun(x):
    newterm = 0
    k = 0
    v = 0
    while newterm>1e-5:
        newterm = x**(-k)
        v += newterm
        k += 1
    return(v)answer: we initialized newterm to 0, so the while condition will be False the first time through, so the function will always skip the loop and return 0. 
def fun(x):
    newterm = 1
    k = 0
    v = 0
    while newterm>1e-5:
        newterm = x**(-k)
        k += 1
    v += newterm
    return(v)answer: we incremented v outside the body of the loop, so the function will return a value of v that is just the last term of the sum.
fun(val,div,target,maxit) that returns the number of times (up to a maximum of maxit) you need to successively divide val by div before it is less than target. (You can assume that val, div, and target are all positive numeric values, that div is >1 [although it shouldn’t really matter] and that maxit is a positive integer.) If the function reaches maxit and the value is still greater than target, it should raise a ValueError. rubric: also hard to grade. -1 for silly problems (bad definition, no return); -2 for logic problems, including forgetting the maxit check or mis-implementing it. There are several possibilities for how to test the maxit criterion.def fun(val,div,target,maxit):
    """silly function for an exam"""
    it = 0
    while val>target and it<=maxit:
        val /= div ## or val = val/div
        it += 1    ## or it = it+1
    if it==maxit and val>target:
        raise ValueError
    return(it)