首页 > 解决方案 > 功能和非功能的区别?

问题描述

当我运行这两个不同的代码实例时,我无法理解为什么会得到两个不同的输出。据我所知,没有区别。我目前正在学习对齐文本,所以我想我会写一些东西来平衡中心的文本。从那时起,我已经了解了str.center(),但我仍然对下面这两个单元格之间的区别感到好奇。

每个的输入是input(Juice)

def orangeJuice():
    x = input()
    n = len(x)
    x.rjust(2*n, '$').ljust(3*n, '$')

orangeJuice()

--> 果汁

x = input()
n = len(x)
x.rjust(2*n, '$').ljust(3*n, '$')

--> $$$$$果汁$$$$$

我的 Jupyter 笔记本的屏幕截图

另外,我很高兴接受改进我的问题的提示,谢谢。

克里斯

标签: pythonfunctionjupyter-notebook

解决方案


两者之间的区别在于如何x.rjust(2*n, '$').ljust(3*n, '$')处理线路。

该行是一个表达式语句。也就是说,它有一个返回值,就像任何其他表达式一样。大多数情况下,当您运行表达式语句时,返回值将被丢弃。无论如何,它可能仍然值得做,因为它的副作用,但你通常不使用表达式语句作为它的返回值。

在交互式解释器会话的顶层运行时,表达式语句的处理方式不同。它不是被忽略的返回值,而是由 REPL(读取-评估-打印循环)的“P”部分处理。这种循环对于许多语言的交互式解释器来说很常见(具体名称来自 LISP,据我了解)。在 Python 中,循环通过依次运行每个语句来工作。它检查任何表达式语句的返回值,如果不是Nonerepr则打印出结果(其他语句类型从不具有返回值,因此它们从不打印任何内容)。

这就是为什么x.rjust(2*n, '$').ljust(3*n, '$')当您在交互式会话的顶层运行它时会给出输出的原因。如果您将它作为脚本的一部分运行,它的行为将类似于函数中的版本,并且该值将被静默丢弃。

处理这种情况的更好方法可能是明确地print输出您想要的任何输出。这可以在任何情况下工作,而不仅仅是在交互式会话中。如果你这样做print(x.rjust(2*n, '$').ljust(3*n, '$')),它就会起作用。请注意,print调用str它的参数,而不是repr,因此输出不会完全相同(例如,您不会得到引号或转义序列来代替输出中的特殊字符)。


推荐阅读