Python数据科学手册笔记:IPython

发布时间 2023-12-23 15:56:08作者: 复古猴子

Ipython帮助文档

在ipython里面,有时需要去查询一个python对象,这个时候可以利用一些快捷符号来获得。

用符号?来查来文档

每一个python对象都有一个字符串的引用,即docstring,大多数情况下,这个部分会简要介绍和使用方法。Python内置一个help() 函数可以获取这些信息,并打印输出结果。

help(len)
-------------------------------------------------
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

在ipython中,可以直接在对象后面加一个? 来获取:

len?
-------------------------------------------------
Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method

用??来获取源代码

我们可以通过?? 来直接查询源代码:

In [1]: def square(a):
   ...:     '''Return the square of a'''
   ...:     return a ** 2

# ??来查看源码
In [2]: square??
Signature: square(a)
Source:
def square(a):
    '''Return the square of a'''
    return a ** 2
File:      c:\users\<ipython-input-7-bc38739afe33>
Type:      function

如果你用?? 发现它并不显示源码,说明它不是用python写的,而可能是用别的语言写的,比如len 这种

In [3]: len??
Signature: len(obj, /)
Docstring: Return the number of items in a container.
Type:      builtin_function_or_method

补全方法

这里有两种方法可以补全,一种是利用tab ,一种是利用通配符

利用tab

可以在输入对象名称,再加上一个句号.tab

In [10]: L = [1,2,3]

In [11]: L.<tab>
            append()  count()   insert()  reverse()
            clear()   extend()  pop()     sort()
            copy()    index()   remove()

在列表中会通常屏蔽掉私有方法(虽然python实际没有这样特别实现方法),我们可以加_ 下划线让它展示出来

In [11]: L.__<tab>
  __add__             __delattr__         __eq__              __getitem__()       __imul__
  __class__           __delitem__         __format__()        __gt__              __init__
  __class_getitem__() __dir__()           __ge__              __hash__            __init_subclass__() >
  __contains__        __doc__             __getattribute__    __iadd__            __iter__

在导入包时候,这个也可以帮助查找对象。

In [11]: import itertools import c<tab>
  calendar           cgitb              cmd                collections        commctrl           contextlib
  certifi            charset_normalizer code               colorama           compileall         contextvars
  cffi               chunk              codecs             colorsys           concurrent         copy               >
  cgi                cmath              codeop             comm               configparser       copyreg

但是tab有一个问题是,你必须记住前面的字母,但是如果你只是记住了后面字母,tab就无法使用了,这里就需要使用通配符。

利用*?来补全

可以在字母前用*来搜索:

In [12]: *Warning?
BytesWarning
DeprecationWarning
EncodingWarning
FutureWarning
ImportWarning
PendingDeprecationWarning
ResourceWarning
RuntimeWarning
SyntaxWarning
UnicodeWarning
UserWarning
Warning

Ipython快捷键

类别 快捷键 动作
导航快捷键 Ctrl+a 光标移动本行开始
Ctrl+e 光标移动本行结尾
Ctrl+b(或者左箭头) 将光标回退一个字符
Ctrl+f(或者右箭头) 将光标前进一个字符
文本输入快捷键 Ctrl+d 删除后一个字符
Ctrl+k 从光标开始剪切至行末尾
Ctrl+u 从行的开头剪切至光标
Ctrl+y 粘贴之前剪切的文本
Ctrl+t 交换前两个字符
历史快捷键 Ctrl+p(向上箭头) 取前一个历史命令
Ctrl+n(向下箭头) 取后一个历史命令
Ctrl+r 对历史命令反向搜索
其他快捷键 Ctrl+l 清除终端屏幕内容
Ctrl+c 中断当前命令
Ctrl+d 退出会话

Ipython魔法命令

粘贴代码块

有时候从网站复制代码块的时候,会发现一些不可预料的错误,比如包含缩进和解释符号。一个常见的解决方法是之前写一个%paste 。如果交互的化,就可以用cpaste

执行外部代码

在使用Ipython的时候,如果想使用外部编写的脚本,就可以使用%run 。比如有一个test.py 我们可以使用:

%run test.py

计算代码运行时间

在运行代码前加一个time 或者timeit 来计算。

In [19]: %time [ i for i in range(2)]
CPU times: total: 0 ns
Wall time: 0 ns
Out[19]: [0, 1]

In [20]: %timeit [ i for i in range(2)]
267 ns ± 32.4 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)

特别说明一点,如果你的语句很复杂,timeit 就会自动调整,不会执行那么多次了。

内存分析

这个要选安装pip install memory_profiler

利用Ipython导入扩展

%load_ext memory_profiler

然后可以用memit 来查看内存

%memit sum_of_list(10000)

如果想逐行, 就使用mprun ,但是这个只对独立内部函数有效,所以要用%%file 创建简单模块,将该模块命为x.py。

%%file x.py
...

from x import function
%mprun -f function

魔法函数帮助

如果想查询魔法函数使用,也可以后面加个?号

In [21]: %time?
Docstring:
Time execution of a Python statement or expression.
...(省略)

魔法函数通用描述以及一些示例:

%magic

如果魔法函数列表:

%lsmagic

错误和调试

控制异常:%xmode

%xmode 有Plain\Context\Verbose 模式。如果一般是Context,简易有Plain,详细包括变量赋值Verbose。

%xmode Verbose

调试模型:%debug

可以用%debug 打印a和b值,然后输入quit来结束。

输入输出历史

在Ipython中,InOut也是变量,所以你可以通过print 来查看。

In [23]: print(In) #返回是历史输入列表

In [24]: print(Out) #返回的是字典

如果想快速查看以前输出,可以使用下划线:

print(_)

每多一个下划线,就可以前查看一个,最多可以用这个方法查看前三个输出结果:print(___)

禁止输出

如果想不输出结果,可以在语句后面加一个;

历史输入

%history 可以获得此前所有输入历史,如果想看前x条:

$history -n 1-x

Ipython和shell命令

可以使用! 加上shell命令,比如ls

而且可以通过赋值操纵符将shell输出保存在python列表

contents = !ls

特别注意notebook中shell命令是在临时分支的shell执行的,所以如果希望持久方式更改路径可以用%cd或者可以不用%(这种是自动魔法automagic函数,可以通过%automagic魔法函数进行翻转。)比如cat\cp\env\ls\man\mkdir\more\mv\pwd\rm\rmdir 不加%也可以。