Вот так, например:
from math import log,e,exp
from tabulate import tabulate
def f(x):
#Обход вызова функции с None
if x==None:
return None
#Список условий области определения функции
if x<=0:
return None
else:
return log(x,e) #Функция первая
def g(x):
if x==None:
return None
#Список условий области определения функции. В данном случае ничего не делает.
if isinstance(x, complex):
return None
else:
return exp(x) #Функция вторая
#Диапазон для изменения x
xrng = range(-10,10,1)
#Вывод таблицы x-f(x)-g(x)-f(g(x))-g(f(x))
print(tabulate(zip(xrng,
[f(x) for x in xrng],
[g(x) for x in xrng],
[f(g(x)) for x in xrng],
[g(f(x)) for x in xrng]),
headers=['x', 'f(x)','g(x)','f(g(x))','g(f(x))'],
floatfmt=(".2f"),
tablefmt="simple_grid"))
Там где стоит комментарий "Функция первая" и "Функция вторая" - забивайте своих монстров. В качестве примера я использовал натуральный логарифм и экспоненту, чтобы было наглядно как суперпозиция возвращает само значение х.
Естественно в импорте надо будет добавить sin, cos, tan, sqrt, pi
В ветках if с комментарием "Область определения" написать свои ограничения.