Deep research uses aside, I often prefer to use IPython because it's simply a better shell than the default Python shell. You get basic niceties like tab completion and being able to up-arrow to revise an earlier multi-line command (like a function) without it being an exercise in frustration.
Indeed. If I could only figure out how to have it automatically run `from math import *` (and then present me with the interactive shell, I could use it as a calculator too.
ipython3 --InteractiveShellApp.exec_lines='["from math import *"]'
The latter command results in the following error:
[TerminalIPythonApp] CRITICAL | The 'exec_lines' trait of a TerminalIPythonApp instance must be a list, but a value of class 'str' (i.e. '["from') was specified.
$ ipython3 --InteractiveShellApp.exec_lines='["from math import *"]'
Python 3.6.5 |Anaconda, Inc.| (default, Apr 26 2018, 08:42:37)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: sin(5)
Out[1]: -0.9589242746631385
#! /bin/sh
# This is a bit hacky: we use the -i flag to force the interpreter into
# interactive mode after the initial commands are executed.
# The "proper" way to do this is probably to set up a PYTHONSTARTUP file
# and put the initial commands in there.
exec ipython3 --no-banner --no-confirm-exit -i -c '
from math import *
import random
import sys, os, platform
print("== IPython %s Calculator REPL ==" % platform.python_version())
'