Pascal's triangle - Recursion
Rather than memoizing the applicable portion of Pascal's triangle, you could calculate the value much faster either along the row or along the diagonal.

Let \$n\$ represent the row and \$k\$ represent the column.  We know that \$\tbinom{n}{0}=1\$ and \$\tbinom{1}{k} = k\$.  To compute the diagonal containing the elements \$\tbinom{n}{0}\$, \$\tbinom{n+1}{1}\$, \$\tbinom{n+2}{2}\$, \$...\$, we can use the formula

$$
{n+k\choose k}= {n+k-1\choose k-1}\times \frac{n+k}{k}, ~ k &gt; 0.
$$

To calculate the diagonal ending at \$\tbinom{7}{2}\$, the fractions are \$\tfrac{6}{1}\$, \$\tfrac{7}{2}\$, and the elements are 

$$
\begin{align*}
\tbinom{5}{0}&amp;=1,\\
\tbinom{6}{1}&amp;=\tbinom{5}{0}\times\tfrac{6}{1}=1\times\tfrac{6}{1}=6,\\
\tbinom{7}{2}&amp;=\tbinom{6}{1}\times\tfrac{7}{2}=6\times\tfrac{7}{2}=21.\\
\end{align*}
$$

Looking up on the table to verify, \$pascal(7,2) = 21\$.

Applying this,

def pascal(row, column):
    """
    &gt;&gt;&gt; pascal(0, 0)
    1
    &gt;&gt;&gt; pascal(5, 4)
    5
    &gt;&gt;&gt; pascal(0, 1)
    0
    """
    if column == 0:
        return 1
    if row == 0:
        return column
    return (row * pascal(row-1, column-1)) / column


Other things you may want to consider are recognizing that there are bounds.  column and row must be positive and column is bounded to row+1.  

Indexing tricks on the column value could be employed to reduce the amount of calculations on the diagonal.

When a control structure interrupts the flow of a program like return does in your program, do not use elif or else.  This helps with readability (less of the control path to keep track of and reduces indentation on else) and improves maintainability.  Semantically both are equivalent, but in larger codebases, multiple control paths become a pain.