Learn
Python by writing code and visualizing execution
This free educational application allows teachers and students to write Python scripts directly in the web browser, execute those scripts, single-step forwards and backwards through execution, and view the run-time state of all data structures.
Rather than displaying a bland text-based console, the Online Python Tutor provides a rich visualization of variables, heap objects, and stack frames. For example, the following code:
x = ["Alice", "Bob", "Charlie"] y = x z = ["Alice", "Bob", "Charlie"]
will be visualized as the following HTML diagram, which properly shows aliasing relationships:

Go play with the Online Python Tutor!
Solve
programming problems by writing Python code
The Online Python Tutor also allows students to practice solving programming problems like those they would receive for class assignments or technical job interviews.
It provides web-based interfaces for writing solution and test code, executing on a series of graded test inputs, and showing what tests passed and failed.

The above screenshot shows passed and failed tests. The user can click on the "Debug me" button besides one of the sad faces to debug why the program failed on a particular test.
Here are some sample practice problems:
Debug
existing programs that almost work properly
Using the Online Python Tutor's bidirectional single-stepping and data structure visualization capabilities, students can practice debugging, an important skill which is rarely covered in web-based programming problems.
They can work on problems like, "Change at most 2 lines of code to make this almost-correct Python program work properly." Here are some sample debugging problems:
Optimize
existing programs to run using fewer instructions
Students can practice refactoring already-correct programs to run faster and execute fewer instructions.
They can work on problems like, "Optimize this program so that it terminates correctly after running less than 50 lines of Python code." Here are some sample optimization problems:
Create
new practice problems in plain text format
Teachers can easily create new practice problems by writing them in a lightweight plain text format. For example, reverse.txt provides the specification for the Reverse list problem.
The problem specification format allows constraints like "code diffs must be less than N lines" (used for debugging problems) and "tests must terminate in at most M executed Python lines" (used for optimization problems).
I plan to add support for semantic constraints like "don't allow the program to create any auxiliary data structures", which could be used for problems like "merge these two lists in-place without creating any new temporary lists".