Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在没有打印功能的情况下显示数据时,IPython和REPL的行为不同_Python_Python 3.x_Ipython_Read Eval Print Loop - Fatal编程技术网

在没有打印功能的情况下显示数据时,IPython和REPL的行为不同

在没有打印功能的情况下显示数据时,IPython和REPL的行为不同,python,python-3.x,ipython,read-eval-print-loop,Python,Python 3.x,Ipython,Read Eval Print Loop,请注意,所有实验都是在Python3.4.3和IPython 5.1.0(Python3)上进行的 考虑一个返回标识的函数: def my_func(): return 1 现在,从REPL会话内的循环调用此函数 for _ in range(3): my_func() 打开,IPython,不显示任何内容 In [96]: for _ in range(3): ...: my_func() ...: In [97]: 但是,在

请注意,所有实验都是在Python3.4.3和IPython 5.1.0(Python3)上进行的


考虑一个返回标识的函数:

def my_func(): 
    return 1
现在,从REPL会话内的循环调用此函数

for _ in range(3): 
    my_func()
打开,IPython,不显示任何内容

In [96]: for _ in range(3): 
    ...:     my_func()
    ...:     

In [97]: 
但是,在REPL上,有些东西是:

>>> for _ in range(3): 
...     my_func()
... 
1
1
1
>>>
为什么会有区别? 是不是因为IPython做了什么?我已经检查了字节码,在这两种情况下,它们都是相同的。因此,它与字节码生成无关,而是与在这两种情况下如何解释有关。

关于它的工作原理,因此循环内的表达式语句不会触发
sys.displayhook
。常规交互式解释器执行您在
单一模式下输入的任何内容
'single'
模式是表达式语句触发sys.displayhook
的模式

对于IPython为什么这样做,常规的Python行为与其说是有用的,不如说是恼人的。您很少希望在循环中自动打印表达式语句的值;更常见的情况是,它会偶然发生,并将您感兴趣的内容从屏幕上滚动下来


IPython试图提供更有用的行为。显式打印想要打印的内容比显式抑制不想要打印的内容直观得多。

为什么在“它是如何工作的”或“为什么有人创造了这种差异”?常规的Python行为是一个坏主意,IPython试图提供更有用的交互行为。@user2357112我想回答第一个问题,但我想回答两个问题。IPython的行为是标准的行为。它只是把所有的东西都打印出来。但在REPL中,因为它是一个基本的交互式会话,所以它默认打印当前命令的“结果”(实际上不仅如此)。例如,如果您键入
a=5
,然后键入
a
,它将输出
5
。这在REPL中的行为使调试更容易。@Sraw我观察到的与您所说的相反……这非常有意义!它还解释了为什么在一个REPL上,
dis.dis(compile(“for”in range(3):my_func(),“'exec'))
打印出合法的字节码,而在同一个REPL上,
dis(“for”in range(3):my_func()”
会吐出垃圾-模式。@cᴏʟᴅsᴘᴇᴇᴅ: 嗯,不是真正的模式。更重要的是,您编译了字符串。如果在Python2上将字符串传递给
dis.dis
,它将假定该字符串是字节码,而不是源代码。当你编译它时,你会得到一个代码对象,一个
dis.dis
知道如何反汇编的类型。(在Python3上,
dis.dis
知道如何反汇编源代码,部分原因是源代码是unicode,字节码现在是字节。)我甚至没有意识到REPL是在python2上运行的。先生,你是个天才,