2.3 Jupyter
2.3.1 初识Jupyter
Jupyter项目
Jupyter项目是一个非盈利的开放源代码项目,2014年从IPython项目中诞生,因为它发展到支持跨所有编程语言的交互式数据科学和科学计算。Jupyter将始终是100%开源软件,免费供所有人使用,并根据修改后的BSD许可证的自由条款发布。
Jupyter是通过Jupyter社区的共识在Github上公开开发的。Jupyter项目的存在是为了开发开放源代码软件、开放标准和跨几十种编程语言的交互式计算服务。
Ipython
IPython提供了对Python编程语言的扩展,使交互工作变得方便和高效。这些扩展是在ipython内核中实现的,并且在运行这个内核时,可以在所有ipython前端(笔记本、终端、控制台和qt控制台)中使用。
Jupyter Notebook
Jupyter Notebook是一个开源的Web应用程序,允许您创建和共享包含实时代码、公式、可视化和叙述性文本的文档。用途包括:数据清洗和转换、数值模拟、统计建模、数据可视化、机器学习等。
Jupyter项目的一个主要组成部分是笔记本,一种用于代码、文本(带或不带标记)、数据可视化和其他输出的交互式文档。Jupyter笔记本与内核交互,内核是Jupyter交互式计算协议的任何编程语言的实现。python的Jupyter内核使用ipython系统作为其底层行为。
Jupyter Notebook拥有以下优点:
多种语言支持
该笔记本支持40多种编程语言,包括python、r、julia和scala。
共享笔记本
笔记本可以通过电子邮件、Dropbox、Github和Jupyter笔记本查看器与其他人共享。
交互式输出
您的代码可以生成丰富的交互式输出:HTML、图像、视频、乳胶和自定义MIME类型。
大数据融合
利用来自python、r和scala的大数据工具,如ApacheShark、Pandas、Scikit Learn、Ggplot2、TensorFlow一起探索相同的数据。
Jupyter Lab
JupyterLab是jupyter项目下一代基于Web的用户界面。Jupyter Lab极大地拓展了Jupyter Notebook的功能,提供了更为优秀的用户体验。使用Jupyter Lab,我们可以同实在一个浏览器界面打开并编辑多个Notebook,Jupyter console和cmd终端(对于*nix来说,是terminal),并且支持预览和编辑更多种类的文件,如diamagnetic文件,Markdown文档,json,yml,csv,等,还可以使用Jupyterlab连接Onedrive等云存储服务,极大得提升了生产力。且Jupyter Lab遵循Jupyter社区指南。
2.3.2 IPython
安装
安装Ipython
pip install ipython
安装并在Jupyter中注册Ipython核心:
python -m pip install ipykernel
python -m ipykernel install [--user] [--name <machine-readable-name>] [--display-name <"User Friendly Name">]
更多帮助
python -m ipykernel install --help
基本使用
除了ipython命令外,您可以在命令行上启动ipython shell,就像启动常规的python解释器一样:
许多种类的python对象的格式都是为了更可读或更美观地打印,这与普通的打印方式不同。如果您在标准的python解释器中打印这些数据变量,那么它们的可读性将大大降低:
print函数
IPython还提供了执行任意代码块(通过某种美化的复制粘贴方法)和整个Python脚本的工具。您也可以使用Jupyter Notebook来处理较大的代码块。
从表面上看,ipython外壳看起来像是标准终端python解释器(用python调用)的一个不同版本。与标准的python shell相比,它的一个主要改进是标签完成,在许多IDE或其他交互计算分析环境中都可以找到。在shell中输入表达式时,按tab键将在命名空间中搜索与迄今键入的字符匹配的任何变量(对象、函数等)。、
Ipython是Jupyter Notebook与Jupyter Lab的基础,只要掌握了Ipython的用法,就可以轻松的将开发环境迁移到Jupyter Notebook与Jupyter Lab上来。我们鼓励您在Jupyter Labs上对本节代码进行实践。
读取文档
使用计算机编程技术在科学研究和工程应用中解决问题,最频繁的需求之一就是获取文档。在Python中,每一个对象都有一个文档字符串(docstring)的引用。该文档字符串,包含了Python对象的概述、用法等相关信息。使用help()函数可以获取这些对象的使用方法。当help函数作用于函数或者方法时,help函数还可以返回他们的用法。下面让我们使用help()函数获取abs函数的用法.
In[1]:help(abs)
Help on built-in function abs in module builtins:
abs(x, /)
Return the absolute value of the argument.
此外,在Ipython中还可以使用问号”?”获取文档。让我们在Ipython中试试吧!
In[1]: ?abs
Signature: abs**(x,** /)
Docstring: Return the absolute value of the argument.
Type: builtin_function_or_method
符号”?”既可以放在行首也可以放至行尾。
在Ipython中获取列表的文档:
In[1]: list?
Init signature: list**(iterable=(),** /)
Docstring:
Built-in mutable sequence.
If no argument is given, the constructor creates a new empty list.
The argument must be an iterable if specified.
Type: type
Subclasses: _HashedSeq, StackSummary, SList, _ImmutableLineList, FormattedText, NodeList, _ExplodedList, Stack, _Accumulator, _ymd, ...
如果,我们需要创建自己的函数或自定义对象,希望获取他们的文档,又该怎么做呢?只需要在函数或对象创建语句的第二行以多行注释的形式加入注释,就完成了文档的创建。
我们创建一个计算平方数的函数,并创建文档
In[]:def square(x):
'''
Return the square of x'''
return x*x
square(3.14)
Out[]:9.8596
查看square函数的文档:
In[]:? square
Signature: square**(x)**
Source:
Signature: square**(x)**
Docstring: Return the square of x
File: d:\jupyterdo\<ipython-input-74-563ca1869869>
Type: function
我们创建一个狗的基类,并创建文档
In[]:class Dog:
'''
dogs' base class
'''
dogCount=0
def _init_(self, name, age):
self.name = name
self.age = age
Dog.dogCount += 1
def showcount(self):
print("Total dogs %d" % dogCount.dogcount)
def showage(self):
print("Name : ", self.name, ", Age: ", self.age)
In[]:? Dog
Init signature: Dog**(name,** age**)**
Docstring: dogs' base class
Type: type
Subclasses:
查看Dog类的文档:
In[]:? Dog
Init signature: Dog**(name,** age**)**
Docstring: dogs' base class
Type: type
Subclasses:
读取源代码
在Ipython中可以使用双问号”??”获取源代码。
查看square函数的源代码:
In[]:?? square
Signature: square**(x)**
Source:
def square**(x):**
'''
Return the square of x'''
return x*****x
File: d:\jupyterdo\<ipython-input-74-563ca1869869>
Type: function
查看Dog.showage方法的源代码:
In[]:?? Dog.showage
Signature: Dog**.showage(self)**
Docstring: <no docstring>
Source:
def showage**(self):**
print**("Name : ",** self**.name,** ", Age: ", self**.age)**
File: d:\jupyterdo\<ipython-input-67-b51896ab7fa6>
Type: function
快捷键
Ipython中的快捷键分为四类:导航快捷键、文本输入快捷键、命令历史快捷键与其他快捷键。表2.4对这些快捷键进行了简要的介绍。掌握这些快捷键会使编程工作事半功倍。如果您拥有*nix下shell或者文本编辑器(Vim、Emacs等)的使用经验,您将会很快上手。
表2.4 Ipython常用快捷键
导航快捷键
Ctrl + a
移动光标至行首
Ctrl + e
移动光标至行尾
Ctrl + b(或方向左键)
向后移动光标
Ctrl + f(或方向右键)
向前移动光标
文本输入快捷键
Backspace
删除前一个字符
Ctrl + d
删除后一个字符
Ctrl + u
从行首剪切字符至光标
Ctrl + k
从光标剪切字符至行尾
Ctrl + y
粘贴文本
Ctrl + t
交换前两个字符
命令历史快捷键
Ctrl + p(或方向上键)
获取前一个历史命令
Ctrl + n(或方向下键)
获取后一个历史命令
Ctrl +r
对历史命令的反向搜索
其他快捷键
Ctrl + l
清除终端内容
Ctrl + c
中断命令
Ctrl + d
退出Ipython会话
I/O记录
除了使用Ctrl+p和Ctrl+n快捷键获取历史命令。Ipython还提供了多种获取历史命令的而输出方式。我们将会在本节对这些命令进行介绍。
IPython输入输出对象
经过前边简单的例子,您可能已经熟悉了IPython的输入输出提示符In[]和Out[]。这些In/Out提示符实际上就是本节所讲的IPython输入输出对象。它们不仅形式美观,还提供了获取输入和输出历史的功能。只需输入希望查看的代码所在的输入或输出提示符,就可以查看输入输出历史:
In[10]: In[1]
Out[10]:’help(abs)’
Out:[11]: Out[22]
Out[11]: ’help(abs)’
但不是所有的In[]对象都有一个与之配对的Out[]对象,
还可以使用不带编号的In与Out对象,查看所有输入和输出记录。其中In是一个列表,按照命令的运行顺序记录命令。Out对象是一个字典,字典的键是输入对象的序号,字典的值是输入对象的输出。
In[12]:In
Out[12]: ['', 'help(abs)', "get_ipython().run_line_magic('pinfo', 'abs')", "get_ipython().run_line_magic('pinfo', 'list')",
…
'In[1]', 'Out[10]', 'In']
In[12]:Out
Out[12]: {4: 9.8596, 10: 'help(abs)', 11: 'help(abs)', 12: ['', 'help(abs)', "get_ipython().run_line_magic('pinfo', 'abs')",
…
'In[1]',
'Out[10]',
'In',
'Out']}
输出历史
除了使用Out[]与Outdui想获取输出历史外,还可以通过下划线符号”_”获取历史输出。
使用单下划线,可以查看前一条历史输出,使用双下划线,可以查看前两条历史输出。使用三下划线则可以查看前三条历史输出。
In[]:print(_)
Out[]:{4: 9.8596, 10: 'help(abs)', 11: 'help(abs)', 12: ['', 'help(abs)', "get_ipython().run_line_magic('pinfo', 'abs')",
…
'In[1]',
'Out[10]',
'In',
'Out']}
In[]:print(__)
Out: ['', 'help(abs)', "get_ipython().run_line_magic('pinfo', 'abs')", "get_ipython().run_line_magic('pinfo', 'list')",
…
'In[1]', 'Out[10]', 'In']
In[]:print(___)
Out[]:help(abs)
IPython至多支持三条下划线查看历史输出。当需要查看超过三条以上的历史输出时,请使用Out[]对象。
抑制输出
如果不希望某句代码的输出保存在输出历史中,就需要对某一句代码的进行输出抑制。最简单的输出抑制方法就是在代码行末加入一个分号”;”。
In[]:3+2;
值得注意的是,分号仅仅抑制了Ipython的输出,但是并没有抑制代码的运算。
shell命令
Python作为一种解释语言的一大优势在于它的可交互性。就像*nix用户与shell交互的的那样,shell不断将用户命令解释送入内核后运行。然而标准Python解释器下,无法输入shell命令。如果有同时使用python和shell进行开发的需求,那么用户就不得不在标准python解释器与shell之间来回切换。
令人惊喜的是,Ipython提供了执行shell命令的功能。通过在感叹号”!”键入shell命令,Ipython可以像在*nix terminal下那样执行shell命令。
如果读者使用的是windows操作系统,也大可不必沮丧。这得多亏了Bash On windows计划,现在在windows系统中运行*nix shell命令。Bash On Windows是微软的“Microsoft Love Linux”计划中重要的一环,目的是能让Windows用户能在系统中运行Linux子系统(Windows Subsystem for Linux, WSL)。用户只需要将计算机升级到windows10 1709版本之后,就可以直接在Windows中获得原生Linux Bash级别的体验。
魔法命令
我们在前面已经学习了许多Ipython命令,但是最精彩命令的当属于我们本节所讲的 魔法命令(函数)了!您或许能从其他开发工具上使用之前讲过的普通命令,但是Ipython的魔法命令却独树一帜,拥有强大的功能!
魔法命令有两种形式:行魔法(line magic)和单元魔法(cell magic)。行魔法命令使用单个百分号“%“字符作为前缀,作用域为单行代码;单元魔法命令使用两个百分号”%%”作为前缀,作用于多行输入。
表2.5 对常见的Ipython魔法命令进行了简要的介绍。
表2.5 Ipython常用魔法命令
魔法函数帮助
? <magic_function>
查看魔法命令文档
% magic
查看所有魔法命令相关描述,实例
% lsmagic
查看魔法命令列表
代码分析
% time
代码段计时(一次执行)
% timeit
代码段计时(多次执行以获得更高精度)
% prun
使用分析器运行代码
% lprun
使用逐行分析器运行代码
% memit
测量单个语句的内存使用
% mprun
使用逐行内存分析其运行代码
代码调试
%xmode
控制异常
%debug
代码调试
外部代码粘贴
%past
粘贴代码块
%cpast
打开交互式多行输入提示
外部代码执行
% run
执行外部.py代码
接下来我们将对上述部分魔法命令进行介绍。
粘贴代码块
传统的C/C++语言使用括号来控制代码的作用域,在Python中则采用缩进的表示形式来决定代码的作用域。因此,在从其他软件向Ipython解释器粘贴多行代码时,可能会出现缩进错误等错误。使用Ipython的%paste魔法命令可以很好的解决这个问题。而#cpaste则可以打开一个交互式多行输入提示。
shell魔法
当我们通过Ipython操作shell时会发现,我们并不能cd命令来改变的工作路径。这是因为,Ipython中的shell命令都是在一个临时的shell中执行的。例如:
In[]:! cd #查看当前工作目录
C:\
In[]: ! cd D:\JupyterDo\source_code_of_.py
In[]: !cd
C:\
如果希望更改Ipython工作目录,可以使用%cd 魔法命令。
In[]: % cd #查看当前工作目录
C:\
In[]: % cd D:\JupyterDo\source_code_of_.py
In[]: % cd
D:\JupyterDo\source_code_of_.py
除了%cd魔法名另外,Ipython中还可以使用%ls, %man, %cp, %mv, % cat, %mkdir, %pwd, %dir等*nix shell相关的魔法命令
如果想要省略百分号”%”直接使用shell魔法,可以通过%automagic魔法函数进行翻转,翻转后,Ipython工作环境将变为shell环境,无法进行Python代码交互,但是若在代码前加入”%”后,Ipython将会认为此代码为Python代码,会按照Python语言的解释方法对代码进行解释。
对于一些常见的*nix 命令,不需要调用”%”号,就可以实现对应魔法命令的功能。
执行外部代码
在实际开发中,有时出于代码重用等需要,我们还要使用到.py文件存储的代码。使用%run魔法命令,可以在IPython会话中运行这些代码,而不需要使用标准Python解释器对他们进行执行。让我们使用魔法命令执行例3.1Bubble_sort.py文件(假设该文件位于D:/JupyterDo/source_code_of_.py下)。该文件的功能是:对10个随机数进行排序。
In[]:%cd D:/JupyterDo/pycode
%run 3.1Bubble_Sort.py
Out[]:D:\JupyterDo\pycode
排序前: [0.465243390293376, 0.701488505240007, 0.7796559068947894, 0.6495607567281101, 0.4003995588286813, 0.7207742339736103, 0.5812010361696163, 0.6222503023701531, 0.8460218550960557, 0.3789957134672691]
排序后: [0.8460218550960557, 0.7796559068947894, 0.7207742339736103, 0.701488505240007, 0.6495607567281101, 0.6222503023701531, 0.5812010361696163, 0.465243390293376, 0.4003995588286813, 0.3789957134672691]
代码分析
IPython提供了许多代码分析魔法命令,如代码计时命令%time,内存分析命令:%memit等。下面我们对这些代码进行逐一介绍。
使用%timeit或%%timeit可以让重复运行单行或整个多行代码来计算代码的平均运行时间。
In[]:%timeit sum(range(100))
Out[]:52.2 µs ± 731 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
使用%time或%%time可以计算一次单行或整个多行代码的平均运行时间。
In[]:%time sum(range(1000))
Wall time: 0 ns
Out[]:499500
在大部分情况下,重复操作计魔法命令%timeit时可以提高计算代码运行时间的精度,但是在某些情况下,却会引入额外的误差。如,对一个列表进行排序,第一次运行排序程序时,列表中的元素已经有序,因此接下来的排序操作要比第一次排序操作都要快。
但是这并不意味着%time魔法命令%timeit魔法命令更加精确。%timeit命令会在底层阻止系统调用对于计时过程的干扰操作,如Python的垃圾回收。而time却并不会这么做。因此,如果代码运行时间较长而较短的系统延迟对计时影响较小的话,可以使用%time魔法命令。在一般情况下,%timeit要比%time得出的代码运行时间更少。
魔法命令文档
Ipython中的魔法命令也有文档。可以在魔法命令行首或行末加上问号“?“来获取目标魔法命令的文档:
In[]:?%time
…
使用%lsmagic魔法命令可以获得所有可用的魔法命令的列表。
In[]:%lsmagic
使用%magic魔法命令可以获得可用魔法命令的通用描述及实例。
%magic
…
2.3.3 Jupyter Notebook
安装
激活python环境,若使用conda安装,则键入:
conda install jupyter notebook
若使用pip安装,则键入:
pip install jupyterlab
使用
要启动Jupyter,请在终端运行命令Jupyter notebook:
图
在许多平台上,Jupyter将在默认的Web浏览器中自动打开(除非您以无浏览器启动它)。否则,您可以导航到启动笔记本时打印的httpaddress,这里是http://localhost:8888/。如图2-1所示。
图:
要创建新笔记本,请单击“新建”按钮并选择“python 3”。您应该看到类似图2-2的内容。在Jupyter Notebook中,一对In Out会话被称作一个代码单元(Cell)。单击空代码“cell”并输入一行python代码。然后按shift enter即可执行。
Jupyter Server
许多人使用jupyter作为本地计算环境,但它也可以部署在服务器上并远程访问。下面我们设置Jupyter远程服务器。
打开终端,键入以下命令:
jupyter notebook --generate-config
打开ipython,键入以下命令:
from notebook.auth import passwd
passwd()
输入密码,保存获得加密有的密码
修改家目录下,./jupyter/jupyter_notebook_config.py中的配置,在文件最后添加以下代码:
c.NotebookApp.ip = '0.0.0.0' #所有绑定服务器的IP都能访问,若想只在特定ip访问,输入ip地址即可
c.NotebookApp.port = 6666 #将端口设置为自己喜欢的吧,默认是8888
c.NotebookApp.open_browser = False #我们并不想在服务器上直接打开Jupyter Notebook,所以设置成False
c.NotebookApp.notebook_dir = '/home/zwj/jupyter3_projects' #这里是设置Jupyter的根目录,若不设置将默认root的根目录,不安全
c.NotebookApp.allow_root = True # 为了安全,Jupyter默认不允许以root权限启jupyter
c.NotebookApp.terminals_enabled = False # 关闭terminal
c.NotebookApp.password = u'sha1:508ebedea861:ffd1d5bd358d7d812fba3094dea7b5b461a81870'
在本地计算机浏览器中键入http://<JupyterServerIP>:<Port> ,即可访问Jupyter Server,进行远程开发。
虽然jupyter笔记本可以感觉到与ipython shell不同的体验,但是本章中的几乎所有命令和工具都可以在任何一个环境中使用。
2.3.4 Jupyter Lab
安装
激活python环境,若使用conda安装,则键入:
conda install -c conda-forge jupyterlab #使用conda安装
若使用pip安装,则键入:
pip install jupyterlab
使用
相较于Jupyter Notebook,Jupyter Lab提供了大量编程实用功能,如分屏操作,终端操作等,还可以对主题进行修改。
Jupter Lab是Jupyter Notebook的进阶,提供超越Jupyter Notebook的体验,极大地提高了生产效率。Jupyter Lab是Python数据科学方面最强大的生产工具。我们强烈建议,在Jupyter Lab上完成数据科学的学习。图[]是Jupyter Lab的开发界面。
图Jupyter Lab开发环境
Last updated
Was this helpful?