5

Pythonインタープリター(2.7.3)が次のようになる理由を誰かが説明できますか:

>>> 5 -+-+-+ 2

3

これはこれまで役に立ちましたか? また、どのような目的で使用されていますか?

4

4 に答える 4

10

ここを使用disして、式が実際にどのように評価されたかを確認できます。

In [29]: def func():
   ....:     return 5 -+-+-+ 2
   ....: 

In [30]: import dis

In [31]: dis.dis(func)
  2           0 LOAD_CONST               1 (5)
              3 LOAD_CONST               2 (2)
              6 UNARY_POSITIVE      
              7 UNARY_NEGATIVE      
              8 UNARY_POSITIVE      
              9 UNARY_NEGATIVE      
             10 UNARY_POSITIVE      
             11 BINARY_SUBTRACT     
             12 RETURN_VALUE        

したがって、その式は次と同等です。

In [32]: 5 - (+(-(+(-(+(2))))))
Out[32]: 3
于 2013-04-08T23:23:59.400 に答える
6

これはちょうど等しい

5 - (+(-(+(-(+2)))))

+ と - はすべて単項演算子です。数値の場合+、オペランドを変更せずに返します。ただし、その意味は__pos__、独自のクラスで特別なメソッドを使用してオーバーライドできます。

__neg__数値でこれを行うのは無意味な難読化ですが、カスタムおよび/または__pos__操作でクラスインスタンスを使用している場合は (信じられないほど混乱する場合) 役立つ場合があります。


これを悪用して、C のようなプリインクリメント--++演算子を取得できます。実際にこれを行うことはありません。

class IncrementableInteger(object):
    def __init__(self, val=0):
        self.val = val
    def __pos__(self):
        class PlusOne:
            def __pos__(_self):
                self.val += 1
        return PlusOne()
    def __neg__(self):
        class MinusOne:
            def __neg__(_self):
                self.val -= 1
        return MinusOne()
    def __str__(self):
        return str(self.val)
    def __repr__(self):
        return repr(self.val)

例:

>>> IncrementableInteger(4)
4
>>> v=_
>>> ++v
>>> v
5
于 2013-04-08T23:23:31.427 に答える
3

コードを難読化する以外に、これに対するユーティリティはありません。

これに対する評価は次のとおりです。

5 -+-+-+ 2 = 5 -(+(-(+(-(+ 2)))))
           = 5 -(+(-(+(- 2))))
           = 5 -(+(-(- 2)))
           = 5 -(+(+ 2))
           = 5 -(+ 2)
           = 5 - 2
           = 3
于 2013-04-08T23:26:03.793 に答える