Sí, me perdí la funcionalidad ++ y - también. Unos pocos millones de líneas de código c graban ese tipo de pensamiento en mi vieja cabeza, y en lugar de luchar contra él ... Aquí hay una clase que improvisé que implementa:
pre- and post-increment, pre- and post-decrement, addition,
subtraction, multiplication, division, results assignable
as integer, printable, settable.
Aquí está:
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
Puede usarlo así:
c = counter() # defaults to zero
for listItem in myList: # imaginary task
doSomething(c.postinc(),listItem) # passes c, but becomes c+1
... ya teniendo c, podrías hacer esto ...
c.set(11)
while c.predec() > 0:
print c
....o solo...
d = counter(11)
while d.predec() > 0:
print d
... y para (re) asignación en entero ...
c = counter(100)
d = c + 223 # assignment as integer
c = c + 223 # re-assignment as integer
print type(c),c # <type 'int'> 323
... mientras que esto mantendrá c como contador de tipo:
c = counter(100)
c.set(c + 223)
print type(c),c # <class '__main__.counter'> 323
EDITAR:
Y luego está este comportamiento inesperado (y completamente no deseado) ,
c = counter(42)
s = '%s: %d' % ('Expecting 42',c) # but getting non-numeric exception
print s
... porque dentro de esa tupla, getitem () no es lo que se usó, sino que se pasa una referencia al objeto a la función de formateo. Suspiro. Entonces:
c = counter(42)
s = '%s: %d' % ('Expecting 42',c.v) # and getting 42.
print s
... o, más detalladamente, y explícitamente lo que realmente queríamos que sucediera, aunque la verbosidad lo contrarresta en forma real (use c.v
en su lugar) ...
c = counter(42)
s = '%s: %d' % ('Expecting 42',c.__getitem__()) # and getting 42.
print s
++
y--
operadores?sta x++
... la instrucción atómica que resulta almacena ela
acumulador dondex
está apuntando, luego aumentax
según el tamaño del acumulador. Esto se hace porque es más rápido que la aritmética de puntero, porque es muy común y porque es fácil de entender. Tanto antes como después.