CS30 - Spring 2015 - Class 21

Example code in this lecture

   matrix_aliasing.py

Lecture notes

  • schedule for the rest of the semester
       - office hours Friday 10-11am
          - will also be checking e-mail regularly
       - Adam mentor session, Sunday 8-9:30pm
       - review Monday, 5-6pm (I'll e-mail the location)
       - assignments
          - assignment 10: due Friday 4/24
          - assignment 11: due Friday 5/1
       - last week of class:
          - final exam review
          - senior final exams
       - everyone else final exam: 5/11

  • classes next semester

  • assignment 8 solution review

  • assignment 9 advice
       - one error in starter in get_any_available_cell
          - "is_filled" -> "self.is_filled"

       - init
          - there's a difference between how we're storing the board and how we display the board
             - we're storing a matrix of entries that have one of two things
                - integer (if it's been filled in)
                - list of integer if it hasn't been
             - we can display this any way we want
                - __str__ does it in a "pretty" way by only displaying the filled in entries
                - get_raw_string prints out all of the information

          - be careful about aliasing
             - look at matrix_aliasing.py code
                - there are 6 different examples that create matrices with the rows [1,2,3]
                - which are correct?
                   - semi-correct: when we print it out it looks correct
                   - fully-correct: each row is independent and changing one doesn't affect the others
                - we can test semi-correctness by running them all and printing them out
                - look at the print_out_all function in matrix_aliasing.py code
                   - creates a list of functions called "functions"
                      - remember, functions are just like any other type
                      - we can refer to them by using their name without the parenthesis (with the parenthesis calls that function)
                   - functions[i] references entry i in the function list
                   - and we call that function with parameter 3: functions[i](3)
                      - this is the same as if we'd done:
                         f = functions[i]
                         f(3)
                   - all of them look like they're working correctly
                - what does test_all do?
                   - creates a matrix using each method
                   - mutates (i.e. changes) the first entry to be 100
                   - checks if that changed more than just the first entry (in this case, the second row, first column)
                - if we run test_all we see:
                   Testing create_matrix1: Passed! :)
                   Testing create_matrix2: Failed aliasing :(
                   Testing create_matrix3: Passed! :)
                   Testing create_matrix4: Passed! :)
                   Testing create_matrix5: Failed aliasing :(
                   Testing create_matrix6: Failed aliasing :(
                - why did 2, 5 and 6 not pass and 1, 3 and 4 pass?
                   - 1, 3 and 4 all create NEW lists for each row
                      - 3: range creates a new list
                      - 4: row[:] copies the list, creating a new list
                   - 2, 5 and 6 result in a matrix where all of the rows references the SAME list


          - a couple of simple checks for init to avoid aliasing:
             - do the example in the assignment and make sure it works
                - this won't check for aliasing, but it will check that the right information is there
             - change an entry in the board and make sure only that entry changes:
                >>> s = SudokuState()
                >>> s.board[0][0][0] = 100
                >>> print s.get_raw_string()

       - test each method individually
          - look at the examples from assignment 8 about how to do this
          - try and isolate the one method you're working on as much as possible
          - don't move on and code any of the other methods until you're *very* confident that method works correctly

       - think about what each method is doing and how you might use that in other methods

       - if your code doesn't work, put in print statements to understand *why* it's not working
          - try and isolate the point at which the code does something that you don't expect

       - look at starter

       - run a few examples through the code
          - look at what the boards look like after being setup, but before solving