jupyter使用技巧
本文包括如下内容
- 快捷键
- 魔法命令
- 扩展
- 主题设置
- 制作slides
- 小工具
- 其他技巧
基于windows10操作系统。
快捷键
快捷键规律
- 对文本进行操作的快捷键都是
Ctrl Shift Alt
等,比如Ctrl + C/V/X/Z/A
- 对Cell(即jupyter中的单元格)进行操作的快捷键都是
Esc
,比如Esc + C/V//X/Z
。
还有一个差别在于,用Ctrl
必须和字母同时按下生效,而Esc
可以先按,再按字母。
最常用快捷键
Esc + A/B 在上/下方添加Cell
Esc + M Cell模式设置为 markdown
Esc + D + D 删除单元格
Esc + 1/2/<num> 设置为一/二/n级标题
Ctrl + Enter 运行当前Cell,选中当前Cell
Shift + Enter 运行当前Cell,选中下一个Cell
Alt + Enter 运行当前Cell,创建新的Cell并进入编辑模式
Ctrl + / 批量注释与取消注释
Tab 代码提示
Shift + M 合并选中单元格
Shift + Tab 查看函数帮助文档(点击加号可以看详细内容)
Ctrl + F 全局搜索,其实就像在其他网页里搜索一样
Alt + left/right 光标移动到行首/尾
按住Alt拖动鼠标 多行编辑、矩形选框
按住Ctrl在多个位置点击鼠标 多处同时编辑
不那么常用快捷键
Esc + Y Cell模式设置为 code
Esc + F Cell内查找和替换
Ctrl + Shift + - 在光标所在位置拆分单元格
Enter 从选中Cell模式进入编辑模式
比如Ctrl+Enter后就是选中Cell的模式,再按一下Enter就进入了编辑模式
或者Esc+B新建了一个Cell,或Esc+M后,要按一下Enter进入编辑模式
查看更多快捷键可以在菜单栏中选择Help-Keyboard Shortcuts
。
魔法命令
魔法命令规律
- 单个百分号表示对这一行有效,放在单行行首
- 两个百分号表示对这一个Cell有效,放在Cell最开头,单独一行
比如time
计算程序运行时间
%time
一个Cell中写入
import time
%time time.sleep(0.5)
输出结果
Wall time: 500 ms
也可以这样
import time
for i in range(10):
%time time.sleep(0.1)
%%time
一个Cell中写入
%%time
import time
for i in range(10):
time.sleep(0.1)
运行输出整个Cell的运行时间。
常用的魔法命令
1.matplotlib绘图
%matplotlib inline
,一个notebook中只需要运行一次,则之后用matplotlib
库作图不需要plt.show()
即可把图展示出来。
2.运行py文件
%run hello.py
,运行这个文件,就相当于把文件中的代码复制过来跑一遍。文件中导入的库、定义过的变量、函数都会进入到notebook的环境中,这和import
不同。
3.调用系统命令
系统命令只需要在前面加一个!
即可在jupyter cell中运行,比如windows的cmd命令
!where python
在linux系统中,则可以使用!ls
或!wget
等命令。
也可以用%%bash
运行整个Cell的shell命令。
4.导入模块自动更新
有时我们自己写了一个模块,用import
导入使用。但是这个模块需要重复修改。修改后重新import
是无效的,而每次reload
非常麻烦,所以jupyter给我们提供了一个自动更新修改的方式。在笔记本开头运行下面两条命令
%load_ext autoreload
%autoreload 2
则只要模块中函数被更改,再在notebook中调用时,就会自动使用更新后的版本。具体效果可以参考官网
5.列出全局变量
有三个查看当前所有变量的命令
%who 列出所有变量
%who_ls 以列表形式列出所有变量
%whos 展示所有变量更详细的信息
也可以只列出某种类型的变量
%who list
%who function
%who int
个人不那么常用的魔法命令
%lsmagic 展示所有魔法命令
%timeit 运行100000次测试运行时间(比%time更加准确,避免了单次运行的偶然性)
%qtconsole 调出新的ipython窗口,和当前notebook之间变量可以共享
%prun %%prun 展示每一步代码的运行时间
%load hello.py 将hello.py这个文件中的代码导入这个Cell
%pycat hello.py 查看hello.py文件内容
%%writefile hello.py 将当前Cell中代码写入hello.py文件中
还有一个%store
,可以在两个notebook之间传递变量
在一个notebook中运行
a = 1
%store a
在另一个notebook中运行
%store -r a
则可以在新notebook中调用a
变量。
更多命令参考官网
扩展
jupyter的扩展包含着非常多实用功能,在命令行中运行下面一条命令即可完成安装
conda install -c conda-forge jupyter_contrib_nbextensions
安装完成后打开jupyter会发现界面多了extension选项卡
里面有非常多扩展可以选择。点击其中一项,下方会展示该扩展的介绍,勾选前面的框则启用该功能。
个人认为有必要一个一个尝试这些扩展,因为绝大多数都很有用,可以根据使用习惯选择其中一部分。下面列举一些我常用的扩展(按重要性排序)
Table of Contents 侧边栏展示目录
Collapsible Headings 折叠标题
Snippets 代码片段
Hightlight selected word 高亮和选中词相同的词
Codefolding 代码折叠
Scratchpad 可以用Ctrl+B调出一个单独的窗口
Notify 运行比较久的代码,运行结束时提示
zenmode 更专注的模式
Limit Output 限制输出字符数
2to3 Converter 将python2代码转化为python3
还有许多其他好用的扩展,如Variable Inspector
变量查看器,Hinterland
动态代码提示,ExecuteTime
展示程序运行时间等等,读者可以自己多多挖掘。
选择扩展时如果不小心取消了Nbextensions dashboard tab,则会发现下一次进入jupyter不会显示extension选项卡,因此也难以再设置回来。要调出这个界面,就在浏览器中输入这个链接http://localhost:8888/nbextensions
。
主题设置
1.jupyterthemes
库
如果觉得jupyter默认的颜色比较难看,可以更换主题,用jupyterthemes
库,有哪些主题可以参考官网
用下面一条命令安装这个库
pip install jupyterthemes
更换主题是在命令行中使用jt
这个命令,各种主题的安装详情参考官网,读者可以多尝试,选择自己喜欢的主题。下面是我选择的主题。
jt -t grade3 -T -N
2.更改CSS
换主题后可能还是对一些细节不够满意,这时可以通过修改CSS样式来实现。比如想减小代码行间距和字体,就可以在.jupyter/custom/custom.css
文件文件中找到div.CodeMirror pre
,修改如下
div.CodeMirror pre {
font-family: consolas, consolas;
font-size: 11.5pt;
line-height: 120%;
color: #303030;
}
制作slides
在notebook中选择view-->cell toolbar-->slideshow
,这样每个cell的右上角都可以选择类型
-
Slide
配合一级标题,单页作为章标题。通过左右切换 -
Sub-Slide
配合二级标题,作为页标题。通过上下切换 -
-
直接显示的内容 -
Fragment
需要点击才显示的内容(实现动态效果) -
Skip
在生成的slides中不显示 -
Notes
备忘,不再slides中显示
制作完成后,比如是abc.ipynb
文件,则在该文件所在文件夹中打开命令行输入
jupyter-nbconvert --to slides abc.ipynb --reveal-prefix 'https://cdn.bootcss.com/reveal.js/3.5.0' --output abc
即生成了abc.slides.html
文件,这就是可以用于展示的slides文件。
不过这样制作slides有一个缺陷,就是文本字体太小,代码字体太大,而且难以调节(无法通过在浏览器中缩放来调整)。
除此之外可以使用扩展RISE,随时预览,且可以在展示时编辑。
小工具
1.进度条
安装tqdm
库
pip install tqdm
在Cell中运行下面代码
from tqdm import tnrange, tqdm_notebook
from time import sleep
l = list(range(5))
for i in tqdm_notebook(l, desc='first'):
for j in tnrange(5, desc='second', leave=True):
sleep(0.1)
会发现每一次循环都有一个进度条。
2.数据科学交互式工具
主要有这两个工具
详细使用方法请参考官网。
3. 嵌入网页/pdf
在Cell中运行下面代码
from IPython.display import IFrame
IFrame('https://en.wikipedia.org/wiki/Distribution', width=800, height=450)
会发现维基百科的页面被嵌入到了notebook里,而且里面的链接都可以在output里跳转,感觉非常酷!
但是有很多网页都无法通过这种方式访问,比如知乎、github、stackoverflow等。
pdf也是可以嵌入的
from IPython.display import IFrame
IFrame('https://arxiv.org/pdf/1512.03385.pdf', width=800, height=450)
其他技巧
1. 不用print即可输出多个变量
比如下面一段代码
a, b = 1, 2
a
b
运行结果只会展示b
的值,如果要同时展示a b
的值,需要使用print
,如下所示
a, b = 1, 2
print(a)
print(b)
如果希望不需要print
即可同时输出a b
的值,则可以先运行下面这两行代码,则之后在这个笔记本中执行代码都不需要print
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
如果不喜欢这个配置,要改回来只需要
InteractiveShell.ast_node_interactivity = "last"
更多选项参见官网
题外话:如果想直接打变量名不输出,只需要在后面加一个;
,这个在plt.hist()
的使用中比较有用。
2. 默认执行代码
本节分为两个部分:修改默认配置,默认执行代码。
像上一节的print
配置,如果希望对所有notebook都适用,不用每次都重新指定,可以在配置文件中修改。只需要在~/.ipython/profile_default/ipython_config.py
文件中添加
c = get_config()
c.InteractiveShell.ast_node_interactivity = "all"
保存后重新打开notebook会发现这些配置自动生效。
(如果该路径下没有这个文件则创建一个,用这条命令ipython profile create
)
配置这个文件的另一个功能是执行默认代码,即有一些代码希望在每一个notebook都默认执行时,可以像这样写入配置文件
c.InteractiveShellApp.exec_lines = [
'import sys; sys.path.append("C:\\Miniconda3\\Lib\\site-packages")',
'import matplotlib.pyplot as plt; %matplotlib inline'
]
3. 将ipynb文件转化为py文件
文本内容全部变成注释
ipython nbconvert --to python abc.ipynb
另一种方式:在notebook页面菜单中选择 File-->Download as-->py
4.自定义快捷键:复制当前行到下一行
用文本编辑器时可能对一个快捷键产生了习惯:Shift + Alt + Up/Down
,可以将当前行复制到上一行或下一行。而在jupyter中自定义快捷键不是很方便,目前找到了下面一种实现方法。
在~/.jupyter/custom/custom.js
这个文件中加入
CodeMirror.keyMap.pcDefault["Shift-Alt-Down"] = function(cm){
// get a position of a current cursor in a current cell
var current_cursor = cm.doc.getCursor();
// read a content from a line where is the current cursor
var line_content = cm.doc.getLine(current_cursor.line);
// go to the end the current line
CodeMirror.commands.goLineEnd(cm);
// make a break for a new line
CodeMirror.commands.newlineAndIndent(cm);
// filled a content of the new line content from line above it
cm.doc.replaceSelection(line_content);
// restore position cursor on the new line
cm.doc.setCursor(current_cursor.line + 1, current_cursor.ch);
};
即可实现Shift + Alt + Down
,将当前行复制到下一行。这部分是参考的stackoverflow
另外,jupyter中是可以通过javascript自定义快捷键的,详情参考官网