Notebooks are a widely used tool in data science, due to the fact they allow you to both explore and tinker with data in a friendly and interactive interface. The most obvious notebook tool is Jupyter of course, widely used in this book to refer to code.
Jupyter has grown very much in the last years, following the flourishing and establishment of data science as a consolidated field, especially for those people using Python as their main coding companion. However, Jupyter, which was born from within the Python community, embraces other languages as well. It has a full IDE, Jupyter Lab, and a bunch of other tools with which you can create data stories integrated with graphs and widgets for interactivity, as well as a way to share notebooks for view in a sleek interface, the Jupyter Notebook Viewer, used in this book. It is pretty awesome and in continuous improvement.
Jupyter is nowadays also widely used not only within the industry, but also in the research/academic communities.
Google has set up this tool that allows you to run notebooks without any setup whatsoever, and it even gives you the use of a GPU or a TPU, so it's well suited to run ML models, you can easily give it a go and there's many example notebooks they provide already for you to copy and customise.
A Rule et al, Ten Simple Rules for Reproducible Research in Jupyter Notebooks, ArXiv, 2018
Observable for Jupyter users, an Observable notebook by Observable itself