Project Euler #4 "Largest Palindrome product" in Python
You are recomputing the product upper * lower three times:

    while upper &gt;= lower:
        if upper * lower &lt;= largest_palindrome:
            break
        if is_palindrome(upper * lower):
            largest_palindrome = upper * lower


You should save it in a variable:

    while upper &gt;= lower:
        product = upper*lower
        if product &lt;= largest_palindrome:
            break
        if is_palindrome(product):
            largest_palindrome = product


Also, how about this version of is_palindrome:

def is_palindrome(n):
  s = str(n)
  return (s == s[::-1])


Update

Replace your loops with for and xrange:

largest = 0
for lower in xrange(999,99,-1):
    for upper in xrange(999,lower-1,-1):
        ...


It makes the intent of your code a lot clearer, and it is easier to correctly write the loop.

(The following is note quite right)

Finally, if upper*lower &lt;= largest_palindrome, you actually return from the function:

        if upper * lower &lt;= largest_palindrome:
            return largest_palindrome


The return will essentially break out of both while loops. Using just break will only break out of the inner loop. Of course, the remaining cases will execute very quickly since they will only last one iteration of the inner loop, but it is still a good optimization to know about.