Check if a Binary Tree is full
The binary tree here consists of either None or TreeNode, so all
functions should accept both of these objects as arguments, but
is_leaf currently breaks when passed a None node.  This
representation is also a bit problematic, because if you get a None
somewhere, how do you know it's meant to be a tree?

If that case is included, then the first check in is_full can be
removed.  Otherwise I don't see anything else to optimise, though the
results for checking the variables against for None could possibly be
cached so the code is minimally faster for huge trees.

Also,


the indentation is inconsistent, TreeNode has four spaces in
__init__.  You know,
PEP8.
if len(x): is less clear than, e.g. if x:, but in both cases it's
relying on conversions from int/list to bool, so not very clear.