网易首页 > 网易号 > 正文 申请入驻

可视化运行Python的神器Jupyter Notebook

0
分享至

简介

如果我们想要运行Python,通常有两种方式,第一种方式就是在Python或者IPython的解释器环境中进行交互式运行,还有一种方式就是程序员最喜欢的编写.py文件,在文件中编写python代码,然后运行。

如果我们想写一篇关于Python的文章,文章里面有代码,还希望代码能够在当前页面运行,可不可以做到呢?

可以的,那就是使用我们今天要介绍的Jupyter Notebook。

Jupyter Notebook

Jupyter项目是从Ipython项目中分出去的,在Ipython3.x之前,他们两个是在一起发布的。在Ipython4.x之后,Jupyter作为一个单独的项目进行开发和管理。因为Jupyter不仅仅可以运行Python程序,它还可以执行其他流程编程语言的运行。

Jupyter Notebook包括三个部分,第一个部分是一个web应用程序,提供交互式界面,可以在交互式界面中运行相应的代码。

上图是NoteBook的交互界面,我们可以对文档进行编辑,运行等操作。

主要的功能如下:

  • 在浏览器中进行代码编辑,自动语法突出显示,缩进和制表符完成/自检功能。

  • 从浏览器执行代码的能力,并将计算结果附加到生成它们的代码上。

  • 使用诸如HTML,LaTeX,PNG,SVG等富媒体表示来显示计算结果。例如,可以内嵌包含matplotlib库渲染的具有出版质量的图形。

  • 使用Markdown标记语言在浏览器中对富文本进行的编辑(可以为代码提供注释)不仅限于纯文本。

  • 使用LaTeX轻松在markdown单元中包含数学符号的能力,并由MathJax本地呈现。

第二个部分就是NoteBook的文档了,这个文档存储了要运行的代码和一些描述信息。一般这个文档是以.ipynb的后缀进行存储的。

notebook文档是以json的形式存储的,并用base64进行编码。使用json的好处就是可以在不同的服务器中方便的进行数据的交互。

Notebook documents中除了可运行的代码文件,还可以存储说明等解释性内容,从而将代码和解释内容完美结合,尤其适合做学习笔记使用。

笔记本可以通过nbconvert命令导出为多种静态格式,包括HTML,reStructuredText,LaTeX,PDF等多种格式。

另外文档还可以方便的在网络上进行共享。

第三个部分就是代码运行的核心Kernels,通过不同的Kernels搭配,notebook可以支持运行多种程序。比如:Python,java,go,R,ruby,nodejs等等。

这些Kernels和notebook之间是以Json的形式通过MQ来进行通信的。

启动notebook server

有了文档之后,如果我们想要运行文档,需要启动notebook server。

jupyter notebook

默认情况下会开启下面的URL:http://127.0.0.1:8888

启动的时候还可指定要打开的.ipynb文件:

jupyter notebook my_notebook.ipynb

具体的notebook界面的操作这里就不多介绍了,基本上和普通的编译器差不多。大家可以自行探索。

notebook document 的结构

notebook中包含了多个cells,每个cell中包含了多行文本输入字段,可以通过Shift-Enter 或者工具栏中的播放按钮来执行其中的代码。

这里的cell有三种类型,分别是code cells,markdown cells和raw cells。

code cells

代码单元允许您编辑和编写新代码,并突出显示完整的语法和制表符。您使用的编程语言取决于内核,默认内核(IPython)运行Python代码。

执行代码单元时,它包含的代码将发送到与笔记本关联的内核。然后,从该计算返回的结果将在笔记本中显示为单元格的输出。输出不仅限于文本,还有许多其他可能的输出形式,包括matplotlib图形和HTML表格(例如,在pandas数据分析包中使用的表格)。

我们看一个code cells的例子:

#%%

import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))

每个单元格是以 #%% 来进行分隔的。

Ipython本身还支持多种富文本的展示格式,包括HTML,JSON,PNG,JPEG,SVG,LaTeX等。

Ipython提供了一个display方法,我们可以使用display来展示要呈现的对象:

from IPython.display import display

display(obj) 将会寻找这个对象所有可能的展示类型,并从中挑选一个最适合的类型进行展示,并将结果存储在Notebook文档里面。

如果你想展示特定类型的对象,那么可以这样:

from IPython.display import (
display_pretty, display_html, display_jpeg,
display_png, display_json, display_latex, display_svg
)

举个展示图片的例子:

from IPython.display import Image
i = Image(filename='../images/ipython_logo.png')
i
display(i)

上面的例子中i包含了一个Image对象,直接调用i即可展示,我们也可以显示的调用display(i)

其他的富文本类型可以参考Image,使用方法都是类似的。

markdown cells

markdown是一种简介的标记语言,使用起来非常简单,使用范围非常广泛,所以notebook document也支持markdown的语法。

先看一个markdown cell的例子:

#%% md

```python
$ python
Python 3.6.0 | packaged by conda-forge | (default, Jan 13 2017, 23:17:12)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 5
>>> print(a)
5
```

markdown中的语法在notebook中都是可以用的。

还支持标准的LaTeX 和 AMS-LaTeX语法。

raw cells

原始单元格提供了一个可以直接写入输出的位置。notebook不会对原始单元格中的内容进行计算。

以模块的形式导入Jupyter Notebooks

有时候我们希望以模块的形式导入Jupyter Notebooks,但是可惜的是,Jupyter Notebooks并不是一个标准的python程序,不过Python提供了一些钩子程序,让我们能够方便的进行导入。

首先,我们需要导入一些基本的API :

import io, os, sys, types

from IPython import get_ipython
from nbformat import read
from IPython.core.interactiveshell import InteractiveShell

接下来需要注册NotebookFinder到sys.meta_path:

sys.meta_path.append(NotebookFinder())

这个NotebookFinder就是定义的钩子。

我们看下NotebookFinder的定义:

class NotebookFinder(object):
"""Module finder that locates Jupyter Notebooks"""
def __init__(self):
self.loaders = {}

def find_module(self, fullname, path=None):
nb_path = find_notebook(fullname, path)
if not nb_path:
return

key = path
if path:
# lists aren't hashable
key = os.path.sep.join(path)

if key not in self.loaders:
self.loaders[key] = NotebookLoader(path)
return self.loaders[key]

里面使用了两个重要的方法,find_notebook用来找到notebook,和NotebookLoader,用来加载notebook。

看下find_notebook的定义:

def find_notebook(fullname, path=None):
"""find a notebook, given its fully qualified name and an optional path

This turns "foo.bar" into "foo/bar.ipynb"
and tries turning "Foo_Bar" into "Foo Bar" if Foo_Bar
does not exist.
"""
name = fullname.rsplit('.', 1)[-1]
if not path:
path = ['']
for d in path:
nb_path = os.path.join(d, name + ".ipynb")
if os.path.isfile(nb_path):
return nb_path
# let import Notebook_Name find "Notebook Name.ipynb"
nb_path = nb_path.replace("_", " ")
if os.path.isfile(nb_path):
return nb_path

看下NotebookLoader的定义:

class NotebookLoader(object):
"""Module Loader for Jupyter Notebooks"""
def __init__(self, path=None):
self.shell = InteractiveShell.instance()
self.path = path

def load_module(self, fullname):
"""import a notebook as a module"""
path = find_notebook(fullname, self.path)

print ("importing Jupyter notebook from %s" % path)

# load the notebook object
with io.open(path, 'r', encoding='utf-8') as f:
nb = read(f, 4)

# create the module and add it to sys.modules
# if name in sys.modules:
# return sys.modules[name]
mod = types.ModuleType(fullname)
mod.__file__ = path
mod.__loader__ = self
mod.__dict__['get_ipython'] = get_ipython
sys.modules[fullname] = mod

# extra work to ensure that magics that would affect the user_ns
# actually affect the notebook module's ns
save_user_ns = self.shell.user_ns
self.shell.user_ns = mod.__dict__

try:
for cell in nb.cells:
if cell.cell_type == 'code':
# transform the input to executable Python
code = self.shell.input_transformer_manager.transform_cell(cell.source)
# run the code in themodule
exec(code, mod.__dict__)
finally:
self.shell.user_ns = save_user_ns
return mod

有了他们,我们就可以直接import我们自己编写的notebook了。

本文已收录于 http://www.flydean.com/12-jupyter-notebook/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现! 欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
当日本高端产业永久停产,世界才发现:日本的稀土布局全是空架子

当日本高端产业永久停产,世界才发现:日本的稀土布局全是空架子

牛锅巴小钒
2026-06-24 10:23:20
王治郅怒了!首秀7分8板却遭前辈炮轰:别在外面瞎挡拆 给我进去凿

王治郅怒了!首秀7分8板却遭前辈炮轰:别在外面瞎挡拆 给我进去凿

刘哥谈体育
2026-06-24 10:16:56
泽连斯基越线了!把手伸向台海南海,真以为中国会一忍再忍?

泽连斯基越线了!把手伸向台海南海,真以为中国会一忍再忍?

故事终将光明磊落
2026-06-24 12:58:36
中国至今未掌握的7大技术,从中看出,和日本的差距到底有多大

中国至今未掌握的7大技术,从中看出,和日本的差距到底有多大

傲傲讲历史
2026-06-19 00:38:08
603259,强势涨停!CRO概念股,集体爆发!

603259,强势涨停!CRO概念股,集体爆发!

证券时报e公司
2026-06-24 13:57:04
历史要毁于一旦?已经独立百年的蒙古,正把中国40年的努力毁掉!

历史要毁于一旦?已经独立百年的蒙古,正把中国40年的努力毁掉!

户外钓鱼哥阿旱
2026-06-21 15:19:53
CCTV5直播!韩国迎“生死战”,孙兴慜PK福斯特,赢球=亚洲第一队

CCTV5直播!韩国迎“生死战”,孙兴慜PK福斯特,赢球=亚洲第一队

篮球圈里的那些事
2026-06-23 18:55:12
6尺9+6尺10!马刺选两锋线补强最弱一环:昆坦斯右膝还将接受手术

6尺9+6尺10!马刺选两锋线补强最弱一环:昆坦斯右膝还将接受手术

颜小白的篮球梦
2026-06-24 11:31:31
章含之有多美?1956年和男友洪君彦在北京的留影,21岁她气质不凡

章含之有多美?1956年和男友洪君彦在北京的留影,21岁她气质不凡

元哥说历史
2026-06-24 08:10:07
资治通鉴:凡是在社会上混的好的人,不是因为多勤奋,也不是因为多自律,更不是因为朋友遍天下,而是深谙这两点人性

资治通鉴:凡是在社会上混的好的人,不是因为多勤奋,也不是因为多自律,更不是因为朋友遍天下,而是深谙这两点人性

心理观察局
2026-06-24 08:42:09
7月3日油价将迎大幅下调 每吨预计降幅630元

7月3日油价将迎大幅下调 每吨预计降幅630元

蚌埠日报
2026-06-22 10:59:17
中央气象台发布暴雨、强对流、台风预警,云南、广西等地局部地区有大暴雨

中央气象台发布暴雨、强对流、台风预警,云南、广西等地局部地区有大暴雨

界面新闻
2026-06-24 06:53:04
快船用首轮5号签选中了来自伊利诺伊大学的基顿-瓦格勒

快船用首轮5号签选中了来自伊利诺伊大学的基顿-瓦格勒

懂球帝
2026-06-24 08:38:16
中国男篮结束热身赛,两人必须淘汰,球迷呼吁徐杰回归打河村勇辉

中国男篮结束热身赛,两人必须淘汰,球迷呼吁徐杰回归打河村勇辉

宗介说体育
2026-06-24 13:57:12
湖北省纪委监委通报:汪祥旺被查

湖北省纪委监委通报:汪祥旺被查

黄河新闻网吕梁
2026-06-24 08:58:05
俄乌战争打了4年多,中国终于明白:统一台湾前,这3种人必铲除

俄乌战争打了4年多,中国终于明白:统一台湾前,这3种人必铲除

谭麤爱搞笑
2026-06-07 09:21:42
中方投下赞成票

中方投下赞成票

政知新媒体
2026-06-24 09:57:23
休赛期多队争抢哈登!四大下家候选,回归火箭或赴马刺冲冠

休赛期多队争抢哈登!四大下家候选,回归火箭或赴马刺冲冠

星Xin辰大海
2026-06-24 10:24:18
字母交易牵扯出第二条大鱼!场均28+7已和球队闹掰,火箭领跑交易

字母交易牵扯出第二条大鱼!场均28+7已和球队闹掰,火箭领跑交易

你的篮球频道
2026-06-24 09:00:35
多款水果遭高浓度甜蜜素浸泡,你还敢吃吗

多款水果遭高浓度甜蜜素浸泡,你还敢吃吗

松林侃世界
2026-06-23 04:43:33
2026-06-24 14:51:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

豆包专业版上线:定价68-500元每月

头条要闻

郑丽文称国民党追求和平但不放弃自我防卫 国台办回应

头条要闻

郑丽文称国民党追求和平但不放弃自我防卫 国台办回应

体育要闻

字母哥,会把凯尔特人拆了吗?

娱乐要闻

向佐向佑兄弟合体直播!母子终于和解

财经要闻

爆料人:如果我错了,赔偿坐牢都接受

汽车要闻

施鹏泽:为什么奥迪E7X强调座舱气味安全?

态度原创

本地
亲子
旅游
公开课
军事航空

本地新闻

吃一次广东龙舟饭,才懂什么是豪华盛宴

亲子要闻

爸爸接4岁女儿放学,在路上吓唬女儿,没想到到家就跟妈妈告状!

旅游要闻

山为骨,水为血,天地为窖,时光为曲,酿一杯迎驾山河

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

伊朗代表:霍尔木兹海峡已免费开放

无障碍浏览 进入关怀版