Ayuda en Python

Buenas:
Estoy haciendo un curso de python y en uno de los ejercicios tenemos que desarrollar un programa, la cosa es que lo tenemos que hacer poco a poco y en esta fase de desarrollo por el momento esto es lo que tiene que hacer:
-Pedir que introduzcas una palabra
-Detectar que es una palabra y no un número
-Detectar si esta vacia(Hay esta el problema)
-Volver la palabra en minuscula
-Detectar si empieza por vocal o consonante
Aquí el codigo y el mensaje de error:
pyg = 'ei'
original = raw_input('Escribe una palabra:')
#Chequeo>
if len(original) > 0 and original.isalpha():
   print original and original.lower()
else:
   print 'Vacio'
palabra= original.lower()
primera= palabra[0] #primera letra
if primera== "a" or primera=="e" or primera=="i" or primera=="o" or primera=="u":
    print "vocal"
elif primera== "A" or primera=="E" or primera=="I" or primera=="O" or primera=="U":
    print "vocal"
else:
    print "consonante"

Error al no poner nada y hacer intro:
Traceback (most recent call last):
  File "python", line 9, in <module>
IndexError: string index out of range

Por cierto todavía no hemos dado las funciones
A ver, por partes:

- En esta porción de código:
if len(original) > 0 and original.isalpha():
   print original and original.lower()
else:
   print 'Vacio'

Compruebas si lo que te introduce el usuario no está vacío o no es número, hasta ahí bien pero claro si no pasa esas dos validaciones printas "Vacío" y te quedas tan ancho porque luego sigues con la ejecución del programa. Por eso te salta ese error, porque el string no tiene primera posición al estar vacío. Aquí deberías parar el programa de alguna forma, usar un booleano tipo "valido" = true y si está vacío "valido" = false y nada más hacer el primer chequeo haces:
if valido:
    #Codigo...


- Lo segundo que veo mal es esa porción de código aunque no sé si es porque aun no lo has terminado o qué porque no tiene ningún sentido:
palabra= original.lower()
primera= palabra[0] #primera letra
if primera== "a" or primera=="e" or primera=="i" or primera=="o" or primera=="u":
    print "vocal"
elif primera== "A" or primera=="E" or primera=="I" or primera=="O" or primera=="U":
    print "vocal"

Es decir, a parte de que podrías ponerlo todo en un solo if, jamás va a entrar en ese segundo if ya que antes has convertido el string a minúsculas.

Espero haberte aclarado algunas dudas.
RC9 escribió:A ver, por partes:

- En esta porción de código:
if len(original) > 0 and original.isalpha():
   print original and original.lower()
else:
   print 'Vacio'

Compruebas si lo que te introduce el usuario no está vacío o no es número, hasta ahí bien pero claro si no pasa esas dos validaciones printas "Vacío" y te quedas tan ancho porque luego sigues con la ejecución del programa. Por eso te salta ese error, porque el string no tiene primera posición al estar vacío. Aquí deberías parar el programa de alguna forma, usar un booleano tipo "valido" = true y si está vacío "valido" = false y nada más hacer el primer chequeo haces:
if valido:
    #Codigo...


- Lo segundo que veo mal es esa porción de código aunque no sé si es porque aun no lo has terminado o qué porque no tiene ningún sentido:
palabra= original.lower()
primera= palabra[0] #primera letra
if primera== "a" or primera=="e" or primera=="i" or primera=="o" or primera=="u":
    print "vocal"
elif primera== "A" or primera=="E" or primera=="I" or primera=="O" or primera=="U":
    print "vocal"

Es decir, a parte de que podrías ponerlo todo en un solo if, jamás va a entrar en ese segundo if ya que antes has convertido el string a minúsculas.

Espero haberte aclarado algunas dudas.

No termino de entender que quieres decir con válido, ten en cuenta que estas hablando con un novato. ¿Es una variable?. Bueno lo de las mayúsculas a mi también me parecía que no tenia sentido pero es que el curso decía que lo hiciera también con las mayúsculas así que yo lo hice por si las moscas y bueno claro el programa todavía esta a un 40%, todavía no cumple su función principal: traducir una palabra de español a Pig Latin
EDIT: Vale tras pensar un poco he captado la idea pero no se me ha dado bien ponerla en práctica, el codigo:
pyg = 'ei'
original = raw_input('Escribe una palabra:')
#Chequeo>
if len(original) > 0 and original.isalpha():
   print original and original.lower() and valido= True
else:
   print 'Vacio' and valido= False
if valido= True:
palabra= original.lower()
primera= palabra[0] #primera letra
if primera== "a" or primera=="e" or primera=="i" or primera=="o" or primera=="u":
    print "vocal"
elif primera== "A" or primera=="E" or primera=="I" or primera=="O" or primera=="U":
    print "vocal"
else:
    print "consonante"

El error:
  File "python", line 6
    print original and original.lower() and valido= True
                                                  ^
SyntaxError: invalid syntax
A lo que me refiero es:
if len(original) > 0 and original.isalpha():
   valido = true
   print original and original.lower()
else:
   valido = false
   print 'Vacio'

if valido:
    #seguir con el codigo...
RC9 escribió:A lo que me refiero es:
if len(original) > 0 and original.isalpha():
   valido = true
   print original and original.lower()
else:
   valido = false
   print 'Vacio'

if valido:
    #seguir con el codigo...

Gracias el código ya me funciona pero hay una cosa que no he terminado de entender el porque al final solo pones if valido: en vez de if valido= True:
Cuando el intérprete llega al if, lo que hace es comprobar si la condición del if es True o False. Si pones:
if valido == True:

El intérprete mira la condición:
valido == True

Y genera el resultado, que en este caso es True, quedando:
if True:

Como valido sólo puede tomar dos condiciones (True o False), puedes omitir la comparación.
Korso10 escribió:Cuando el intérprete llega al if, lo que hace es comprobar si la condición del if es True o False. Si pones:
if valido == True:

El intérprete mira la condición:
valido == True

Y genera el resultado, que en este caso es True, quedando:
if True:

Como valido sólo puede tomar dos condiciones (True o False), puedes omitir la comparación.

Gracias por la respuesta
6 respuestas