【问题标题】:TypeError: bad operand type for unary -: 'str'TypeError:一元操作数类型错误-:'str'
【发布时间】:2013-03-28 12:52:17
【问题描述】:

我在 Windows 上遇到了 Python 2.7.3-32 位问题。我放了这段代码,看看是否有人可以帮助我解决这个错误。 cmets 是西班牙语,但不会影响代码。

 import gtk
 import numpy
 import math
 import os

 #Pedimos el nombre de la imagen de origen
 nombreFich = input("Por favor, introduzca el nombre de la imagen de origen:")

 #Validar que existe el fichero
 imagen1 = gtk.Image()
 imagen1.set_from_file('C:\\Users\\xxx\\Desktop\\xxxx.png')
 pb1 = imagen1.get_pixbuf()
 pm1 = pb1.get_pixels_array()

 #Hacemos una copia de la imagen
 pm2 = pm1.copy()

 #Validamos los puntos de distorsion hasta que sean validos
 puntos = " "
 arrayPuntos = " "
 while(puntos == " " and len(arrayPuntos) < 4):
     print"Por favor, introduzca los puntos de distorsión xc yc r e:"
     puntos= raw_input()
     arrayPuntos = puntos.split(" ")

 #Sacamos los puntos separando la cadena por el caracter espacio
 xc =(puntos[0])
 yc =(puntos[1])
 r =(puntos[2])
 e =(puntos[3])

 #función que calcula el grado de distorsión
 def grado(self,z,e): 
     if(z>1):
         return 1
     elif(e<0):
         return (1/z)**(-e/(1-e))
     else:
        return z**e

 #Distorsionamos la imagen
 def distors(xc,yc,r,e,x,y):
     d = math.sqrt(x**2+y**2)#Sacamos la distancia
     z = d/r
     if(z!=0):
         g=grado(z,e)
         xm=x*g
         ym=y*g
         return xm,ym

     else:
         xm=x
         ym=y
         return xm,ym
 def recorrido (pm1, xc, yc, r, e):
     pm2 = pm1.copy()

     x= str(--r)
     y= str(--r)
     while (y <= r):                     
         while (x <= r):
             xm, ym = mover(xc, yc, r, e, x, y)
             pm2[yc+y][xc+x] = pm1[yc+ym][xc+xm]
             x = x+1
         y= y+1
         x= -r


     return pm2
 pm2 = recorrido(pm1, xc, yc, r, e)

 #Guardamos los cambios
 pb2 = gtk.gdk.pixbuf_new_from_array(pm2,pb1.get_colorspace(),pb1.get_bits_per_sample())
 nomfich2 = nombreFich+"_copia"
 ext = os.path.splitext("C:\\Users\xxx\Desktop\xxxx.png_copia")[1][1:].lower()
 pb2.save("C:\\Users\xxx\Desktop\xxxx.png_copia",ext)
 print"FINISH"

当我运行 python 代码时,我收到以下错误:

 Traceback (most recent call last):
   File "F:\Dropbox\Práctica Pitón\Práctica3.0.py", line 71, in <module>
     pm2 = recorrido(pm1, xc, yc, r, e)
   File "F:\Dropbox\Práctica Pitón\Práctica3.0.py", line 59, in recorrido
     x= str(--r)
 TypeError: bad operand type for unary -: 'str'

【问题讨论】:

    标签: python string python-2.7 typeerror


    【解决方案1】:

    python 不支持递增 ++ 和递减 -- 运算符。 你可以改用这个:

    r -= 1
    x = str(r)
    

    【讨论】:

      【解决方案2】:

      错误消息告诉您r 是一个字符串。你不能否定一个字符串。

      为什么是字符串?嗯,好像是从这里来的:

      # ...
      puntos= raw_input()
      arrayPuntos = puntos.split(" ")
      # ...
      r =(puntos[2])
      

      字符串上的split 方法返回一个字符串列表。

      那么,你如何解决这个问题?好吧,如果r 是字符串“22”,那么float(r) 是浮点数22.0int(r) 是整数22。其中之一可能就是您想要的。

      一旦您添加了r=int(r),您的--r 将不再是一个例外。


      但这可能不是你想要的。在 Python 中,--r 只是表示对r 的否定——也就是说,它与-(-(r)) 相同,也就是r。您可能正在寻找与 C 前缀运算符-- 等效的东西,它会递减变量并返回新值。 Python 中没有这样的运算符;事实上,不存在修改变量然后返回值的运算符。

      这是一个更大问题的一部分。 Python 旨在使语句和表达式尽可能不同,以避免混淆。 C 旨在使尽可能多的东西表达,以节省打字。因此,您通常不能只逐行将一个翻译成另一个。

      在这种情况下,您必须分两步完成,如 Thanasis Petsas 所示:

      r -= 1
      x = str(r)
      

      【讨论】:

        猜你喜欢
        • 2021-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        • 1970-01-01
        相关资源
        最近更新 更多