Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是+;Python中的(pos)一元运算符?_Python - Fatal编程技术网

什么';这是+;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