[第三章 Part3]
安装并使用IPython Notebook
IPython Notebook现在叫Jupyter Notebook。2011年,由Brain Granger领导的IPython团队开始开发一种基于Web技术的交互式计算文档格式,即IPython Notebook.
它有这一种基于JSON的文档格式.ipynb,可以轻松分享代码、输出结果及图片等内容。
现在已经不能通过ipython notebook --pylab=inline命令来访问。而是需要使用jupyter notebook。
可以通过pip install jupyter notebook来安装。
命令行运行jupyter notebook即可运行。
重新加载模块依赖项
如果使用%run执行某段脚本,之后又对脚本进行了修改,则脚本中的import some_lib需要重新加载。因为Python是“一次加载”模块系统。(这里不同于matlab等,会自动应用代码修改)。解决这个问题有两个办法:使用Python内置的reload函数,如:
import some_lib
reload(some_lib)
2. 使用IPython停的特殊dreload函数,来解决模块的“深度”(递归)重加载。如:
import some_lib
dreload(some_lib)
若仍不行,则需重启IPython即可.
注意:由于一个模块或包可能会在一个程序中的不同位置多次引入,所以Python会在第一次引入这些模块时对其进行缓存,而不是每次都执行模块中的代码。否则,应用程序的模块化和良好的代码组织等手段就达不到高效的目的了。
扁平结构要比嵌套结构好
“扁平结构要比嵌套结构好”的思想来自“Zen of Python”(这是Tim Peters 2004年写的一首诗,执行“import this”可得),它对交互式的代码开发模块同样有效。编写函数和类时应尽量注意低耦合和模块化,这样可以使它们更易于测试、调试和交互式使用。
无惧大文件
如果曾经学过Java等,可能会有人告诉你“尽量保持文件的小型化”。然而咋IPython中开发代码时,处理10个小文件(但互相关联的)可能会更让人头疼。更少的文件意味着重新加载的模块更少,编辑时需要在各个文件中间的跳转次数更少。作者发现维护更大的(具有高内聚度的)模块会更实用也更具有Python特点。在解决完问题之后,有时将大文件拆分成小文件会更好。
对于大型代码库而言,找到一种合乎逻辑的模块、包架构需要花点功夫,对团队工作更重要。每个模块都应该具有足够高的内聚度,而且能够更直观的找到对应各种功能的函数和类。
高级IPython功能
让你的类对IPython更加友好
对于许多对象(如字典、列表、元组等),内置的pprint模块就能给出漂亮的格式,但是对于自定义的类,必须自己生产所需的字符串输出。如下简单的类:
class Message:
def __init__(self,msg):
self.msg = msg
运行则输出:
由于IPython会获取__repr__方法返回的字符串,并显示在控制台上,因此需要增加一个__repr__方法,代码修改为如下:
class Message:
def __init__(self,msg):
self.msg = msg
def __repr__(self):
return 'Message: %s' %self.msg
然后运行输出:
个性化和配置
IPython shell在外观(如颜色、提示符、行间距等)和行为方面的大部分内容都可以进行配置。如:修改颜色方案。
修改输入输出提示符。
去掉Out提示符跟下一个In提示符之间的空行。
执行任意Python语句。(可以引用所有常用的东西,或者希望每次启动IPython都发生的事情)。
启用IPython扩展,如line_profiler中的魔术命令%lprun。
定义自己的魔术命令或系统别名。
这些配置选项都在ipython_config.py的文件中。这个文件中的注释很详细可以参考。假如你想专门为某个应用程序或项目量身定做一套IPython配置,输入下面的命令即可新建一个个性化设置:
ipython profile create secret_project
然后编辑这个profile_secret_project目录中的配置文件,在用如下方式启动IPython。
ipython --profile=secret_project
******
IPython profile: secret_project
关于个性化和配置方面的详细信息,可参考IPython的在线文档。