The .ipynb format mixes source code with nondeterministic program output in the same file and regularly has backwards-incompatible format "upgrades". Those two make version control a nightmare. The files are also huge because they typically contain humongous base64-encoded PNGs.
The execution model also keeps invisible state in the running kernel, so fairly often if you restart the kernel and re-execute all cells, you'll get a traceback or, worse, subtly different results (and, alarmingly for something called a "notebook", your old results have been erased with no confirmation and no undo). This can happen for a variety of reasons, like deleting the definition of an object you are still using, or defining a new object in the last cell, using it in some subsequent cells, and then going back and changing some earlier cells to use it too.
If you get an .ipynb file from a coworker, you need to read it carefully before hitting "Execute all below" in case there's a cell saying something like "execute this cell to do an emergency shutdown of the production server", because that is a thing people do with entirely good intentions.
The .ipynb format mixes source code with nondeterministic program output in the same file and regularly has backwards-incompatible format "upgrades". Those two make version control a nightmare. The files are also huge because they typically contain humongous base64-encoded PNGs.
The execution model also keeps invisible state in the running kernel, so fairly often if you restart the kernel and re-execute all cells, you'll get a traceback or, worse, subtly different results (and, alarmingly for something called a "notebook", your old results have been erased with no confirmation and no undo). This can happen for a variety of reasons, like deleting the definition of an object you are still using, or defining a new object in the last cell, using it in some subsequent cells, and then going back and changing some earlier cells to use it too.
If you get an .ipynb file from a coworker, you need to read it carefully before hitting "Execute all below" in case there's a cell saying something like "execute this cell to do an emergency shutdown of the production server", because that is a thing people do with entirely good intentions.