The Zen of python says "Explicit is better than implicit". Every function or container has some expectation about what types you can put in and which ones will not.
It makes sense to just write that down explicitly, either as checked static types, unchecked gradual types, or as something like a doc comment.
A function may work just fine on a wide variety of different types. For example, a function that adds two things may work just as well on integers, floats, strings, and arrays. You can define interfaces or traits and implement them for every type you want to support but it's a lot of work just to prove that a function works that you know works anyways.
Even worse, sometimes a function works just fine on many types but it wasn't considered when the function was written so there is no easy way to make it accept a interface instead, especially if the function is from some third party package that can't be modified. Just allowing any type that supports the required operators and methods solves this issue.