I like to try and disprove results I am trying to understand. 

Sometimes I'll give it a good month- I start by constructing perverse sequences and little heuristic arguments- when I'm onto something good I'll pursue it 'til it's rigorous: more often than not it turns out to be precisely the case disallowed by the theorem's assumptions. 

After a while I start to paint my counter-arguments in generalities "An A is not a B if A has perversity X" and I look for the exact line in the proof where 'perversity X' is (perhaps implicitly) dealt with and debunked. Sooner or later I start to see what every line in the proof is for, moreover I start to see why it must be true.

It may not be the fastest way to learn, but it's certainly entertaining if you're having trouble sleeping!

One can also apply the same trick to definitions and constructions by trying to prove that they are useless/degenerate.

Making sure that you have comprehended a concept
What is the point of using an else clause if there is a return instruction in the except clause?

def foo():
    try:
        # Some code
    except:
        # Some code
        return
    else:
        # Some code


I'm asking this question because the Django documentation does it at some point, in the vote() function. Considering that the return instruction in the except clause will anyway stop the execution of the function, why did they use an else clause to isolate the code that should only be executed if no exception was raised? They could have just omitted the else clause entirely.
