expr = sqrt(2)*x*y/sin(2)/L
const = expr.func(*[term for term in expr.args if not term.free_symbols])
делает const
равным sqrt(2)/sin(2)
.Хотя вы спрашивали о продукте, этот подход также работает для сумм (expr.func будет Mul для продуктов и Add для сумм).
В комментарии barrymoo
указал метод is_constant
.Существует разница между not term.free_symbols
и term.is_constant()
.Первый проверяет только наличие свободных символов, что быстро;последний идет намного дальше, пытаясь вычислить, упростить и символьно дифференцировать, пытаясь доказать или опровергнуть, что выражение является постоянным ( ссылка ).Например, sin(x)**2 + cos(x)**2
будет признан константой, хотя у него есть свободный символ.