,可视化运行Python的神器。如果我们要运行Python,通常有两种方式。第一种方式是在Python或IPython的解释器环境下交互运行,另一种方式是作为程序员我最喜欢的是编写.py文件,在文件中编写python代码,然后运行。如果我们想写一篇关于Python的文章,文章里面有代码,我们想让代码在当前页面运行,可以吗?没错,就是使用我们今天要介绍的JupyterNotebook。JupyterNotebookJupyter项目与Ipython项目分离。在Ipython3.x之前,两者是一起发布的。在IPython4.x之后,Jupyter作为一个单独的项目进行开发和管理。因为Jupyter不仅可以运行Python程序,它还可以执行其他流程编程语言。JupyterNotebook由三部分组成。第一部分是一个Web应用程序,它提供了一个交互式界面,可以在其中运行相应的代码。上图是NoteBook的交互界面,我们可以对文档进行编辑、运行等操作。主要功能如下:浏览器内代码编辑、自动语法突出显示、缩进和制表符完成/自测试。从浏览器执行代码并将计算结果附加到生成它们的代码的能力。使用HTML、LaTeX、PNG、SVG等富媒体表示来显示计算结果。例如,可以嵌入由包含的matplotlib库呈现的出版质量的图形。使用Markdown标记语言(可以为代码提供注释)在浏览器中编辑富文本不仅限于纯文本。能够使用LaTeX轻松地将数学符号包含在降价单元格中,并由MathJax本机呈现。第二部分是NoteBook文件,里面存放了要运行的代码和一些描述信息。一般情况下,该文件以.ipynb为后缀存储。笔记本文档存储为json并使用base64编码。使用json的好处是可以方便的与不同服务器的数据进行交互。Notebook文档除了可执行代码文件外,还可以存储指令等解释性内容,让代码和解释性内容完美结合,特别适合做学习笔记。笔记本可以通过nbconvert命令导出为多种静态格式,包括HTML、reStructuredText、LaTeX、PDF等格式。此外,文档可以轻松地在网络上共享。第三部分是代码运行的核心Kernels。通过Kernels的不同组合,笔记本可以支持运行多种程序。例如:Python、java、go、R、ruby、nodejs等。这些Kernel和notebooks以Json的形式通过MQ进行通信。启动notebookserver在我们有了文档之后,如果我们想要运行这个文档,我们需要启动notebookserver。jupyternotebook默认会打开如下网址:http://127.0.0.1:8888启动时也可以指定打开的.ipynb文件:jupyternotebookmy_notebook.ipynb具体notebook界面的操作不会这里介绍一下,和普通的编译器基本一样。大家可以自行探索。notebook文档的结构notebook包含多个cell,每个cell包含一个多行文本输入框,里面的代码可以通过Shift-Enter或者工具栏的播放按钮来执行。这里的cell分为三种,分别是codecells、markdowncells和rawcells。代码单元代码单元允许您编辑和编写具有完整语法和选项卡突出显示的新代码。您使用的编程语言取决于内核,默认内核(IPython)运行Python代码。执行代码单元时,它包含的代码将发送到与笔记本关联的内核。该计算返回的结果将作为单元格的输出显示在笔记本中。输出不限于文本,还有许多其他可能的输出形式,包括matplotlib图形和HTML表格(例如pandas数据分析包中使用的那些)。让我们看一个代码单元格的例子:#%%importnumpyasnpmy_arr=np.arange(1000000)my_list=list(range(1000000))每个单元格由#%%分隔。Ipython本身也支持多种富文本显示格式,包括HTML、JSON、PNG、JPEG、SVG、LaTeX等。Ipython提供了一个显示方法,我们可以使用display来显示要呈现的对象:fromIPython.displayimportdisplaydisplay(obj)会搜索这个对象所有可能的显示类型,并选择最合适的类型进行显示,并存储结果是Notebook文档。如果要显示特定类型的对象,可以这样做:fromIPython.displayimport(display_pretty,display_html,display_jpeg,display_png,display_json,display_latex,display_svg)以显示图片为例:fromIPython.displayimportImagei=Image(filename='../images/ipython_logo.png')idisplay(i)上面的例子中,i包含了一个Image对象,直接调用i就可以显示出来,我们也可以调用display(i)进行显示.其他富文本类型可以参考Image,使用方法类似。markdowncellsmarkdown是一种简洁的标记语言,使用起来非常简单,应用也很广泛,所以notebook文档也支持markdown语法。先看一个markdowncell的例子:#%%md$pythonPython3.6.0|由conda-forge打包|(默认,2017年1月13日,23:17:12)[GCC4.8.220140120(RedHat4.8.2-15)]在linux上键入“help”、“copyright”、“credits”或“license”以获取更多信息。a=5print(a)notebook中可以使用5markdown中的语法。还支持标准LaTeX和AMS-LaTeX语法。原始单元格提供了一个可以直接写入输出的位置。Notebook不会对原始单元格的内容进行计算。将JupyterNotebooks作为模块导入有时我们想将JupyterNotebooks作为模块导入,但不幸的是,JupyterNotebooks并不是一个标准的python程序,但是Python提供了一些钩子程序可以让我们轻松地导入它们。首先,我们需要导入一些基本的API:importio,os,sys,typesfromIPythonimportget_ipythonfromnbformatimportreadfromIPython.core.interactiveshellimportInteractiveShell接下来,我们需要将NotebookFinder注册到sys.meta_path:sys.meta_path.append(NotebookFinder())这个NotebookFinder是定义的钩子。我们看一下NotebookFinder的定义:classNotebookFinder(object):"""定位JupyterNotebooks的模块查找器"""def__init__(self):self.loaders={}deffind_module(self,fullname,path=None):nb_path=find_notebook(fullname,path)ifnotnb_path:returnkey=pathifpath:#列表不可哈希key=os.path.sep.join(path)ifkeynotinself.loaders:self.loaders[key]=NotebookLoader(path)returnself.loaders[key]使用了两个重要的方法,find_notebook用于查找notebook,NotebookLoader用于加载notebook。看下find_notebook的定义:deffind_notebook(fullname,path=None):"""findanotebook,givenitsfullyqualifiednameandanoptionalpathThisturns"foo.bar"into"foo/bar.ipynb"andtriesturning如果Foo_Bar不存在,则将“Foo_Bar”转换为“FooBar”。“””name=fullname.rsplit('.',1)[-1]如果不是路径:path=['']fordinpath:nb_path=os.path.join(d,name+".ipynb")ifos.path.isfile(nb_path):returnnb_path#让importNotebook_Name找到"NotebookName.ipynb"nb_path=nb_path.replace("_","")ifos.path.isfile(nb_path):returnnb_path看下NotebookLoader的定义:classNotebookLoader(object):"""JupyterNotebooks模块加载器"""def__init__(self,path=None):self.shell=InteractiveShell.instance()self.path=pathdefload_module(self,fullname):"""将笔记本作为模块导入"""path=find_notebook(fullname,self.path)print("importingJupyternotebookfrom%s"%path)#loadthenotebookobjectwithio.open(path,'r',encoding='utf-8')asf:nb=read(f,4)#创建模块并将其添加到sys.modules#ifnameinsys.modules:#returnsys.modules[name]mod=types.ModuleType(fullname)mod.__file__=pathmod.__loader__=selfmod.__dict__['get_ipython']=get_ipythonsys.modules[fullname]=mod#额外的工作以确保会影响user_ns的魔法#实际上影响笔记本模块的nssave_user_ns=self.shell.user_nsself.shell.user_ns=mod.__dict__try:forcellinnb.cells:ifcell.cell_type=='code':#将输入转换为可执行的Pythoncode=self.shell.input_transformer_manager.transform_cell(cell.source)#运行模块中的代码exec(code,mod.__dict__)最后:self.shell.user_ns=save_user_nsreturnmod有了它们,我们就可以直接导入自己的笔记本了。本文已收录于http://www.flydean.com/12-jupyter-notebook/最流行的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等着你去探索!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!
