Better code completion in python notebooks
If you are working locally (running e.g. starting up a Jupyter notebook from a terminal on localhost) code completiong should work just fine - I have never had any problems.

If you are running a Jupyter notebook attached to a Python process in a Docker container, there can be issues with code completion (the two-way communication may need to be activated).

You can try running the following ipython "magic command" that makes the interpreter greedy - this has worked for me in the past:

%config IPCompleter.greedy = True


Simply run that in the first Jupyter cell.

Here is a list of all built-in magic commands.

I am afraid I don't know of any differences in these cases between jupyter notebooks and Spyder.