TypeError: плохой тип операнда для унарного -: 'str'
У меня проблема с Python 2.7.3-32bits на Windows. Я поставил этот код, чтобы посмотреть, может ли кто-нибудь помочь мне с этой ошибкой. Комментарии на испанском языке, но это не влияет на код.
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:\UsersxxxDesktopxxxx.png_copia")[1][1:].lower()
pb2.save("C:\UsersxxxDesktopxxxx.png_copia",ext)
print"FINISH"
При запуске кода python я получаю следующую ошибку:
Traceback (most recent call last):
File "F:DropboxPráctica PitónPráctica3.0.py", line 71, in <module>
pm2 = recorrido(pm1, xc, yc, r, e)
File "F:DropboxPráctica PitónPráctica3.0.py", line 59, in recorrido
x= str(--r)
TypeError: bad operand type for unary -: 'str'
2 ответа:
Сообщение об ошибке говорит вам, что
r
является строкой. Вы не можете отрицать строку.Почему это строка? Ну, кажется, это происходит отсюда:
# ... puntos= raw_input() arrayPuntos = puntos.split(" ") # ... r =(puntos[2])
Метод
split
для строки возвращает список строк.Итак, как вы решаете эту проблему? Ну, если
r
- это, скажем, строка "22", тоfloat(r)
- это float22.0
, аint(r)
- целое число22
. Один из них, вероятно, то, что вы хотите.Как только вы добавите, скажем,
r=int(r)
, Ваш--r
больше не будет исключение.
Но это, вероятно, не то, что вы хотите. В Python--r
просто означает отрицание отрицанияr
-другими словами, это то же самое, что и-(-(r))
, которое простоr
. Вероятно, вы ищете эквивалент префиксного оператора C--
, который уменьшает переменную и возвращает новое значение. В Python нет такого оператора; фактически, нет операторов, которые изменяют переменную и затем возвращают значение. Это часть более масштабной проблемы. Python предназначен для того, чтобы делать утверждения и выражения как можно более различными, чтобы избежать путаницы. C предназначен для того, чтобы сделать как можно больше выражений, чтобы сэкономить ввод текста. Таким образом, вы часто не можете просто перевести один в другой строку за строкой.В этом случае вы должны сделать это в два этапа, как показывает Танасис Петсас:
r -= 1 x = str(r)