Python前缀后缀中缀,不带括号

时间:2018-10-20 00:14:19

标签: python wolfram-mathematica postfix-notation postfix-operator

我从Mathematica来到Python。是否像Python中的Mathematica一样,没有括号的前缀,后缀和中缀运算符?

例如在Mathematica中

Print@@string
string~Join~string
data//Sum

我发现我一直在使用print来测试功能,并且不得不用括号将整个内容包装起来似乎很麻烦并且清理速度很慢。有没有办法在Python3中使用[i for i in data]//Print

1 个答案:

答案 0 :(得分:2)

Python没有任何后缀运算符,但是如果您尝试的话,可以使用magic r-dunder methods和infix运算符来模仿它们。

例如,

class PrintType:
    def __rfloordiv__(self, other):
        print(other)

Print = PrintType()

[1, 2, 3]//Print

您可能仍然需要括号才能获得正确的优先级。

Python在文档中确实有一个operator precedence table。因此,优先级较高的运算将首先应用,并且不需要显式的括号,例如10 + 2 * 3与Python中的10 + (2 * 3)相同。

您甚至可以将其推广为任意的1参数函数,

class Slash2:
    def __init__(self, fn):
        self.fn = fn

    def __rfloordiv__(self, other):
        return self.fn(other)

Print = Slash2(print)
Sum = Slash2(sum)

[1, 2, 3]//Sum//Print
# prints "6"
[1, 2, 3]//Slash2(sum)//Slash2(print)  # Same thing.

如果您习惯使用Mathematica,我建议您使用Jupyter笔记本进行Python实验,因为您会熟悉单元格的范例。

Jupyter的Python内核IPython确实具有%的魔力,在某种程度上扩展了本机Python语法。 IPython包含一个%autocall选项,以调用不带括号的函数。在某些情况下,这可能会导致歧义,因此默认情况下处于禁用状态。

您还可以使用/ for a similar effect开头(仅在IPython中有效-另请参见,;以获取带有自动引号的自动调用)。 / p>

与IPython repl中一样,Jupyter单元格中的最后一条语句的值将自动显示为输出-您不必在其上调用print。对于某些数据类型,例如Pandas数据帧,最好不要这样做。也可以对其进行配置,以显示同一单元格中多个语句的输出。

您应该尝试在Jupyter中执行的第一个单元格是

?

只是一个问号。这将显示解释IPython功能的在线帮助。