Una ayudita con python, saber tipo de datos

Hola a todos:
Estoy aprendiendo python, y para ello estoy intentando hacer un programilla muy simple que te diga la letra de un dni. El programa es el siguiente:
try:
   dni = int (raw_input("Por favor, introduce un DNI(8 numeros): "))


   while len (str(dni)) < 8 or len (str(dni)) > 8:
      print "Tiene que tener 8 numeros"
      dni = int (raw_input("Vuelve a introducirlo: "))

   
   num = dni % 23

   letra = "TRWAGMYFPDXBNJZSQVHLCKE"[num]

   print letra

except ValueError:
   print "Introduce solo numeros"

Lo que yo quiero es que sepa cuándo introduces algo que no es un número, y la única forma que he encontrado es con try except. Lo que yo querría es, mediante un while, poder hacer que vuelva al principio si has introducido una letra, algo así como:
while dni != int
pero claro, lo pongo así y me da error.
Me gustaría es saber si hay alguna manera para comprobar el tipo de datos asignados a una variable.

Muchas gracias ;)
is_int = lambda x: type(x) in [type(1),type(1L)]

Primer resultado de buscar en google "python is_int" :P

Por cierto, la función para comprobar el tipo de dato de una variable es type()
Gracias por la respuesta, pero me acabo de dar cuenta de que si mezclo letras y números, no es ningún tipo de datos, por lo que no puedo comprobarlo

¿Habría alguna forma de hacer lo que quiero (comprobar que solo has introducido sólo números y si no, volvértelo a pedir)?
Para que compruebe de forma infinita, puedes meter el código en un while infinito que sale cuando el numero sea dígito

puedes hacer algo en plan:

while True:
    dni = raw_input("Dame dni: ")
    if dni.isdigit():
        break


No lo he probado, pero debería de valer, simplemente con raw_input, coge una cadena de números, y luego con el método isdigit de las cadenas, puedes comprobar si la cadena es 100% números. Asi que en un bucle infinito, pones de salida pues un if que comprueba si lo que has introducido es número, y en caso afirmativo sale del bucle.


Y ah, mejor que int(raw_input()) puedes usar directamente: input()


Un saludo.
Muchas gracias X-D creo que ya lo he conseguido. Así me ha quedado:
dni = "a"
while dni.isdigit() == 0 or len (str(dni)) < 8 or len (str(dni)) > 8:

   dni = raw_input("Por favor, introduce un DNI(8 numeros): ")

   
dni = int (dni)

num = dni % 23

letra = "TRWAGMYFPDXBNJZSQVHLCKE"[num]

print letra


Gracias de nuevo [360º]
no te valdría simplemente poner el while así:

while not dni.isdigit() or len(str(dni)) != 8:


También puedes colocar dni como una cadena vacía para entrar al while

dni = ""



Un saludo.
Fox escribió:no te valdría simplemente poner el while así:

while not dni.isdigit() or len(str(dni)) != 8:


También puedes colocar dni como una cadena vacía para entrar al while

dni = ""



Un saludo.


Tienes toda la razón, mucho más fácil [tomaaa]
Gracias (otra vez [carcajad] )
Una preguntita (es para no abrir un hilo entero si se me puede contestar facilmente aquí...). ¿Cómo puedo usar una función antes de declararla?
print factorial(1)

def factorial(x):
if x == 0:
return 1
else:
return x * factorial(x-1)

Esto me da error, ¿Se puede declarar algo como se hace en C que indica que mas adelante existe la función delcarada? (¿O python por ser interpretado no acepta eso...?)
JAPosti escribió:Una preguntita (es para no abrir un hilo entero si se me puede contestar facilmente aquí...). ¿Cómo puedo usar una función antes de declararla?

Esto me da error, ¿Se puede declarar algo como se hace en C que indica que mas adelante existe la función delcarada? (¿O python por ser interpretado no acepta eso...?)


def main():
    print factorial(1)

def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x-1)

if __name__ == "__main__":
    main()
graicas zootropo :) no sabía qeu había método main XD acabo de empezar hoy con python.

¿Para que haces esto?

if __name__ == "__main__":
main()
En python todo es un objeto. Incluso el propio módulo.
El módulo tiene una propiedad __name__ que vale __main__ cuando se lanza el script como programa en lugar de importarlo. Luego estás diciéndole que cuando se lance el script llame al método llamado main (que no tendría por qué llamarse así).
Según lo escribías tú si cualquiera importara tu módulo ejecutaría el código que tienes fuera de la función.
Yo prefiero poner las funciones o clases arriba y abajo del todo el main, aunque si hago OO, pues las clases en otro fichero y el main en otro :P

lo de if __name__ == "__main__" tiene una utilidad muy grande para mi.

Imagina que haces un programa y escribes un módulo para manejar la base de datos, pues si pones eso, debajo puedes poner código para probar esa libreria, asi que si ejecutas directamente el módulo, pues se ejecutará la prueba, si lo ejecutas desde otro modulo, pues funciona normal.

¿Por qué funciona asi? pues como dice zootropo, __name__ valdrá __main__ cuando se ejecuta directamente, si se ejecuta desde otro módulo, contendrá el nombre de ese módulo, asi que el if no se cumplirá y no se ejecutará el código de prueba.

Bueno, cualquier pregunta que tengas la dices :P


Un saludo.
11 respuestas