我想定义自己的运算符。python支持这样的事情吗?
Answers:
从技术上讲,您无法在Python中定义新的运算符,但这种巧妙的技巧可解决此限制。它允许您定义如下中缀运算符:
# simple multiplication
x=Infix(lambda x,y: x*y)
print 2 |x| 4
# => 8
# class checking
isa=Infix(lambda x,y: x.__class__==y.__class__)
print [1,2,3] |isa| []
print [1,2,3] <<isa>> []
# => True
pipe
from相结合toolz
。pip = Infix(lambda x,y: pipe(x,y))
。然后8 |pip| range |pip| sum |pip| range
。似乎有效。
Sage提供了此功能,基本上使用了@Ayman Hourieh所描述的“聪明的技巧”,但作为装饰器并入模块中,以提供更整洁的外观和其他功能-您可以选择要重载的运算符,从而选择评估顺序。
from sage.misc.decorators import infix_operator
@infix_operator('multiply')
def dot(a,b):
return a.dot_product(b)
u=vector([1,2,3])
v=vector([5,4,3])
print(u *dot* v)
# => 22
@infix_operator('or')
def plus(x,y):
return x*y
print(2 |plus| 4)
# => 6
如果打算将操作应用于特定的对象类,则可以覆盖与您的函数最接近的运算符...例如,覆盖__eq__()
将覆盖==
运算符以返回所需的任何内容。这几乎适用于所有运营商。
Python 3.5引入了@
用于额外运算符的符号。
PEP465引入了这种用于矩阵乘法的新运算符,以简化许多数字代码的表示法。不会为所有类型实现该运算符,而只会为类似于数组的对象实现。
您可以通过实现来支持您的类/对象的运算符__matmul__()
。
PEP为类似非数组的对象留出空间供操作员不同使用。
当然,@
对于类似于数组的对象,您也可以使用不同于矩阵乘法的任何类型的操作来实现,但是用户体验会受到影响,因为每个人都希望您的数据类型以不同的方式运行。
@
是一个新的运算符符号吗?还是我们可以以某种方式使用它来定义我们自己的新运算符?
@
是一个新运算符。而已。事实仍然存在:您无法在Python中定义自己的运算符。
$
),然后使用一些python代码进行自我编辑(带有open
),然后全部更改a $ b
为function(a,b)