我如何使用预递增/递减操作符(++,——),就像在c++ ?

为什么++计数运行,但不改变变量的值?


当前回答

一个直截了当的解决办法

c = 0
c = (lambda c_plusplus: plusplus+1)(c)
print(c)
1

不再打字

 c = c + 1

你也可以直接写 c++ 完成所有代码,然后搜索/替换“c++”,替换为“c=c+1”。只要确保正则表达式搜索是关闭的。

其他回答

虽然其他答案是正确的,因为它们表明了单纯的+通常做什么(即,保持数字的原样,如果它是1),他们是不完整的,因为他们没有解释发生了什么。

确切地说,+ x等于x.__pos__()和+ + x x.__pos__ () .__pos__()。

我可以想象一个非常奇怪的阶级结构(孩子们,不要在家里这样做!),像这样:

class ValueKeeper(object):
    def __init__(self, value): self.value = value
    def __str__(self): return str(self.value)

class A(ValueKeeper):
    def __pos__(self):
        print 'called A.__pos__'
        return B(self.value - 3)

class B(ValueKeeper):
    def __pos__(self):
        print 'called B.__pos__'
        return A(self.value + 19)

x = A(430)
print x, type(x)
print +x, type(+x)
print ++x, type(++x)
print +++x, type(+++x)

python中不像C语言中那样有后/前自增/自减操作符。

我们可以看到++或-作为多个符号相乘,就像我们在数学中做的(-1)*(-1)=(+1)。

E.g.

---count

解析为

-(-(-count)))

翻译过来就是

-(+count)

因为-号和-号的乘法是+

最后,

-count

在Python中,表达式和语句之间有严格的区别 与Common Lisp、Scheme或 Ruby。

维基百科

因此,通过引入这样的操作符,可以打破表达式/语句的分割。

和你不能写作的原因一样

if x = 0:
  y = 1

就像在其他一些不保留这种区别的语言中一样。

在python 3.8+中,你可以做:

(a:=a+1) #same as ++a (increment, then return new value)
(a:=a+1)-1 #same as a++ (return the incremented value -1) (useless)

你可以用这个做很多思考。

>>> a = 0
>>> while (a:=a+1) < 5:
    print(a)

    
1
2
3
4

或者如果你想写一些更复杂的语法(目标不是优化):

>>> del a
>>> while (a := (a if 'a' in locals() else 0) + 1) < 5:
    print(a)

    
1
2
3
4

即使'a'不存在也会返回0,然后将其设置为1

是的,我也错过了++和-功能。几百万行c代码让这种想法在我的老头脑中根深蒂固,而不是与它斗争……这里是一个我拼凑起来实现的类:

pre- and post-increment, pre- and post-decrement, addition,
subtraction, multiplication, division, results assignable
as integer, printable, settable.

这里的是:

class counter(object):
    def __init__(self,v=0):
        self.set(v)

    def preinc(self):
        self.v += 1
        return self.v
    def predec(self):
        self.v -= 1
        return self.v

    def postinc(self):
        self.v += 1
        return self.v - 1
    def postdec(self):
        self.v -= 1
        return self.v + 1

    def __add__(self,addend):
        return self.v + addend
    def __sub__(self,subtrahend):
        return self.v - subtrahend
    def __mul__(self,multiplier):
        return self.v * multiplier
    def __div__(self,divisor):
        return self.v / divisor

    def __getitem__(self):
        return self.v

    def __str__(self):
        return str(self.v)

    def set(self,v):
        if type(v) != int:
            v = 0
        self.v = v

你可以这样使用它:

c = counter()                          # defaults to zero
for listItem in myList:                # imaginary task
     doSomething(c.postinc(),listItem) # passes c, but becomes c+1

...已经有了c,你可以这样做。

c.set(11)
while c.predec() > 0:
    print c

....或者只是……

d = counter(11)
while d.predec() > 0:
    print d

...和(重)赋值为整数…

c = counter(100)
d = c + 223 # assignment as integer
c = c + 223 # re-assignment as integer
print type(c),c # <type 'int'> 323

...而这将保持c作为类型计数器:

c = counter(100)
c.set(c + 223)
print type(c),c # <class '__main__.counter'> 323

编辑:

还有一点出乎意料(完全不受欢迎)的行为,

c = counter(42)
s = '%s: %d' % ('Expecting 42',c) # but getting non-numeric exception
print s

...因为在该元组中,没有使用getitem(),而是将对象的引用传递给格式化函数。叹息。所以:

c = counter(42)
s = '%s: %d' % ('Expecting 42',c.v) # and getting 42.
print s

...或者,更详细,更明确地说,我们实际上想要发生什么,尽管在实际形式中与冗长相反(使用c.v代替)……

c = counter(42)
s = '%s: %d' % ('Expecting 42',c.__getitem__()) # and getting 42.
print s