我想定义自己的运算符。Python支持这样的操作吗?
虽然在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
toolz
的pipe
结合了起来。 pip = Infix(lambda x,y: pipe(x,y))
,然后8 |pip| range |pip| sum |pip| range
。看起来可以正常工作。 - cantdutchthisand
运算符。 - Yushin Washio不可以创建新的运算符。但是,如果您只是要评估表达式,您可以处理字符串并计算新运算符的结果。
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
Python 3.5引入了符号@
以作为额外的运算符。
PEP465引入了这个新运算符,用于简化许多数值代码的表示。该运算符不会为所有类型实现,而仅针对数组状对象。
您可以通过实现__matmul__()
来支持该运算符用于您的类/对象。
该PEP留出了空间,使非数组状对象可以使用不同的运算符用途。
当然,您也可以用@
实现任何与矩阵乘法不同的操作,但用户体验将受到影响,因为每个人都期望您的数据类型表现出不同的行为。
@
是一个新的操作符号吗?还是说我们可以用它来定义自己的新操作符? - Addem@
是一个新的操作符。这就是它的全部含义。事实仍然存在:你不能在Python中定义自己的操作符。 - John Red如果您想将操作应用于特定类的对象,可以覆盖与功能最接近的运算符...例如,覆盖 __eq__()
将覆盖 ==
运算符并返回您想要的结果。这适用于几乎所有的运算符。
$
),然后使用一些Python代码来编辑自己(使用open
函数),将所有的a $ b
替换为function(a,b)
。 - whackamadoodle3000