什么';这是+;Python中的(pos)一元运算符?
一般来说,一元什么';这是+;Python中的(pos)一元运算符?,python,Python,一般来说,一元+在Python中应该做什么 我这样问是因为,到目前为止,我从未见过这样的情况: +obj != obj 其中,obj是实现\uuuu pos\uuuu()的通用对象 所以我想知道:为什么+和\uuu pos\uuu()存在?你能提供一个真实的例子,上面的表达式的计算结果是True?我相信Python操作符是受C启发的,其中+操作符是为了对称而引入的(还有一些有用的技巧,请参见注释) 在弱类型语言(如PHP或Javascript)中,+告诉运行时将变量的值强制转换为数字。例如,在
+
在Python中应该做什么
我这样问是因为,到目前为止,我从未见过这样的情况:
+obj != obj
其中,obj
是实现\uuuu pos\uuuu()
的通用对象
所以我想知道:为什么
+
和\uuu pos\uuu()
存在?你能提供一个真实的例子,上面的表达式的计算结果是True
?我相信Python操作符是受C启发的,其中+
操作符是为了对称而引入的(还有一些有用的技巧,请参见注释)
在弱类型语言(如PHP或Javascript)中,+告诉运行时将变量的值强制转换为数字。例如,在Javascript中:
+"2" + 1
=> 3
"2" + 1
=> '21'
Python是强类型的,因此字符串不能作为数字使用,因此不能实现一元加号运算符
对于+obj!=obj:
>>> class Foo(object):
... def __pos__(self):
... return "bar"
...
>>> +Foo()
'bar'
>>> obj = Foo()
>>> +"a"
对于一个实际有意义的例子,请查看
. 它们是reals的超集,包括
无穷小值(+epsilon,-epsilon),其中epsilon为
小于任何其他正数的正值,但
大于0;和无穷大(+无穷大,-无穷大)
您可以定义epsilon=+0
,和-epsilon=-0
虽然1/0
仍未定义,1/epsilon=1/+0
是+无穷大
,而1/-epsilon
=-无穷大
。它是
只不过是将1/x
的限制作为x
a从右(+)或从左(-)移动0
由于0
和+0
的行为不同,因此0!=+0
下面是一个来自decimal
软件包的“真实世界”示例:
>>> from decimal import Decimal
>>> obj = Decimal('3.1415926535897932384626433832795028841971')
>>> +obj != obj # The __pos__ function rounds back to normal precision
True
>>> obj
Decimal('3.1415926535897932384626433832795028841971')
>>> +obj
Decimal('3.141592653589793238462643383')
在Python3.3及更高版本中,使用+
运算符删除非正计数
>>> from collections import Counter
>>> fruits = Counter({'apples': 0, 'pears': 4, 'oranges': -89})
>>> fruits
Counter({'pears': 4, 'apples': 0, 'oranges': -89})
>>> +fruits
Counter({'pears': 4})
因此,如果在计数器中有负计数或零计数,则会出现+obj!=obj
>>> obj = Counter({'a': 0})
>>> +obj != obj
True
对于对称性,因为一元负号是运算符,所以一元加号也必须是运算符。在大多数算术情况下,它不会做任何事情,但请记住,用户可以定义任意类,并将这些运算符用于他们想要的任何操作,即使它不是严格意义上的代数
我知道这是一条老线索,但我想扩展现有答案,以提供更广泛的示例集:
+
可以断言为正,如果不是,则抛出异常-这对于检测拐角情况非常有用
- 对象可以是多值的(把
±sqrt(z)
看作一个单一的对象——对于求解二次方程,对于多分支分析函数,任何你可以用符号将二值函数“折叠”成一个分支的东西。这包括vlopez提到的±0情况
- 如果您执行惰性计算,这可能会创建一个函数对象,该对象会将某些内容添加到应用于其他内容的任何内容中。例如,如果您以增量方式解析算术
- 作为标识函数作为参数传递给某个函数
- 对于符号累加的代数结构——阶梯运算符等等。当然,这可以用其他函数来完成,但可以想象,可以看到类似于
y=++++--++++x
。更重要的是,它们不必相互转换。这构造了一组免费的加号和减号,即使在正式的语法实现中也是有用的。
- 野生用法:在某种意义上,它可以“标记”计算中的一个步骤为“活动”。收割/播种系统——每个加号都会记住值,最后,你可以收集到中间产物……因为为什么不呢
再加上其他人提到的所有打字理由
毕竟,如果你需要的话,多拥有一个操作符是很好的。\uuuu pos\uuuu()
存在于Python中,为程序员提供了与C++
语言中类似的可能性,可以重载操作符,在这种情况下是一元操作符+
(重载运算符意味着对不同的对象赋予它们不同的含义,例如二进制+
对数字和字符串的行为不同-数字是在串接字符串时添加的。)
对象可以实现(除其他外)这些模拟数字类型函数(方法):
因此+object
的意思与object相同。\uuu pos\uuuu()
-它们是可互换的
然而,+object
更容易在眼睛上看到
一个特定对象的创建者有自由的双手来实现他想要的这些功能——就像其他人在他们真实世界的例子中所展示的那样
我的贡献-作为一个笑话:++i!=+i
在C/C++中。这里的许多示例看起来更像bug。不过,这一个实际上是一个功能:
+
运算符表示一个副本。
这在为标量和数组编写通用代码时非常有用
例如:
def f(x, y):
z = +x
z += y
return z
此函数在标量和NumPy数组上工作,无需制作额外副本,无需更改对象类型,无需任何外部依赖项
如果您使用了numpy.positive
或类似的东西,您将引入一个numpy依赖项,并将数字强制为numpy类型,这可能是调用者不希望看到的
如果你做了z=x+y
,你的结果就不一定是与x
相同的类型。在许多情况下,这是可以的,但如果不是,那就不是一个选项
如果您执行了z=--x
,您将创建一个不必要的副本,这很慢
如果执行了z=1*x
,则会执行不必要的乘法运算,这也很慢
如果你真的复制了。复制我猜是这样的
def f(x, y):
z = +x
z += y
return z