times_table(n, upto) returning the first upto multiples of n as a list — and then full_table(n_max, upto) returning a list of such rows for every n from 1 to n_max, both as comprehensions.full_table(2, 3)
[[1, 2, 3], [2, 4, 6]]
Row for 1 and row for 2, three multiples each.
times_table is [n * k for k in range(1, upto + 1)].
full_table wraps it in another comprehension over n.