如何在Jupyter Noteboo中查看所有变量

您所在的位置:网站首页 jupyter如何打开 如何在Jupyter Noteboo中查看所有变量

如何在Jupyter Noteboo中查看所有变量

2022-12-12 22:26| 来源: 网络整理| 查看: 265

在Python开发者中提起Jupyter笔记本的话题,你可能会得到关于它们的各种意见。许多开发者认为,使用笔记本会助长一些坏习惯,造成混乱,并导致代码的丑陋。一个很常见的问题是笔记本中的隐藏状态的想法。这种隐藏的状态可以通过几种方式表现出来,但一种常见的方式是不按顺序执行笔记本单元。这在开发和探索过程中经常发生。修改一个调用,多次执行它,甚至删除它,这都是很常见的。一旦一个单元被删除或修改并重新执行,该单元的隐藏状态就会保留在当前会话中。变量、函数、类和任何其他代码将继续存在,并可能影响其他单元中的代码。

这导致了一些明显的问题,首先是对笔记本的当前会话,其次是对笔记本的任何未来调用。为了使笔记本能够反映现实,它应该包含可以执行的有效代码,以便产生一致的结果。实际上,你可以通过以下几种方式实现这一目标。

剔除它

如果你的笔记本很小,而且运行很快,你可以随时重启你的内核,重新运行所有的代码。这模拟了单元测试或从命令行(或在IDE集成中)运行脚本的更典型的开发方式。如果你只是用保存的代码运行一个新的Python实例,就不可能存在隐藏的状态,输出结果也会是一致的。这对小的笔记本来说是有意义的,在那里你可以快速地将所有的代码可视化,并在检查时进行验证。

但这未必对所有情况都实用。

查看它

如果开发者不想不断地重启他们的解释器,他们也可以查看当前的状态是什么。让我们走过几个这样做的方法,从简单到更复杂。请注意,这个代码例子使用Jupyter 6.15和IPython 7.19.0作为内核。

首先,让我们做一些数据。

import numpy as np def a_function(): pass class MyClass: def __init__(self, name): self.name = name var = "a variable" var2 = "another variable" x = np.ones(20) 复制代码

现在,一旦执行了带有上述Python代码的单元格,我就可以通过执行带有其中一个变量的单个单元格,或者使用IPythondisplay 函数,来检查我当前会话的状态。一个单元格将显示该单元格中最后一行的值(除非你在行末附加一个; )。如果使用默认的解释器,display ,但执行任何变量都会显示值(根据其__repr__ 方法)。

display(a_function) display(var2) display(MyClass) display(x) var 复制代码 'another variable' __main__.MyClass array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) 'a variable' 复制代码 但如果代码消失了怎么办?

好吧,上面这个方法很明显,我们可以查看我们知道存在的项目。但是我们如何找到那些我们不知道存在的对象呢?也许我们删除了创建数值的单元格,或者如果我们使用的是IPython命令行,我们的历史记录对该代码已经不可见。或者是我们编辑了几次单元格,然后重新执行,并改变了一些变量名。

要考虑的一个功能是dir内置函数。当你调用这个没有参数的函数时,它将返回本地范围内所有变量名称的列表。如果你提供了一个模块或类,它将列出该模块或该类(及其子类)的属性。

当我们这样做的时候,我们可以看到我们的变量都是存在的。注意这在标准Python中是可用的,不仅仅是IPython。

dir() 复制代码 ['In', 'MyClass', 'Out', '_', '_2', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', '_dh', '_i', '_i1', '_i2', '_i3', '_ih', '_ii', '_iii', '_oh', 'a_function', 'exit', 'get_ipython', 'np', 'quit', 'var', 'var2', 'x'] 复制代码

哇,这里面还有很多其他的东西。大多数变量是由IPython添加的,与命令历史有关,所以如果你用默认的解释器运行这个例子,就不会有那么多的变量出现。另外,一些函数在启动时加载 (你也可以配置IPython来加载其他函数)。其他对象的存在是因为Python把它们放在全局范围内。

注意,特殊变量_ 是最后执行的单元格(或行)的值。

使用globals 和locals

还有两个函数是有帮助的。 locals和 globals.这两个函数将返回符号表,这是一个以变量名为键的字典,包含数值。对于globals ,这是当前模块的值(当在一个函数或方法中调用时,模块是定义该函数的地方,而不是执行该函数的地方)。locals ,当在模块级别调用时与globals 相同,但在函数块中调用时返回自由变量。

注意,不要修改这些表格,它将影响运行中的解释器。

locals() # get the full dictionary globals()['var'] # grab out a single value 复制代码 'a variable' 复制代码 我可以看一下更漂亮的东西吗?

使用一个有IPython添加的一些额外值的大字典工作,可能不是检查你的变量的最简单方法。你可以建立一个函数来美化符号表,但幸运的是,已经有一些很好的魔法来实现这个目的。(魔法是IPython中的特殊函数,请看这里对魔法的快速介绍,特别是autoreload 。)

Jupyter/IPython为检查变量提供了三个有用的魔法。首先,有一个%who 。在没有参数的情况下,它以最小的格式打印出所有的交互式变量。你可以提供类型,只显示与所给类型匹配的变量。

%who MyClass a_function np var var2 x # just functions %who function a_function 复制代码

%who_ls 魔法做了同样的事情,但将变量作为一个列表返回。它还可以通过类型来限制你看到的内容。

%who_ls ['MyClass', 'a_function', 'np', 'var', 'var2', 'x'] %who_ls str function ['a_function', 'var', 'var2'] 复制代码

最后一个魔法是%whos ,它提供了一个漂亮的格式化表格,将显示变量、类型和字符串表示。它包括关于Numpy和pandas数据结构的有用信息。

%whos Variable Type Data/Info ---------------------------------- MyClass type a_function function np module var str a variable var2 str another variable x ndarray 20: 20 elems, type `float64`, 160 bytes 复制代码 花式输出

现在,如果你想变得更花哨,Jupyter有一个通过nbextensions提供的扩展。变量检查器(Variable Inspector)扩展将为你提供一个很好的选项,在类似于上述%whos 的输出中查看变量。对于习惯了带有自动更新变量检查器的IDE的开发者来说,这个扩展可能被证明是有用的,值得检查一下。

删除变量

在查看了本地范围内定义的变量后,你可能想删除其中的一些。例如,如果你删除了一个单元格,并希望由该单元格创建的对象被删除,只要del 。用上面的任何方法来验证它们是否消失。

del var2 %whos 复制代码 Variable Type Data/Info ---------------------------------- MyClass type a_function function np module var str a variable x ndarray 20: 20 elems, type `float64`, 160 bytes 复制代码 总结

现在你知道了一些工具,你可以用它们来寻找当前 Python 会话中的变量。使用它们可以更好地理解你已经执行的代码,也许可以为自己节省一点时间。

The postHow to view all your variables in a Jupyter notebookappeared first onwrighters.io.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3