TextWidget and TextareaWidget objects now include a placeholder attribute, for displaying placeholder text before the user has typed anything.

The %load magic can now find the source for objects in the user namespace. To enable searching the namespace, use the -n option. In [1]: %lo ad -n my_module.some_function

DirectView objects have a new use_cloudpickle() method, which works like view.use_dill() , but causes the cloudpickle module from PiCloud’s cloud library to be used rather than dill or the builtin pickle module.

Added a .ipynb exporter to nbconvert. It can be used by passing --to notebook as a commandline argument to nbconvert.

New nbconvert preprocessor called ClearOutputPreprocessor . This clears the output from IPython notebooks.

New preprocessor for nbconvert that executes all the code cells in a notebook. To run a notebook and save its output in a new notebook: ipython nbconvert InputNotebook --ExecutePreprocessor.enabled=True --to notebook --output Executed

Consecutive stream (stdout/stderr) output is merged into a single output in the notebook document. Previously, all output messages were preserved as separate output fields in the JSON. Now, the same merge is applied to the stored output as the displayed output, improving document load time for notebooks with many small outputs.

NotebookApp.webapp_settings is deprecated and replaced with the more informatively named NotebookApp.tornado_settings .

Using %timeit prints warnings if there is atleast a 4x difference in timings between the slowest and fastest runs, since this might meant that the multiple runs are not independent of one another.

It’s now possible to provide mechanisms to integrate IPython with other event loops, in addition to the ones we already support. This lets you run GUI code in IPython with an interactive prompt, and to embed the IPython kernel in GUI applications. See Integrating with GUI event loops for details. As part of this, the direct enable_* and disable_* functions for various GUIs in IPython.lib.inputhook have been deprecated in favour of enable_gui() and disable_gui() .

A ScrollManager was added to the notebook. The ScrollManager controls how the notebook document is scrolled using keyboard. Users can inherit from the ScrollManager or TargetScrollManager to customize how their notebook scrolls. The default ScrollManager is the SlideScrollManager , which tries to scroll to the nearest slide or sub-slide cell.

The function interact_manual() has been added which behaves similarly to interact() , but adds a button to explicitly run the interacted-with function, rather than doing it automatically for every change of the parameter widgets. This should be useful for long-running functions.

The %cython magic is now part of the Cython module. Use %load_ext Cython with a version of Cython >= 0.21 to have access to the magic now.

The Notebook application now offers integrated terminals on Unix platforms, intended for when it is used on a remote server. To enable these, install the terminado Python package.

The Notebook application can now edit any plain text files, via a full-page CodeMirror instance.

Setting the default highlighting language for nbconvert with the config option NbConvertBase.default_language is deprecated. Nbconvert now respects metadata stored in the kernel spec.

IPython can now be configured systemwide, with files in /etc/ipython or /usr/local/etc/ipython on Unix systems, or %PROGRAMDATA%\ipython on Windows.

Added support for configurable user-supplied Jinja HTML templates for the notebook. Paths to directories containing template files can be specified via NotebookApp.extra_template_paths . User-supplied template directories searched first by the notebook, making it possible to replace existing templates with your own files. For example, to replace the notebook’s built-in error.html with your own, create a directory like /home/my_templates and put your override template at /home/my_templates/error.html . To start the notebook with your custom error page enabled, you would run: ipython notebook '--extra_template_paths=["/home/my_templates/"]' It’s also possible to override a template while also inheriting from that template, by prepending templates/ to the {% extends %} target of your child template. This is useful when you only want to override a specific block of a template. For example, to add additional CSS to the built-in error.html , you might create an override that looks like: {% extends "templates/error.html" %} {% block stylesheet %} {{super()}} <style type="text/css"> /* My Awesome CSS */ </style> {% endblock %}

Added a widget persistence API. This allows you to persist your notebooks interactive widgets. Two levels of control are provided: 1. Higher level- WidgetManager.set_state_callbacks allows you to register callbacks for loading and saving widget state. The callbacks you register are automatically called when necessary. 2. Lower level- the WidgetManager Javascript class now has get_state and set_state methods that allow you to get and set the state of the widget runtime. Example code for persisting your widget state to session data: %%javascript require(['widgets/js/manager'], function(manager) { manager.WidgetManager.set_state_callbacks(function() { // Load return JSON.parse(sessionStorage.widgets_state || '{}'); }, function(state) { // Save sessionStorage.widgets_state = JSON.stringify(state); }); });