【问题标题】:Executing multi-line statements in python in interactive mode在python中以交互方式执行多行语句
【发布时间】:2017-12-24 21:27:04
【问题描述】:

我是 Python 世界的新手,这是我使用 Python 编写的第一个程序。我来自 R 的世界,所以这对我来说有点不直观。

当我执行时

In[15]: import math
   ...: import random
   ...: random.random()
   ...: math.sqrt(85)
   ...: 

在交互模式下(即在>>> 提示符下),我得到math.sqrt() 的输出。我根本看不到随机数。但是,当我分别执行 random.random()math.sqrt() 时,我确实得到了两个结果。为什么是这样?我如何获得这两个结果?我问这个是因为我有在 R 中选择多行并以交互模式执行它们的习惯,尤其是在我尝试调试代码时。在尝试调试(例如,2000 行代码)时,一次只执行一行将非常痛苦。

当我在 R 中选择多行然后执行它们时会发生以下情况:

runif(1,0,1)
  sqrt(85)

它会自动解析这些行并生成以下输出:

> runif(1,0,1)
[1] 0.01597949
>   sqrt(85)
[1] 9.219544

我研究了 SO,发现 Write multi-line statement on single line。我不确定如何使用该线程的官方答案。


这是 PyCharm 上的输出:

import math
import random
random.random()
math.sqrt(85)
Out[15]: 9.219544457292887

我正在寻找某种机制来查看随机数和 85 的 sqrt,而无需像在 R 代码中那样添加任何分隔符 ,;。如有任何想法,我将不胜感激。

预期输入:可以使用 PyCharm 中的“使用控制台执行选择”运行代码 [键盘快捷键:Alt + Shift + E]

import math
import random
random.random()
math.sqrt(85)

[请注意,我没有使用任何分隔符“;”或“,”——就像我们在 R 中所做的一样]

预期输出:

random.random()
Out[16]: 0.183145720117748
math.sqrt(85)
Out[17]: 9.219544457292887

【问题讨论】:

  • 你能澄清你看不到随机数的意思吗?在 Python 提示符下,在 Python 2.7 上,执行 random.random() 只会打印出一个随机数 [0.0, 1.0)。
  • @Mike- 我只是想打印一个随机数和 sqrt。但是,Python 只打印了 sqrt。我根本没有看到随机数。
  • 您还提供了您的输入,但您能否以您想要的格式提供您的预期输出?也许这会消除一些混乱????
  • @Miket - 再次感谢您的帮助。我在 PyCharm 中添加了预期的输出和输入以及键盘快捷键。
  • 我无法在 pycharm 中复制您的行为,即使在控制台中也是如此。您是否通过基本终端窗口在 python 控制台中尝试过这段代码?

标签: python pycharm


【解决方案1】:

您可能只看到math.sqrt() 的输出的原因之一是因为默认情况下 ipython/jupyter 只会为您提供多行命令的最后一行的输出。 Python 解释器逐行执行代码,任何像random.random() 这样没有显式打印的语句都会被评估并丢弃。 Ipython/Jupyter 默认获取最后一行的结果并显示它。我没有使用 pycharm,但它可能做同样的事情。要查看 random.random() 的输出,您有两种选择:

1) 使用如下的打印语句。

In [1]: import math
import random
print random.random()
math.sqrt(5)
   ...: 
0.145504928627
Out[1]: 2.23606797749979

In [2]: 

2) 通过更改ast_node_interactivity 参数来更改默认行为,如回答here

In [1]: from IPython.core.interactiveshell import InteractiveShell

In [2]: InteractiveShell.ast_node_interactivity = "all"

In [3]: import math
import random
random.random()
math.sqrt(5)
   ...: 
Out[3]: 0.9772320535532782
Out[3]: 2.23606797749979

IPython 有多种神奇的命令,例如 %edit%load,它们允许您直接在您喜欢的编辑器中编辑命令或从如下文件加载特定的代码行。这有助于您选择长代码的特定部分并单独运行它们。下面我将以上几行保存在一个名为 test_interpreter.py 的文件中。

In [1]: !cat test_interpreter.py
import math
import random
print random.random()
math.sqrt(5)

In [2]: load -r 1-4 test_interpreter.py

In [3]: # %load -r 1-4 test_interpreter.py
import math
import random
print random.random()
math.sqrt(5)
   ...: 
0.719244573423
Out[3]: 2.23606797749979

默认情况下,unix shell 中的 python REPL 不支持多行命令(据我所知),但您可以使用 ; 终止并使用 \ 开始新行,这是 readline 的转义字符python REPL 使用哪个。

>>> import math;\
... import random;\
... random.random();\
... math.sqrt(5)
0.10298483416372617
2.23606797749979

在普通的 python 解释器和 ipython 中,您可以直接从编辑器中复制粘贴行,它们将被单独评估,如下所示。

#Copy paste four lines together
>>> import math
>>> import random
>>> random.random()
0.16039452147586075
>>> math.sqrt(5)
2.23606797749979

【讨论】:

  • 非常感谢您的回答。我喜欢InteractiveShell.ast_node_interactivity = "all" 的方法。有什么办法可以将此代码添加到配置文件或 PyCharm 中,这样我就不必为每个脚本再次复制粘贴相同的代码?我来自 R 世界,执行一段代码在 R 编程中很常见。我尝试在 Win 机器上将 ipython_config.py 添加到 ..\.ipython\profile_default,但没有任何反应。我什至重新启动了我的 PyCharm,但没有运气。今天是我接触 Python 的第一天。我会很感激你的帮助。我在 PyCharm 上使用 Anaconda。
  • 如果您通过从 cmd 输入 ipython profile create 以标准方式生成 ipython_config.py 文件,则该文件应包含注释行,如 # c.TerminalInteractiveShell.ast_node_interactivity = 'last_expr'。将 last_expr 更改为 all 并取消注释该行。然后重新启动 ipython 应该可以工作。如果上述行不存在,则手动输入。这个文件的顶部应该有一个像c = get_config() 这样的未注释行,以便所有这些工作。
  • 非常尊重,我一直在尝试搜索并了解如何运行ipython profile create。当我运行 ipython 命令(即 Win + R 然后我会输入上面的命令)时,我得到 Windows 找不到 ipython。你有什么可以指点我的吗?这是我的第一天。所以,我很抱歉。
  • 我不使用 Windows,但如果您通过 anaconda conda install ipython 安装 ipython,它应该将 ipython 命令放在您的路径中。键入 Win + R 和 cmd 首先打开一个 DOS shell。然后输入上面的命令。通常可执行文件 (ipython.exe) 位于 Anaconda 安装文件夹中的 Scripts 文件夹内。如果不在您的路径中,您可以在那里导航并以ipython profile create 运行它。
【解决方案2】:

在 Python 2.7.10 控制台中,执行以下操作:导入数学和随机数,获取随机数,然后对数字输出平方根:

>>> import math
>>> import random
>>> random.random()
0.52350453737542
>>> math.sqrt(85)
9.219544457292887 

如果您希望两个值连续打印,您可以编写由分号运算符分隔的多行语句:

>>> import math
>>> import random
>>> random.random(); math.sqrt(85)
0.9031053664569808
9.219544457292887

【讨论】:

  • 谢谢迈克。除了换行符之外,有没有什么方法可以在不使用分隔符的情况下执行这些语句?正如您在我的帖子中看到的那样,我没有添加任何分隔符,除了行之间的换行符
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 2012-12-14
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
相关资源
最近更新 更多