A str in Python is an immutable sequence of Unicode code points.
These could include letters, diacritical marks, positioning characters, numbers, currency symbols, emoji, punctuation, space and line break characters, and more.
Strings implement all common sequence operations, and can be iterated through using for item in <string> or for index, item in enumerate(<string>) syntax.
Strings can be concatenated with +, or via <str>.join(), split via <str>.split(<separator>), and offer multiple types of formatting, interpolation, and templating.
Being immutable, a str object's value in memory doesn't change; methods that appear to modify a string return a new copy or instance of str.
For a deep dive on what information a string encodes (or, "how does a computer know how to translate zeroes and ones into letters?"), this blog post is enduringly helpful.
The Python docs also provide a very detailed unicode HOWTO that discusses Pythons support for the Unicode specification in the str, bytes and re modules, considerations for locales, and some common issues with encoding and translation.