Why do some functions have underscores "__" before and after the function name?
The following special forms using leading or trailing underscores are recognized (these can generally be combined with any case convention):
_single_leading_underscore: weak "internal use" indicator. E.g.
from M import *does not import objects whose name starts with an underscore.
single_trailing_underscore_: used by convention to avoid conflicts with Python keyword, e.g.
__double_leading_underscore: when naming a class attribute, invokes name mangling (inside class FooBar,
_FooBar__boo; see below).
__double_leading_and_trailing_underscore__: "magic" objects or attributes that live in user-controlled namespaces. E.g.
__file__. Never invent such names; only use them as documented.
Note that names with double leading and trailing underscores are essentially reserved for Python itself: "Never invent such names; only use them as documented".
The other respondents are correct in describing the double leading and trailing underscores as a naming convention for "special" or "magic" methods.
While you can call these methods directly (
[10, 20].__len__() for example), the presence of the underscores is a hint that these methods are intended to be invoked indirectly (
len([10, 20]) for example). Most python operators have an associated "magic" method (for example,
a[x] is the usual way of invoking