Implementing Addition, subtraction, multiplication, division of numbers of different base and give result in desired base:
For the conversion to base ten, you can just use the normal int function. It takes as a second argument a base (as int). In this case the first argument is required to be a string (so it has exactly the same interface as your convert_to_base_10 function.

For the convert_from_base_10 function, I would do something closer to this answer. It is recursive, which should be fine here (unless you convert numbers with more than a thousand digits in binary, because one thousand is the default maximum recursion depth in Python). It is also a lot easier to read, IMO.

Finally, your calculation functions all proceed after the same scheme:


Convert the inputs to decimal
Calculate the result in decimal
Convert to the desired base


For this you could define a decorator that can wrap the actual calculation, which can then just assume everything is in base ten. So I would do:

def digit_to_char(digit):
    if digit &lt; 10:
        return str(digit)
    return chr(ord('a') + digit - 10)


def str_base(number,base):
    if number &lt; 0:
        return '-' + str_base(-number, base)
    d, m = divmod(number, base)
    if d &gt; 0:
        return str_base(d, base) + digit_to_char(m)
    return digit_to_char(m)


def calculate_in_decimal(func):
    def wrapper(n1, b1, n2, b2, b):
        n1_10 = int(n1, b1)
        n2_10 = int(n2, b2)
        ans = func(n1_10, n2_10)
        return str_base(ans, b)


# Use it like this:
@calculate_in_decimal
def addition(n1, n2):
    return n1 + n2


# Or use the operator module:
import operator
multiplication = calculate_in_decimal(operator.mul)
subtraction = calculate_in_decimal(operator.sub)


Note that I also fixed a bug, you wrote:

n1_10 = convert_to_base_10(n1,b1)
n2_10 = convert_to_base_10(n1,b1)


Where it should be:

n1_10 = convert_to_base_10(n1,b1)
n2_10 = convert_to_base_10(n2,b2)