从Python Shell、IPython控制台和脚本内部运行下一个函数时的不同行为

从Python Shell、IPython控制台和脚本内部运行下一个函数时的不同行为,python,ipython,next,Python,Ipython,Next,我有一个类定义了next方法。当我从创建此类对象的命令行运行脚本并运行以下循环调用next时,不会打印next的返回值,但当我从Python控制台运行相同的行时,会打印返回值 更具体地说,如果我们将以下脚本保存为tests.py: class Solution(): def __next__(self): return 1 s = Solution() for _ in range(5): next(s) 然后运行python test.py,不打印任何内容(

我有一个类定义了
next
方法。当我从创建此类对象的命令行运行脚本并运行以下循环调用
next
时,不会打印next的返回值,但当我从Python控制台运行相同的行时,会打印返回值

更具体地说,如果我们将以下脚本保存为
tests.py

class Solution():
    def __next__(self):
        return 1

s = Solution()
for _ in range(5):
    next(s)
然后运行
python test.py
,不打印任何内容(我在Python3.4和Windows机器上进行了测试)

但是,如果在Python shell中执行以下操作,则输出将被打印:

(python34) C:\>python
Python 3.4.5 |Anaconda custom (64-bit)| (default, Jul  5 2016, 14:53:07) [MSC 
v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class Solution():
...     def __next__(self):
...         return 1
...
>>> s = Solution()
>>> for _ in range(5):
...     next(s)
...
1
1
1 
1
1
在IPython控制台上也没有打印输出

您可以看到IPython一个接一个地运行ast节点,而不是一次运行所有节点。您可以更改IPython运行节点的方式,但默认情况下,它将仅在ast的最后一个根节点上触发显示副作用。如果有for循环,“next()”节点不是最后一个根节点,“for”是,并且它不返回值(它是一个语句而不是表达式)。这是故意的,不想让笔记本电脑的用户感到不知所措

我猜这在语义上与Python REPL不同,纯Python REPL要么交互运行last节点,要么all,我不记得了

您可以通过更简单的示例来检查Python repl的功能:您不需要
解决方案
类,您可以使用任何表达式来执行该操作,这是可行的:

>>> for i in range(5):
...     i # try adding more expressions like i**2 on another line
...
0
1
2
3
4
在IPython中,您可以通过一个标志获得相同的行为:

$ ipython --TerminalInteractiveShell.ast_node_interactivity=all
Python 3.6.1 | packaged by conda-forge | (default, May 23 2017, 14:31:56)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.0.dev -- An enhanced Interactive Python. Type '?' for help.

In [1]: for i in range(5):
   ...:     i
   ...:
Out[1]: 0
Out[1]: 1
Out[1]: 2
Out[1]: 3
Out[1]: 4
我个人喜欢使上次赋值返回赋值的
last\u expr\u或\u assign
值:

$ipython--TerminalInteractiveShell.ast\u node\u interactivity=last\u expr\u或\u assign

Python 3.6.1 |由conda forge打包|(默认,2017年5月23日,14:31:56) 有关详细信息,请键入“版权”、“信用”或“许可证” ipython6.2.0.dev——一种增强的交互式Python。键入“?”以获取帮助

In [1]: a = 1 # No Out
   ...: b = 2 # Out will be 2. Useless here, 
   ...:       # but nice if you do `df = pd.load_csv(...)`
Out[1]: 2

我以为我知道的。。结果我不太清楚。我的回答中记录的行为仅在IPython中观察到,而不是标准怠速。所以,我将删除我的答案。你如何运行这些代码?您是在python控制台、ipython还是在命令行中运行它?我认为你看到的取决于你如何运行它。您还可以以简化的形式包含
解决方案
类吗?是的,我还注意到行为实际上取决于@COLDSPEED之后如何运行代码。一旦有机会,我会用信息更新问题。它与temp变量没有任何关系。为什么要打印任何内容?您没有呼叫print。@RedCricket问题中所述的不同环境中的行为是不同的。谢谢。“last_expr_或_assign”值是否只是iPython 6.2的一个功能,因为在iPython 6.1中,它似乎不可用。我们是否也可以以类似的方式控制Python(例如,CPython)在交互模式下调用时的行为?当我在这里搜索时,我找不到任何标志。我认为你无法控制Python的标志。也是IPython大写字母I,不想惹恼水果公司:-)