Project Euler # 56 Powerful digit sum in Python
Very nice code! Here are a few small comments, most of which are not something you have to change but rather food for thoughts as you learn more.


Although this is a matter of personal style, I would turn around your docstrings so what is returned comes first, if possible.

I.e. I would write

"""Generates all numbers of the form `a ** b` for `a, b &lt; n`."""
"""Return the sum of digits of the number `n`."""
"""Return the max sum of the digits of all numbers of the form `a ** b` for `a, b &lt; n`."""

If a generator expression is the only argument to a function, one pair of () can be omitted:

return max(get_digit_sum(num) for num in get_powers(n))

Although sometimes discouraged, if you need those last 10% of speed, this is slightly faster since int is a built-in function implemented in C:

def get_digit_sum(n):
    return sum(map(int, str(n)))

Nested for loops can be replaced with itertools.product, although here it is arguably harder to read instead of easier. For high levels of nestedness it can help increase readability, though.

from itertools import product

def get_powers(n):
    for num, power in product(range(n), range(n)):
        yield num ** power