答案 0 :(得分:2)
您可以使用whos
命令查看当前内核中存储的所有变量。
k, g, lx = .4, .8, 6.6
m = k*g*lx**2
whos
输出:
Variable Type Data/Info
-----------------------------
g float 0.8
k float 0.4
lx float 6.6
m float 13.939200000000001
但如上所述,它显示所有变量,因此它会显示您运行的早期单元格中的其他变量。
使用来自python内置函数的locals()或globals()命令可以实现类似的结果,这些函数返回变量字典。但jupyter代表的方式更漂亮。
或者您可以使用InteractiveShell。这将改变单元格的行为并像python shell一样运行,因此一旦运行它将输出every called value(输出单元格)。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
k
g
... do stuff ...
lx
m
... do more stuff ...
输出:
Out[2]: 0.4
Out[2]: 0.8
Out[2]: 6.6
Out[2]: 13.939200000000001
最后,您可以通过将交互性设置为last_expr
来将其恢复为默认值。
InteractiveShell.ast_node_interactivity = "last_expr"
但是你这样做的方式可能是最简单和最漂亮的方式,你可以删除数据框上的任务以使其成为单行或者你可以通过以下方式使其更紧凑:
k, g, lx, m
Out[3]: (0.4, 0.8, 6.6, 13.939200000000001)
答案 1 :(得分:2)
您可以使用inspect库尝试这样的事情。
import inspect
k = 0.0417
g = 0.829
lx = 6.6
m = k*g*lx**2
def get_name(lst=[]):
local_vars = inspect.currentframe().f_back.f_locals.items()
for i in local_vars:
lst.append(i)
return dict(lst)
import pandas as pd
df = pd.DataFrame(get_name(), index=[0])
result = df.T.loc[df.dtypes != object]
print(result)
0
g 0.829
k 0.0417
lx 6.6
m 1.50584
答案 2 :(得分:1)
因此,这是一个难以克服的难题。本质上,我们只是试图获取当前单元格中的所有行并提取变量。事实证明,我们无法使用Programmatically get current Ipython notebook cell output?中建议的由IPython定义的全局变量(例如import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import java.util.ArrayList;
public class CheckTestAdapter extends BaseAdapter {
private Context mContext;
private Context context;
private final ArrayList<Model> listData;
private LayoutInflater layoutInflater;
private Model listModel;
View rowView;
ItemHolder holder;
public CheckTestAdapter(Context context, ArrayList<Model> listData) {
this.context = context;
this.listData = listData;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
;
return listData.size();
}
@Override
public Object getItem(int position) {
return listData.get(position);
}
@Override
public long getItemId(int position) {
return listData.get(position).getId();
}
@Override
public View getView(int position, View view, ViewGroup parent) {
rowView = view;
holder = null;
if (rowView == null) {
rowView = layoutInflater.inflate(R.layout.check_items, null);
}
holder = new ItemHolder();
holder.moviesName = (TextView) rowView.findViewById(R.id.itemName);
holder.checkTest = rowView.findViewById(R.id.itemChecked);
holder.checkBox = (CheckBox) rowView.findViewById(R.id.chkItem);
holder.itemID = rowView.findViewById(R.id.itemIdHolder);
listModel = listData.get(position);
final String test = String.valueOf(listModel.getId());
holder.itemID.setText(test);
holder.moviesName.setText(listModel.getItemName());
holder.checkTest.setText(listModel.getCheckedItem());
holder.checkBox.setChecked(listModel.itemChecked());
// Tag is important to get position clicked checkbox
holder.checkBox.setTag(position);
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
String checkVal = new String();
boolean chChecked = holder.checkBox.isChecked();
if (chChecked) {
// Run update query
checkVal = "Work";
} else if (!chChecked) {
checkVal = "Stuff";
}
holder.checkTest.setText(checkVal);
}
});
holder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int currentPos = (int) v.getTag();
boolean isChecked = false;
if (listData.get(currentPos).itemChecked() == false) {
isChecked = true;
}
listData.get(currentPos).setIsChecked(isChecked);
notifyDataSetChanged();
}
});
return rowView;
}
static class ItemHolder {
TextView moviesName;
TextView checkTest;
CheckBox checkBox;
TextView itemID;
}
}
,_
,__
等),因为(就我的实验而言)已显示),您只能从以前执行的单元格中获取值,而不能从当前正在执行的单元格中获取值。
幸运的是,事实证明,使用魔术命令_i<n>
确实可以捕获当前单元格的输入。因此,在this和this的帮助下,我创建了一个功能完全符合您想要的功能:
%history
您可以通过以下方式对其进行测试:
def cell_vars(offset=0):
import io
from contextlib import redirect_stdout
ipy = get_ipython()
out = io.StringIO()
with redirect_stdout(out):
ipy.magic("history {0}".format(ipy.execution_count - offset))
#process each line...
x = out.getvalue().replace(" ", "").split("\n")
x = [a.split("=")[0] for a in x if "=" in a] #all of the variables in the cell
g = globals()
result = {k:g[k] for k in x if k in g}
return result
应提供a = 1
b = 2
c = 3
cell_vars()
,然后您可以对其格式化并按需要打印。显然,我的行处理存在一些限制(假设所有感兴趣的变量都在全局范围内)。
希望这很有用!