编辑推荐:

本文来源csdn,本文简单的介绍了IPython高级用法,IPython进行高效开发与操作系统交互,希望对您的学习有帮助。

一、 IPython基础

1.1 代码自动补全:Tab键

可补全内容包括:变量名、函数名、成员变量函数、目录文件

1.2 内省(Itrospection)

在变量名之前或之后加上问号(?),这样可以显示这个对象的相关信息。

如果这个对象是个函数或实例方法,那么它的docstring也会被显示出来。

使用还将显示该函数的源代码

还能搜索IPython命名空间。一些字符再配以通配符(*)即可显示出所有与其相匹配的名称。如,我们可以列出NumPy顶级命名空间中含有load的所有函数:

1.3 %run 命令

在IPython回话环境中,所有文件都可以通过%run命令当做Python程序来运行。

脚本的行为和在标准命令行环境(通过python xxx.py启动的)中执行时一样,此后,在文件中所定义的全部变量就可以子当前IPython

shell中访问了。

如果Python脚本需要用到命令行参数,可以将参数放到文件路径后面

中断正在执行的代码:任何代码在执行时,只要按下Ctrl+C,就会引发一个KeyboardInterrupt。

1.4 执行剪贴板中的代码

在IPython中执行代码最简单的方式就是粘贴剪贴板中的代码。如果你不想为一段代码新建一个文件,那么可以试试这种方法。在windows中可以使用右键的粘贴命令粘贴,这会模仿IPython的多行输入功能。

1.5 键盘快捷键

Ctrl-C 终止当前正在执行的代码

Ctrl-A/E 光标移动到行首/行尾

Ctrl-U 清除当前行

Ctrl-L 清屏

1.6 异常和跟踪

如果某段代码发生了异常,IPython默认会输出整个调用栈,还会附上调用栈各点附近的几行代码作为上下文参考。

上下文代码参考数量可由%xmode魔术命令进行控制,稍后还会介绍如如何进行调试。

1.7 魔术命令

IPython有一些特殊的命令。有的为常见任务提供便利,有的则使你能够轻松控制IPython系统的行为。

魔术命令是以百分号%为前缀的命令。

魔术命令可以看做运行于IPython系统中的命令行程序,它们大都还有一些参数选项。在命令后面加问号(?)可以查看。

魔术命令默认是可以不带百分号使用的,只要没有定义与其同名的变量即可。这个功能可以通过%automagic命令打开或者关闭。

通过%quickref或%magic命令可以查看所有的命令。

常用的魔术命令如下:

%quickref thon快速参考

%magic 显示magic command详细文档

%debug 从最新的异常跟踪的底部进入交互式调试器

%hist 打印命令输入历史

%pdb 在发生异常后自动进入调试器

%paste 执行剪贴板中的Python代码

%cpaste 打开一个特殊的提示符以便手工粘贴待执行的代码

%reset 删除interactive空间中的全部变量/名称

%run 执行一个python脚本

%page 分页显示一个对象

%time 报告statement执行的时间

%timeit 多次执行statement以计算平均执行时间,用于执行时间非常小的代码。

%who、%who_is、%whos 显示Interactive命名空间的中定义的变量,信息级别/冗余度可变

%xdel 删除变量,并尝试清楚其在IPython中的对象上的一切引用

1.8 基于Qt的富GUI控制台

启动方法(同时开启绘图功能):

ipython

qtconsole --pylab=inline

与终端应用程序相比,优点在于:

界面美观

支持内嵌图片显示

支持以标签页的形式启动多个IPython进程

后面会详细介绍相关功能。

1.9 matplotlib集成与pylab模式

导致IPython广泛应用于科学计算领域的重要原因在于它能够跟matplotlib这样的库及其他GUI工具的默契配合。

如果在标准 python shell 中创建一个matplotlib绘图窗口,就会发现GUI时间循环会接管Python回话的控制权,知道该窗口关闭。这显然无法实现交互式的数据分析和可视化,因此IPython对各个GUI框架进行了专门的处理以使其能够与shell配合得天衣无缝。

集成matplotlib方法:

ipython

--pylab

这将是IPython完成以下工作:

import

numpy

import matplotlib

from matplotlib import pylab, mlab, pyplot

np = numpy

plt = pyplot

from IPython.display import display

from IPython.core.pylabtools import figsize,

getfigs

from pylab import *

from numpy import *

将import导入numpy和matplotlib,并添加交互支持。

使用示例:

img

= plt.imread('stinkbug.png')

imshow(img)

plot(randn(1000).cumsum())

二、 使用历史命令

IPython维护者一个位于硬盘上的一个小型数据库,包含执行过的每一天命令。这样的目的在于:

方便的搜索、自动完成之前执行过的命令

在回话间持久化历史命令

将输入输出历史记录到日志文件

2.1 搜索并重用命令历史

上箭头键:搜索出命令历史中第一个与你输入的字符相匹配的命令。多次按将会在历史中不断搜索。

下箭头键:子命令历史中向前搜索。

Ctrl-R:部分增量搜素,循环在命令历史中搜素与输入相符的行。

2.2 输入和输出变量

IPython会将输入和输出的引用保存在一些特殊变量中。

最近的输入个输出分别保存在_(一个下划线)和__(两个下划线)两个变量中。

输入被保存在_iX变量中,其中X是输入的行号。

输出被保存在_X变量中,其中X是输出的行号

几个与输入输出有关的魔术命令:

%hist 打印输入历史

%reset 清空interactive命名空间,可选择是否清空输入和输出缓存

%xdel 从IPython中移除特定对象的一切引用

2.3 记录输入和输出

执行%logstart能够开始记录控制台回话,包括输入和输出。与之配合的命令有:%logoff、%logon、%logstate、%logstop

三、 与操作系统交互

IPython与操作系统shell结合的非常紧密,可以在IPython中执行shell命令。

与系统相关的命令:

!cmd 在系统shell中执行cmd

output=!cmd args 执行cmd,并将结果放在output中

%bookmark 使用IPython的目录书签系统

%cd directory 更改工作目录

%pwd 返回系统当前工作目录

%env 以字典形式返回系统环境变量

3.1 shell命令

在IPython中以感叹号(!)开头的命令表示其后的所有内容将会在系统shell中执行。

使用!时,还允许使用当前环境中定义的Python值,只需在变量名前加上美元($)符号即可:

foo

= 'D:/test*'

!dir $foo

3.2 目录书签系统

IPython的目录书签系统能够保存常用目录的别名以便实现快速跳转。书签能够持久化保存。

如:

%bookmark

pys 'C:/User/xxx/PyWorkSpace'

定义好书签之后,就可以在执行魔术命令%cd时使用这些书签了:

cd

pys

列出所有书签:

%bookmark

-l

书签名与目录冲突

%bookmark

-b pys #强制使用书签目录

四、 软件开发工具

4.1 交互式调试器

IPython增强了pdb,如Tab键自动完成、语法高亮、为异常信息添加上下文参考等。

代码调试的最佳时机就是错误发生的时候,在发生异常之后马上输入 %debug 命令将会调用调试器,并直接跳转到引发异常的那个帧。

在pdb中,可以查看各个帧中的一切对象和数据。默认是从最低级开始的。输入u(p)或d(own)可以在栈的各级别之间切换。

使用 %pdb on 命令可以开启自动调试功能, 即当程序异常时直接开始进行调试。%pdb off命令可关闭自动调试。如果不加参数,只输入%pdb命令则在两种模式之间切换。

如果你想设置断点或对函数进行单步调试。 可以使用带有 -d 选项的%run命令,这将会在执行脚本文件中的代码之前打开调试器。然后,如果你想套设置断点,那么使用

b(reak) x 命令,其中x为行号。前进一行使用 n(ext) 命令,进入函数体使用 s(tep

into) 然后使用 c(ontinue) 命令即可直行至断点处。要查看变量可以使用 !x ,其中x为变量名。

run

-d ipython_bug.py

b 12

c

想要精通这个交互式调试器,必须经过大量的实践才行。如果你习惯了使用某款IDE刚开始使用这种终端型调试器可能会觉得有点麻烦,但慢慢就习惯了。虽然大部分IDE都拥有优秀的GUI调试器,但是在IPython中调试程序却往往会带来更高的生产率。

pdb主要命令如下:

h(elp) 显示命令列表

help command 显示命令的说明文档

c(continue) 回复程序的执行

q(uit) 退出调试器

b(reak) number 在指定行设置断点

s(tep) 单步进入(step into)函数

n(next) 执行当前行(step over),并进入下一行

u(p)/d(own) 在函数调用栈中向上或向下移动

a(rgs) 显示当前函数的参数

debug statement 在新的调试器中调用语句statement

l(ist) statement 显示当前行,以及当前栈级别上的上下文参考代码

w(here) 打印当前位置的完整栈跟踪

4.2 调试器的其他使用场景

除了上面提到的,还有另外的调试方法。可以使用set_trace者个特别的函数。下面两个函数或许会对你很有用(你也可以像我一向直接将其添加到IPython配置中):

def

set_trace():

from IPython.core.debugger import Pdb

Pdb(color_sheme='Linux').set_trace

(sys._getframe().f_back)

def debug(f, *args, **kwargs):

from IPython.core.debugger import Pdb

pdb = Pdb(color_scheme='Linux')

return pdb.runcall(f, *args, **kwargs)

第一个函数set_trace很简单,你可以将它放在代码中任何希望停下来查看一番的地方:

def

calling_things():

set_trace() #自定义的调试函数

works_fine()

throws_an_exception()

第二个函数(debug),使你能够直接在任意函数上使用调试器。

假设我们有如下函数:

def

f(x, y, z=1):

tmp = x + y

return tmp / z

现在想对其进行单步调试,按如下方式即可:

debug(f,

1, 2, z=3)

4.3 测试代码执行时间:%time 和 %timeit

对于大规模运行时间长的程序,你可能希望测试一下各个部分的执行时间。了解某个复杂计算过程到底是哪些函数占用时间最多。

使用内置的time.clock和time.time函数手工测试代码执行时间的方式如下:

import

time

start = time.time()

iterations = 10000

for i in range(iterations):

# some code

elapsed_per = (time.time() - start) / iterations

由于这是一个非常常用的功能,所以IPython专门提供了两个魔术函数%time和%timeit以便自动完成该过程。

%time 一次执行一条语句,然后报告总体执行时间。

%timeit会自动多次执行以产生一个非常准确的平均执行时间。

举例来说,有一个拥有60万字符换的数组,你希望选出其中以foo开头的字符串。现有两种实现方法:

strs

= ['foo', 'foobar', 'baz', 'qux', 'python',

'Guido Van Rossum'] * 100000

method1 = [x for x in strs if x.startswith('foo')]

method2 = [x for x in strs if x[:3] == 'foo']

看上去它们差不多是吧?那么我们通过%time来验证一下:

In

[11]: %time method1 = [x for x in strs if x.startswith('foo')]

Wall time: 148 ms

In [12]: %time method2 = [x for x in strs if

x[:3] == 'foo']

Wall time: 109 ms

用%timeit的结果:

In

[13]: %timeit method1 = [x for x in strs if

x.startswith('foo')]

10 loops, best of 3: 137 ms per loop

In [14]: %timeit method2 = [x for x in strs

if x[:3] == 'foo']

10 loops, best of 3: 101 ms per loop

可见method2运行时间比method1减少近 1/3 。

这告诉了我们一个事实,非常有必要了解Numpy、pandas等库的性能特点。在大型数据分析程序中,这些不起眼的毫秒数会是不断累积的!

4.4 基本性能分析:%prun 和 %run -p

代码性能分析与代码执行时间分析的区别在于,它关注的是耗费时间的位置。

python使用cProfile模块进行性能分析,它会记录各函数所耗费的时间。

使用方法如下:

python

-m cProfile cprof_example.py

执行之后会发现输出结果是按函数名排序的,这我们很难发现哪里才是最花时间的地方,一次通常会再加一个 -s

指定排序规则:

python

-m cProfile -s cumulative cprof_example.py

除此自外,cProfile还能以编程的方式分析任意代码块的性能。IPython为此提供了一个方便的接口。即

%prun 和带 -p 命令的%run。

%prun 格式跟cProfle相同,但它分析的是部分语句而不是整个文件。

%prun

-l 7 -s cumulative run_experiment()

利用 %run -p 也能达到上面的系统命令的效果去无需退出IPython:

%run

-p -s cumulative cprof_example.py

4.5 逐行分析函数性能

有时从%prun得到的信息要么不足以说明函数的执行时间,要么复杂到难以理解。这是我们可以使用一个叫做line_profiler的小型库(可以通过PyPI或其他包管理工具获取)。其中有一个新的魔术函数%lprun,它可以对一个或多个函数进行逐行性能分析。

五、 IPython HTML Notebook

IPython Notebook目前已成为一种非常棒的交互式计算工具,同时还是科研和教学的一种理想媒介。它有一种基于JSON的文档格式.ipynb,一种流行的演示手段就是使用IPython

Notebook再将.ipynb文件发布到网上以供所有人查阅。

IPython Notebook是一个运行于命令行上的轻量级服务器进程。

由于我们是在一个Web浏览器上使用Notebook的,因此该服务器进程可以运行于任何其他地方。甚至可以连接到那些运行在云服务上的Notebook。

六、 使用IPython进行高效开发的提示

6.1 重新加载模块依赖项

在Python中,当你输入import some_lib时,其中的代码就会执行,且其中的变量、函数和引入项都会被保存在一个新建的some_lib模块命名空间中。下次再输入import

some_lib时,就会得到这个模块命名空间的一个引用。

这种”一次加载“方式对于IPython的交互式开发就会带来问题。

如果一个文件import了另一个模块some_lib,在执行了这个文件之后,需要对some_lib进行修改,然后再重新执行文件。这时仍然会使用老版本的some_lib。因为原来的some_lib在交互式环境中已经被加载过了。

为了解决这个问题,有两个方法:

使用reload函数:

import some_lib

reload(some_lib)

显然,当依赖变得更强的时候,就需要在很多地方插入很多的reload。下面的方法用于解决模块的”深度“(递归)重加载。

使用dreload函数:它会尝试重新加载some_lib以及其所有的依赖项。

遗憾的是,以上方法不是万灵丹,如果真的失效了,重启IPython试试看。

6.2 代码设计提示

保留有意义的对象和数据

如果你在IPython中执行了一下代码:

from

my_funcs import g

def f(x, y):

return g(x + y)

def main():

x = 6

y = 7.5

result = x + y

if __name__ == '__main__':

main()

那么我们将访问不到任何结果以及main函数中定义的对象。

更好的方法是直接在该模块的全局命名空间中执行main中的代码(当然如果你希望该模块是可引用的,可以将这些代码放到

if __name__ == '__main__'中)。这样当你 %run 这段代码时就可以访问到main中定义的所有变量了。

对这个简单的例子而言可能意义不大,但是对于以后将会遇到的针对大数据集的复杂数据分析问题而言就很重要了。

扁平结构要比嵌套结构好

这个思想来自”Zen of Python“,它对交互式的代码开发模式同样有效。编写函数和类时应尽量注意低耦合和模块化,这样能使它们更易于测试、调试和交互式使用。

附Zen of Python(执行import this即可看到):

The

Zen of Python, by Tim Peters

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

**Flat is better than nested.** #扁平好于嵌套

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break

the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation

to guess.

There should be one-- and preferably only one

--obvious way to do it.

Although that way may not be obvious at first

unless you're Dutch.

Now is better than never.

Although never is often better than *right*

now.

If the implementation is hard to explain, it's

a bad idea.

If the implementation is easy to explain, it

may be a good idea.

Namespaces are one honking great idea -- let's

do more of those!

不要怕大文件

在IPython开发时,处理10个小的文件会比处理一个相对较大的文件来的更头疼。更少的文件意味着需要重新加载的模块更少,编辑时需要在各个文件之间跳转的次数也越少。

当然,不建议将此原则极端化。对于一个大型代码库而言,要找到一种合乎逻辑的模块/包架构要花点功夫,这对团队工作非常重要。每个模块都应该高内聚,并能足够直观地找到对应各种功能的函数和类。

七、 IPython高级用法

7.1 让你的类对IPython更加友好

许多对象(如字典、列表、数组等)在IPython下都能以漂亮的格式输出。但是对于自定义的类,就需要自己生成所需的字符串输出。做法是重载

__repr__ 函数即可:

class

Message:

def __init__(self, msg):

self.msg = msg

def __str__(self):

return 'Message: %s' % self.msg

类似的重载 __str__ 能够在print函数时输出相应内容

7.2 个性化和配置

IPython shell在外观(如颜色、提示符、行间距)和行为方面的大部分内容都是可以配置的,如:

颜色方案

输入输出提示符

去掉Out提示符后的空行

执行任意的Python语句,你可以定制你希望每次启动IPython都发生的事

启动IPython扩展

自定义魔术命令或系统别名

所有的配置项都在一个叫做 ipython_config.py 的文件中,可以在%HOME%/.ipython/目录中找到。

ipython是一个交互式计算系统_IPython :一个交互式计算和开发环境-Python相关推荐

  1. 物联网全栈教程--手把手教你开发一个智能浇花器(1)-开发环境安装

    大家好,我是Mr_Dong,是一个集美貌和才华于一身的美男子.不允许反对.下面我们正式来讲ESP8266 开发环境的安装. 关于ESP8266是个啥?简单说来,ESP8266 是一个内置了单片机的WI ...

  2. ipython是一个交互式计算机系统_IPython 1.0发布,强大的Python交互式Shell

    在今年年初颁布的"2012年度自由软件奖"中,开发者Fernando Perez凭借IPython这一项目获得了2012年度自由软件推动奖. 今天IPython项目终于发布了1.0 ...

  3. 你和你的女神之间,差了一个OpenCV口红色号识别器,android开发环境的搭建步骤

    MeanC=((int)(Mean_R/count),(int)(Mean_G/count),(int)(Mean_B/count)) return Me 番茄的颜色提取到了,那么和什么做比对呢? 当 ...

  4. laradock双版本php,自己撸一个 LaraDock(使用 Docker LNMP 部署 PHP 开发环境)

    项目简介 Docker LNMP 是基于 docker-compose 开发的运行在 Docker 上的 LNMP 开发环境,包含 PHP.MySQL.Redis 等镜像并支持多版本切换,满足您的学习 ...

  5. 谁还不是一个lsp呢!带大家去知乎用Python搜刮一波荤段子呀~

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ Python日志 开发环境 Python版本:3.6.4 相关模块: requests模块: pyq ...

  6. ipython和pycharm的区别_ipython和pycharm有什么区别

    ipython和pycharm的区别:pycharm是一种python IDE,包含使用python语言开发时提高其效率的工具:ipython是一个python的交互式shell,内置了很多有用的功能 ...

  7. mysql amp;amp;_浅析mysql交互式连接amp;非交互式连接

    交互式操作:通俗的说,就是你在你的本机上打开mysql的客户端,就是那个黑窗口,在黑窗口下进行各种sql操作,当然走的肯定是tcp协议. 非交互式操作:就是你在你的项目中进行程序调用.比如一边是tom ...

  8. 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务

    原文链接:https://github.com/nixzhu/dev-blog/blob/master/2014-04-21-write-a-simple-nodejs-mongodb-web-ser ...

  9. mac brew 测速 软件_Mac已到手?从零开始,八步打造一个高效舒适的开发环境

    俗话说,写代码两分钟,配置环境两小时.不过俗话又说,环境配得好,编程没烦恼. 新机器到手?且慢. 漫漫"调教"机器的路才刚刚开始. 作为深度Mac系程序媛,笔者从新机器到手 顺手, ...

最新文章

  1. 新浪博客“网络繁忙请稍后再试”
  2. 集成学习-Boosting集成学习算法AdaBoost
  3. opencv imwrite()函数中 ImwriteFlags 的 cv.IMWRITE_JPEG_RST_INTERVAL(JPEG restart interval 重启间隔)是什么?
  4. Servlet其他关联类---ServletContext类
  5. MySQL笔记-SQL语句中可以使用单引号包裹任意类型
  6. 《Python编程从入门到实践》记录之类的使用
  7. win定时关机_电脑定时关机,你造吗?
  8. jQuery 学习-样式篇(九):jQuery 存储和删除元素私有数据的方法
  9. android网络编程登录和验证,ASP.NET实现用户注册和验证功能(第4节)
  10. pythonATM,购物车项目实战_补充4-db模块
  11. 通达\铭心联手,共探企业信息化营销新机遇
  12. 易语言:游戏辅助 CF队伤“卡秒器“ 编程思路/开发者优化建议
  13. matlab中加载数据方式,【转帖】Matlab数据导入方法
  14. otl c mysql_OTL
  15. NetSuite 库存盘点
  16. python微信群发itchat
  17. win7怎么进入安全模式_win7进入安全模式教程
  18. 线性规划(matlab篇)
  19. TCP客户端与服务端开发
  20. 语言与区域设置ID (Language ID、Locales ID / LCID)

热门文章

  1. 解决centos7安装wmwaretools找不到kernel header
  2. 二进制,八进制,十进制,十二进制之间的转换!!!!!!!!!
  3. 计算沙盒下文件夹内容大小 清空沙盒 文件 目录
  4. android学习笔记---发送状态栏通知
  5. vi 命令 使用方法
  6. case when..then
  7. Extjs 判断对象是非为null或者为空字符串
  8. 2017-2018-1 20155327 《信息安全系统设计基础》第十三周学习总结
  9. 这是自己的第一篇博客
  10. Required String parameter 'images' is not present