Search code examples
pythonpython-3.xcomplex-numbers

How does the `j` suffix for complex numbers work? Can I make my own suffix?


I know what are complex numbers and how they mathematically work, but how is it done for python to know it's complex just by putting a j after a digit ?

>>> j
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>> 1*j
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>> 1j
1j
>>> 1j**2
(-1+0j)

Can I make my own suffix, let's say p (for strictly positive) ?

Could I do something working like this ?

>>> ... some weird stuff here ...
>>> p
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'p' is not defined
>>> 1*p
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'p' is not defined
>>> -1p
1p
>>> 0p
1p
>>> 

Solution

  • This is built into Python's grammar, just like the decimal point is, or the e in scientific notation (1e10 etc.). The j makes a numeric literal imaginary.

    Python does not allow you to change this. That doesn't mean you can't--you could amend the grammar--but then the language is no longer Python.

    The closest approximation allowed in Python would be by implementing an operator.

    >>> class StrictlyPositive:
        def __rmatmul__(self, number):
            return abs(number)
    
    
    >>> p = StrictlyPositive()
    >>> -1@p
    1
    

    But you have to be careful of operator precedence when doing stuff like this. Why not just use the builtin abs directly?