【问题标题】:Python prefix postfix infix, no parenthesesPython 前缀后缀中缀,无括号
【发布时间】:2018-10-20 00:14:19
【问题描述】:

我是从 Mathematica 来到 Python 的。是否有像 Python 中的 Mathematica 那样不带括号的前缀、后缀和中缀运算符?

例如在数学中

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

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

【问题讨论】:

  • 您曾经可以使用打印语句:print 'something', but Python3 changed that so print` 是一个函数。现在print('something') 是常态。对于交互式工作来说,它可能不那么方便,但它保证了更大的一致性和灵活性。是的,试试ipython 和/或jupyter。它具有自动括号功能:ipython.org/ipython-doc/3/interactive/…
  • 用括号包裹整个内容对于一个好的文本编辑器来说并不是那么麻烦。这种事情有键盘快捷键。

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


【解决方案1】:

Python 没有任何后缀运算符,但如果你真的很努力,你可以使用magic r-dunder methods 和中缀运算符来模仿它们。

例如,

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——另请参阅 ,; 以使用自动引号进行自动调用)。

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

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

?

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

【讨论】:

  • 我正在使用 Jupyter 和 c9.io。我刚刚在笔记本上尝试了自动括号/,效果很好。不幸的是,它在 c9 中不起作用。 / 是否堆叠或仅用于一行中的第一个字符。 /print /sum data 会起作用吗?
  • @IshouldchangemyUsername 自动调用仅适用于 IPython,不适用于 .py 文件。它必须是第一个起作用的字符(缩进除外)。你不能真正嵌套它们。
  • 不过你可以/print sum(data)
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
相关资源
最近更新 更多