Métodos y Propiedades en Python
En este segundo capítulo, seguimos con nuestro ejemplo presupuesto.py introduciéndonos a desarrollar, los temas pendientes del capítulo I, pero no sin antes, unos consejos para razonar errores de código como un programador profesional:
- No desesperes. La magia en la programación no existe. Si el código falla, es porque algo hemos hecho mal.
- Lee detenidamente el error que Python devuelve (presta atención a las últimas líneas donde se detalla línea en la que falla, método o algoritmo donde se produce y descripción del error). Un ejemplo:
Traceback (most recent call last): File "", line 1, in File "presupuesto.py", line 158, in presupuesto = ModeloDePresupuesto() File "presupuesto.py", line 152, in __init__ self.set_datos_basicos() File "presupuesto.py", line 45, in set_datos_basicos self.seleccionar_plan() File "presupuesto.py", line 59, in seleccionar_plan elegir_plan = int(elegir_plan) ValueError: invalid literal for int() with base 10: '' >>>
- Intenta resolverlo tu mismo ¿cómo?
- lee la descripción del error y piensa como se produjo (es decir, cuál fue el paso previo)
- verifica la línea de código donde se produjo el error ¿sintaxis?
- Compara el código con el del ejemplo. ¿Lo ves igual? Entonces no pierdes nada, copiándolo textualmente de nuevo.
- ¿Sigue fallando? busca el error en Internet (¿Google?)
- Si no logras resolverlo, busca ayuda: aquí, en foros o listas de correo, PERO, previamente ten en cuenta:
- Copia el error completo, tal cual se muestra y colócalo como referencia en tu post
- Copia tu código en algún sitio que te permita compartir y corregir código públicamente, como por ejemplo http://pastebin.lugmen.org.ar/
- Coloca en tu post, un enlace hacia el código del Pastebin
Pero ¿por qué tanto lío si es más sencillo preguntar y listo?. Créeme: no lo es. Podrá ser simple preguntar sin intentar resolverlo, pero será complejo cuando comiences a leer las posibles soluciones, pues pueden no estar basadas en la verdadera causa (nadie está allí para conocer tu código ni como se produjo el error). Y por otro lado, si no intentas resolverlo tu mismo, te será más difícil aprender.
Ahora sí, retomemos nuestro código!
Definición de funciones en Python
def set_cliente(self):
Una función (o método) es la forma de definir una determinada acción que realiza un objeto.
Definir Funciones
Para definir una función, se escribe:
def nombre_de_la_funcion(parámetros): # aquí escribimos el código que realiza la acción que definimos
Los parámetros son datos contenidos en variables (una o más), que la función necesitará para realizar la acción. No siempre son necesarios. En nuestro caso, el parámetro self indica que la función requerirá de los atributos contenidos en la clase (los que ya vimos recientemente).
Por ejemplo: self.empresa
está llamando al atributo “empresa” de la clase.
Mientras que mediante: self.empresa = 'Maestros del Web'
, le estoy asignando el valor “Maestros del Web” al atributo empresa de la clase (recuerda que un atributo es una variable).
Referencia a propiedades
Cuando necesito recurrir a un atributo de la clase, dentro de una función, escribo self.nombre_del_atributo
Todo el código contenido dentro de una función (es decir, el que esté debajo de la definición de la función, con tabulado), se llama algoritmo, y es el que indicará a la función, qué es lo que debe hacer.
Interactuando con el usuario mediante raw_input
def set_cliente(self): self.empresa = raw_input('\tEmpresa: ') self.cliente = raw_input('\tNombre del cliente: ')
raw_input()
es una función. Pero no la definimos nosotros, sino que es una función nativa de Python.
La acción que realiza raw_input('Texto que le mostraré al usuario')
, es:
- Muestra al usuario el texto que se encuentra entre comillas, dentro de los parántesis (es decir, que este texto es un parámetro requerido por la función)
- Espera que el usuario escriba algo
- Luego, almacena lo que el usuario escribió. En nuestro caso, será almacenado en los atributos de la clase, empresa y cliente.
Float() otra función nativa (propia) de Python
importe = raw_input('\tImporte bruto: $') self.importe = float(importe)
Hemos almacenado en la variable “importe” un dato ingresado por el usuario:
importe = raw_input('\tImporte bruto: $')
Luego, asignamos esa variable (importe) como valor del atributo importe, pero esta vez, es el atributo importe de la clase:
self.importe = float(importe)
Funciones nativas
Float()
al igual que raw_input()
es una función nativa de Python. Su acción consiste en convertir en número flotante (es decir, con decimales), el número que le sea pasado como parámetro.
Operadores matemáticos: Sumar, restar, dividir y multiplicar con Python
self.monto_iva = self.importe*self.alicuota_iva/100 self.neto = self.importe+self.monto_iva
Podemos realizar sumas, restas, multiplicaciones y divisiones con Python. Y podemos almacenar los resultados de nuestras operaciones matemáticas en variables, incluso aquellas que sean atributos de la clase.
Podemos realizar operaciones matemáticas con números: 1+1 y también con variables cuyos valores sean números: variable_1+variable_2
Operadores matemáticos
Para sumar, utilizamos +
Para restar utilizamos –
Para dividir flotantes utilizamos /
Para dividir enteros utilizamos //
Para multiplicar utilizamos *
Para obtener el resto de una división utilizamos %
Para exponenciar utilizamos **
El operador matemático suma (+)
txt = '\n'+self.divline+'\n' txt += '\t'+self.encabezado_nombre+'\n'
El operador matemático + no solo sirve para sumar números. También sirve para concatenar cadenas de texto (es decir, unirlas). Fíjate esta línea:
txt = '\n'+self.divline+'\n'
Estoy diciendo que la variable txt
es igual a:
la cadena de texto ‘\n’ (\n significa salto de línea)
más el texto contenido en el atributo divline de la clase
más nuevamente, una cadena de texto ‘\n’
Luego, mira la línea que le sigue:
txt += '\t'+self.encabezado_nombre+'\n'
Estoy diciendo aquí, que a la variable txt de antes, le agregue ahora, todo lo demás:
La cadena de texto ‘\t’ (\t significa tabular)
el texto contenido en el atributo encabezado_nombre de la clase
más finalmente, la cadena de salto de línea ‘\n’
Dando formato a cadenas de texto
txt += '\tImporte: $%0.2f | IVA: $%0.2f\n' % (self.importe, self.monto_iva)
¿Haz visto lo difícil de entender que parece este código? Pues ¡Piérdele el miedo! Es mucho más sencillo de lo que parece.
Python nos da la posibilidad de utilizar comodines en nuestras cadenas de texto, para poder reemplezar datos, que necesiten un formato especial.
El comodín es el signo del porcentaje %.
A este comodín, le segurirá un patrón, que identifique el tipo de dato (formato) que queremos darle al dato.
Por ejemplo: %0.2f
, está indicando que en ese lugar (en vez del comodín y el patrón), debe ir un número flotante con dos decimales. Es decir que el patrón 0.2f significa número con dos decimales.
Hasta allí, entonces, asignamos comodines y patrones. Pero luego, hay que decirle a Python qué datos debe formatear. Para ello, luego de la cadena de texto, escribimos un comodín % segudio de un espacio, y entre parantésis y separados por coma, las variables que contienen los datos a reemplazar.
Veámoslo con otro ejemplo:
a = 10 b = 5 resultado = "%0.2f y %0.2f son dos números flotantes" % (a, b)
Eso, sería como haber escrito esto:
resultado = "10.00 y 5.00 son dos números flotantes"
Imprimiendo texto en la pantalla
print txt
Cuando quieres mostrar texto en la pantalla, solo debes escribir print y lo que desees mostrar.
Pueden ser tanto los datos contenidos en una variable (como en nuestro código) o directamente un dato, como en los siguientes ejemplos:
print 25 print "Cadena de texto"
Creación de objetos
# Instanciar clase presupuesto = ModeloDePresupuesto()
¿Recuerdas cuando hablamos de la diferencia entre clases y objetos? Decíamos que una clase es un “modelo” que sirve como base para crear un objeto.
Pues bien. Es hora de crear nuestro nuevo objeto: un nuevo presupuesto.
Crear objetos
Para instanciar una clase y crear un nuevo objeto se escribe:
nombre_del_objeto = NombreDeLaClase()
Con lo anterior, hemos iniciado un nuevo objeto que será creado según el modelo NombreDeLaClase.
Método constructor de la clase: __init__
# Método constructor def __init__(self):
def __init__(self):
es la definición de una función, al igual que todas las anteriores ¿lo notas?
Pero el nombre de la función __init__
, Python lo reserva para los métodos constructores.
Un método constructor de una clase, es una función que se ejecuta automáticamente cuando crea un objeto.
Estos métodos son sumamente útiles, cuando (como en nuestro caso), necesitamos automatizar todas las tareas.
Anteriormente, vimos como crear el objeto. Si no hubiésemos generado un método __init__, lo que vimos al comienzo cuando ejecutamos presupuesto.py en la consola, no hubiese sido posible, ya que tendríamos que haberle dicho manualmente a nuestro objeto, que realice cada una de las acciones, por ejemplo:
presupuesto.set_cliente() para que realice la acción de crear los datos del cliente
presupuesto.calcular_iva() para que calculara el importe de IVA
Y así con cada acción definida en la clase.
Pero, el método __init__ nos facilita la vida. Pues allí dentro, os encargamos de llamar a todas las funciones (acciones) en el orden correcto, ahorrándonos mucho tiempo:
def __init__(self): # en las siguientes líneas, imprimo texto en pantalla print self.divline print "\tGENERACIÓN DEL PRESUPUESTO" print self.divline self.set_cliente() # aquí seteo los datos del cliente self.set_datos_basicos() # aquí los del presupuesto self.calcular_iva() # calculo el iva self.calcular_neto() # calculo el importe total self.armar_presupuesto()
Finalmente, llamé a la función que se encarga de convertir a texto todo el presupuesto.
Llamar función dentro de otra
Para llamar a una función y que ésta, se ejecute en el interior de otra, se utiliza self.nombre_de_la_funcion()
Chuleta de los Capítulos I y II
Nuevo desafío
En el capítulo de hoy, nos extendimos en cuestiones teóricas sobre referencias del lenguaje que utilizamos en nuestro primer ejemplo. Aprendimos muchas cosas nuevas como:
- Definir funciones
- Utilizar funciones nativas de Python
- Operadores matemáticos
- Dar formato a cadenas de texto
- Entre otras…
Pero algo muy importante que aprendimos es a perderle el miedo a los errores de código y tratar de resolverlos. Y si quieres convertirte en verdadero profesional, te invito a sumarte a un nuevo desafío. A continuación, encontrarás un código fuente. Este código, utiliza algunas cosas que ya hemos aprendido. Además, no te diré donde, pero tiene algún que otro error.
El reto de hoy
- Copia el siguiente código en un archivo, con el nombre que se te ocurra
- Ejecútalo en una terminal (ya sabes como)
- Ve si puedes encontrar el (o los) error(es) y corregirlo(s)
- Si encuentras el(los) error(es), NO lo postees así das tiempo a los demás a hacer lo mismo. Pero, puedes contar que los encontraste y dar pistas para ayudar a otros.
- Si NO encuentras los errores, puedes postear preguntando a quienes sí los hayan encontrado
Si aprendes a trabajar en equipo, colaborando con tus pares (ya sea ofreciendo o pidiendo ayuda) y evitando la competencia, estarás listo para afrontar verdaderos desafíos laborales, que harán que tu carrera se destaque.
Aquí, el código fuente
# -*- coding: utf-8 -*- class Modelo: def __init__(self): self.divisor = 23 valor = raw_input("Elige un número entero entre 0 y 100: "); resultado = self.devolver_resultado(valor) print "%d/%d es %d" % (valor, self.divisor, resulatdo) def devolver_resultado(self, numero): """Divide el núemro por el divisor y devuelve un entero""" resultado = numero//self.divisor return resultado obj = Modelo()
RECUERDA: Si encuentras el error (o los errores), no lo postees hasta que al menos 5 personas hayan indicado que pudieron corregirlo.
Descarga todos los códigos utilizados en la guía, desde LaunchPad
Esto cada vez se pone mejor, nuevo reto para esta semana y esperando la proxima guia, gracias por compartir!!
Se pone buena la cosa, a darle que es mole de olla, saludos desde Mexico.
Heee!!! cumpli el reto =3, ya encontre el error.
La verdad se agradece el empeño que haces eugenia, y tambien maestrosdelweb, por estar interesados en sacar guias de estos lenguajes que van teniendo su presencia, desde hace tiempo que buscaba algo en español de estos lenguajes, solo en ingles, y mi ingles no es muy bueno xD.
Muchas gracias por tus guias, y adelante el siguiente reto =D.
Muy buena guía. Cada vez me motiva más aprender Python, pues (a mi parecer) ofrece la robustez de un lenguaje como Java y la sencillez (y baja curva de aprendizaje) de PHP.
Dejo también, un link para conocer un poco más de comodines: http://docs.python.org/py3k/library/stdtypes.html#old-string-formatting
Ya el código ya fue depurado, si alguien necesita ayuda me dice xD, excelente el tutorial cada vez se pone mejor, así da gusto aprender, muchas gracias Eugenia
Hola! Gracias todos por los comentarios!
Fernando y Andrés ¡Excelente!!! Vamos a dar más tiempo a los demás pythoneros para que puedan resolverlo.
Mientras tanto ¿quién me puede contar que tan sencillo o complejo resultó evaluar el código?
Excelenete tutorail gracias y creo que ya encontre el(los) errores XD
Excelente desafío Muchisimas gracias…No puedo encontrar los errores…Lol
Solucionado…He encontrado el(los) eror(es)) ..seguirémos esperando el siguiente totorial
Pues que creen?? no he podido aun con este script solo he detectado uno el mas fácil los demás aun no, me sigue marcando un error alguna pista?
Bueno, a ver…
Para los que no encontraron los errores (son 2), no se desanimen, que el primero es difícil!
Fíjense que se produce justo después de ingresar el dato solicitado a través de raw_input():
TypeError: unsupported operand type(s) for //: ‘str’ and ‘int’
Ayuda: raw_input() retorna un dato del tipo string (cadena de texto). Es decir que cuando almacenamos en una variable un valor ingresado por raw_input no estamos guardando un número, sino una “cadena de texto” ¿se puede dividir una cadena de texto? (matemáticamente hablando) Es claro que no.
La solución, está al comienzo de este capítulo, en nuestro ejemplo presupuesto.py
—–
El segundo error, es un error de sintaxis (típico error de cuando uno, tipea mal).
NOOOO!!!!!! como es que no lo vi antes, tendré que aplicarme mas.
Gracias y saludos!
Ya eh solucionado los errores, estaba bastante fácil jejeje
si los encontre los errores yeahh! excelente trabajo Eugenia Bahit se agradece el esfuerzo por parte nuestra le pondremos muchas ganas en Aprender!! :3
Excelente a todos los que lograron resolverlo y excelente también quienes hayan hecho el esfuerzo!!
Es hora de postear la solución!!
¿Algún/a corajudo/a que se anime a explicarlo?
Pues la respuesta eran 2 errores como mencionaste eugenia los cuales son :
1.-Al momento de capturar con raw_input, se captura en caracteres, para usar las funciones matematicas basicas, se necesita pasarlo a algun valor numerico, int por ejemplo; para hacerlo se tenia que pasar a entero.Yo lo resolvi guardando la captura en una variable, y pasarla a otra variable, y convertirla por cast a entero:
def __init__(self):
self.divisor = 23
vac = raw_input(“Elige un n�mero entero entre 0 y 100: “);
valor=int(vac);
resultado = self.devolver_resultado(valor)
print “%d/%d es %d” % (valor, self.divisor, resultado)
Hay otras maneras creo, pero fue la primera que se me ocurrio cuando lei la prueba.
2.-El otro error como mencionas es de sintaxis, dentro del mismo metodo __init__ , en la linea donde imprime, se imprime la variable equivocada ya que se imprime resulatdo, en lugar de resultado:
print “%d/%d es %d” % (valor, self.divisor, resulatdo–VARIABLE ERRONEA)
Y esos fueron los dos errores
Creo que yo lo hice de una manera mas simple
valor = int (raw_input (“Elige un número entero entre 0 y 100: “))
ante puse el int al raw_input para que convirtiera de cadena de texto a int, así sin modificar mucho el código
He creado este código sobre el pago a un trabajador ingresando un numero determinado de horas
a partir de lo que aprendí en Python con Eugenia.
acá lo comparto :
# -*- coding: utf-8 -*-
class Pago:
def __init__(self):
#El pago por hora trabajada
self.Pago = 120
#Un input para que el usuario ingrese las horas trabajadas
self.Horas = int (raw_input (“Ingrese las horas trabajadas “));
#La operacion a realizar el pago por hora por el numero de horas trabajadas
self.resultado = self.Pago*self.Horas
#Se genera un txt para el resultado
txt = self.resultado
#Se imprime el resultado llamando al txt
print txt
obj = Pago()
Genial! Congrats!!!!!!!!!!!!!!!!! 😀
Guardaste el archivo o lo borraste? No lo borres!! agregale un espacio a cada lado del = de la variable valor:
valor = int(vac)
Good work! 😉
Great!! Otra buena alternativa!!! 😀
Guarda el archivo, no lo borres!! Algo me dice que “tal vez” lo volvamos a usar.
Good work! 😉
Excelente Abdiel!
¿te animás a colocar el proceso de cálculo de pago por horas trabajadas en un método aparte y después llamarlo desde el __init__?
Ok tratare pero no prometo nada seguro.
Igual lo posteo?.
[EDITADO por Eugenia: excelente trabajo Abdiel!]
Posteo aquí el código de Abdiel que me lo dejó en Google+ porque no pudo colocarlo aquí.
# -*- coding: utf-8 -*-
class Pago:
#El pago por hora trabajada
Pago = 120
def set_datos(self):
#Un input para que el usuario ingre las horas trabajadas
self.Horas = int(raw_input("Ingrese las horas trabajadas "))
def operacion(self):
#La operacion a realizar el pago por hora por el numero de horas trabajadas
self.resultado = self.Pago*self.Horas
def visualizacion(self):
#Se genera un txt para el resultado
txt = self.resultado
#Se imprime el resultado llamando al txt
print txt
def __init__(self):
self.set_datos()
self.operacion()
self.visualizacion()
obj = Pago()
Obvio! Claro que si! postealo!!
Una pequeña explicación de como resolvi los errores, aunque apenas estoy empezando en el mundo de la programacion solo eh leido algunas cosas por la web y aprende python en 20 minutos de mejorando.la con ajamaica.
# -*-coding: cp1252 -*-
#Aquí cambie la codificación para Windows ya que no me permitía ver las tildes.
class Modelo:
def __init__(self):
self.divisor = 23
valor = input(“Elige un número entero entre 0 y 100: “)
#El punto y coma al final de la variable valor no afectaba en nada al correr el script pero igual lo elimine para verlo mas elegante.
#Ya que la variable valor seria para pasar números enteros cambie raw_input que es para cadenas de texto por input que es para números enteros
resultado = self.devolver_resultado(valor)
print “%d/%d es %d” % (valor, self.divisor, resultado)
#Acá solo teníamos un error de variable en su escritura por lo tanto no estaba declarada.
def devolver_resultado(self, numero):
“””Divide el núemro por el divisor y devuelve un entero”””
resultado = numero//self.divisor
return resultado
obj = Modelo()
Excelente!!!!!! Me encantó!!! 😀
No borres el archivo!!! (aunque en lo que íbamos a utilizarlo, ya lo hiciste 😉 ) Guardalo igual!
Y Muy buen dato lo del encoding para Windows!!
Algo que me olvidé de mencionar: input() no es en sí para enteros, sino que es para “expresiones”. Un número es una expresión, pero también lo es por ejemplo, el nombre de una variable.
Por lo tanto si yo tengo este código:
frase_privada = "me gustan los osos verdes"
ingresar_numero = input("Ingrese un número: ")
print ingresar_numero
Al ejecutarlo, si el usuario ingresa como valor frase_privada, Python la interpreta como una “expresión” y la salida del código, será “me gustan los osos verdes”. El nombre de un método, también es una expresión! Así que tranquilamente, el usuario podría ingresar el nombre de un método, y se imprimiría el resultado. Esto venía en el próximo capítulo, pero lo aclaro por las dudas que a alguien se le ocurra utilizar el código en un caso real!! 😀
Igualmente, Good work! para ti tambien
Chevere ahora si me quedo bien claro para que sirve el input(), aunque tengo una nueva pregunta estaba desarrollando un calculador de sueldos, con todo lo aprendido hasta el momento de la guía, siempre que ejecuto el código me salen varias partes que dicen None? a que se debe esos envíos de None? aquí esta el código http://pastebin.lugmen.org.ar/6875
Creo que tu error esta aquí:
# Metodo constructor para imprimir todas las funciones
def __init__ (self):
self.lineas = ‘#’ * 60
print self.lineas
print ‘\tCALCULAR EL SUELDO SEMANAL DEL TRABAJADOR!!’
print self.lineas
print self.empresa()
print self.trabajador()
print self.calcular()
print self.calculos()
la linea que se debe imprimir es print self.lineas y las demás solo con :
self.empresa()
self.trabajador()
self.calcular()
solo para definirlas .
etc etc. creo que es eso haber que dice Eugenia.
Ay! Corazón! ¿Quieres matarme?!?!? 😀
Aquí la corrección: http://pastebin.lugmen.org.ar/6879
Efectivamente como comentó Abdiel (hola!) el error está en los print. Cuando llamas a un método, éste solo debe ejecutarse. Si le colocas la directiva print por delante y el método no devuelve ningún valor, no habrá nada que imprimir.
Y por favor utiliza variable = dato ¡elimina esos espacios!!!! Por favor!! :O
PS: Agrego algo con respecto al input().
No es una buena práctica utilizarlo (a no ser que solo tu vayas a usar el programa). Lo mejor es:
variable = raw_input(promt)
variable = float(variable)
o sino:
variable = float(raw_input(promt))
Puedes utilizar float() o int() según aplique. 😉
Por lo demás, excelente programita!!!!
Exacto!
Gracias a Abdiel y Eugenia en efectivo ese era el problema, seria como estaba mas dormir que despierto no me pude dar cuenta mas antes :).
Con respeto a los espacios para la variables lo coloque así para poder el código mucho mas fácil (jejeje) ya como es para asignar un valor no debería influir en su funcionamiento.
Con respecto al input solo lo agregue para poder utilizar el script desde consola y no se cierre al finalizar los cálculos, así queda a la espera que ingrese una tecla y se cierre.
Con respecto al calculador de sueldos les hice unas mejora con definir la varia lineas al principio, estuve leyendo en el docs de python de como agregar comas(,) ah numeros de 3 en 3 y eliminación del los print que generaban el error de None ya con esto dejaríamos la versión 0.1 del calculador de sueldo en espera de mas clases para ir agregando mejoras y validaciones de seguridad con las condicionales. Código del script http://pastebin.lugmen.org.ar/6882
Wow.. genial este lenguaje.. aunque me costó encontrar los errores lo hice.. hasta probe modificandolo un poco:
# -*- coding: utf-8 -*-
class Modelo:
def __init__(self):
self.divisor = 23
valor = raw_input(“Elige un número entero entre 0 y 100: “);
self.valor = float(valor)
self.resultado = self.devolver_resultado(self.valor,)
print “%d/%d es %0.2f” % (self.valor, self.divisor, self.resultado)
def devolver_resultado(self, numero):
“””Divide el núemro por el divisor y devuelve un entero”””
resultado = numero/self.divisor
return resultado
obj = Modelo()
Seguiremos adelante.. buen material.. Me gusto el Reto…
Perdón que los moleste estaba revisando el otro codigo que colocó abdiel pero no corre, me da el siguiente error:
File “C:\python\calculo.py”, line 10
class CalcularSueldo:
^
IndentationError: unexpected indent
No se por qué?… me ayudan????
Hola drick es un error de identacion o sangrado date una vuelta por aquí http://es.wikibooks.org/wiki/Inmersi%C3%B3n_en_Python/Su_primer_programa_en_Python/Sangrado_(indentado)_de_c%C3%B3digo
drick, hola!!!
Efectivamente es un problema de identación.
Fíjate que class CalcularSueldo debe estar SIN IDENTAR. Luego, lo que sigue, debe estar identado con 4 espacios.
Tras la definición de un método, también debes identar su algoritmo con 4 espacios.
Te doy un ejemplo, donde en lugar de espacios utilizaré asteriscos para que se note mejor:
class Clase:
****def mi_metodo(self):
********self.variable = ‘Valor’
# aquí una línea vacía
****def otro_metodo(self):
********self.mi_metodo()
# aquí otra línea vacía
objeto = Clase() # <– va sin identar
Ay! Jesús! Si sigues dejando esos espacios en blanco consumidores de bytes innecesarios para la definición de variables, vendrá Guido Van Rossum (el creador de Python) con un grupo de fundamentalistas de las PEP 8 y harán que nunca vuelvas a olvidar que no están bien vistos esos espacios en Python!. Te regalo un caramelo de frutilla si los eliminas!! ¿uno de menta? Bueno, un bombón de chocolate! Pero ya! elimina esos espacios antes que muera de un infarto!! :'(
Esta bien eliminare los espacio en blanco para la otra versión (así no se muere de un infarto) cuando empiece a trabajar con condicionales y excepciones para validar cada función.
Hola Eugenia tengo una duda, dices que este divline = “=”*80 repite el numero de veces el signo este caso 80 veces = lo que estuve buscando y aun no doy con la respuesta, cual puede ser su uso o su función en si cual es su función dentro del código?
De antemano gracias por tu respuesta.
Saludos.
Hola Abdiel!
La variable divline está allí para “armar líneas divisorias que se imprimen en pantalla”.
Las utiliza el método __init__ en
print self.divline
y es la que imprime en pantalla las líneas que se ven así:==================================================
(solo que en vez de 50 signos “=”, muestra 80 signos “=”.
También las utiliza el método
armar_presupuesto
. Por ejemplo entxt = '\n'+self.divline+'\n'
.Prueba a modificar la variable divline.
Por ejemplo, puedes cambiar el signo “=” por “*”. Veras que cuando ejecutas el módulo, en pantalla, las líneas divisorias se verán así:
**************************************************
También puedes modificar el valor 80, por 10 para notar como las líneas divisorias se ven menos extensas
Awwwwwwww! que amorote!
Haaa… ahora entiendo, no le encontraba la función lógica dentro del código,
Gracias por la aclaración.
Saludos!
Gracias Abdiel y eugenia por contestar y responder mi duda, cierto era la indentación de los cuatro espacios, ya realice lo que me dijeron y funcionó… Muchas Gracias!!!!
Aunque me surgió una duda, estamos utilizando variables para armar los programas, pero podemos hacer un archivo que guarde los datos???.
Yeah, my dear! Podemos!! y ya llegaremos a esa parte 😉
Tampoco puedo “asesinarlos” con todo Python en un solo capítulo!! 😀
Cierto tienes razón Eugenia… por el momento trataré de hacer un control de notas… a ver que tal….
Hola Eugenia antes que nada mucha gracias por compartir este tutorial.
Tengo una duda con respecto a los errores, una ves que da error la consola se cierra muy rápido!! no me deja leer lo que dice, hasta ahora tomo un screen lo mas rápido que puedo para ver los errores, pero supongo que hay otra forma jaja
Perdón por el repost, pero no puedo editar, tengo otra duda Eugenia, me arme esto como para ir probando 😛
class Modelo:
def __init__(self):
importe = raw_input(‘\tImporte bruto: $’)
self.importe = float(importe)
print importe
obj = Modelo()
funciona bien, pero cuando ingreso un importe en el input, se cierra rápidamente, puedo llegar a ver que aparece lo que ingreso, pero me gustaría que no se cierre la consola, que tenga que cerrarla yo, porque se vuelve molesto no poder ver los errores, estar tomando screens (que no siempre me sale, porque en 1 segundo se cierra ).
bueno nada mas, desde ya muchas gracias! 😀
Bueno, ya encontré la solución 😛
yo abría el archivo dándole doble clic, pero ahora lo hago desde el cmd, y no se me cierra.
Disculpa las molestias, y a esperar el próximo tutorial 😀
Hola Alex también podias probrar colocar al final de tu programa:
raw_input(‘Presione una tecla para salir…’)
a mi me funciona….
Hola Eugenia!
He seguido este capítulo también, y he encontrado ambos errores. Mi solución fue la de poner así la línea 7:
valor = int(raw_input(“Elige un número entero entre 0 y 100: “));
¡Saludos!
Excelente Abdón!! Congrats!! 😀
El martes se viene otro desafío, así que te espero por aquí nuevamente
Un abrazo!
Hola Drick, como comenté en otro post, vuelvo a repetir que no es correcto colocar un raw_input() para mantener la terminal abierta en Windows.
Por supuesto que funciona para “engañar” al programa. Pero hacerlo es como buscar la forma de llevarte productos del supermercado sin pagarlos. Logras tu objetivo (obtener los productos que necesitabas), pero a costas de hacer algo mal 😉
Congrats Alex!!!! 😀
Ok.. entendido Eugenia,, nada raw_input para dejar pausas…
😉
Me apunto al curso.
He corregido los errores, nada mas que me saca de la consola después de pedir el numero entre 0 y 100
hay alguna forma de que me deje continuar el script.
Saludos
Corregido, solo era un detalle.
Sigo pendiente del curso.
Saludos
Hola Léster!
¿Cómo estás abriendo el archivo? ¿Con doble clic tal vez?
Si es así, prueba ejecutarlo desde la terminal manualmente (hago copy & paste de otro post):
debes abrir la terminal directamente desde
Inicio > Ejecutar
y allí escribircmd.exe
(o solo cmd).Una vez allí verás algo como
C:>
Ahí debes navegar hasta la carpeta donde se encuentra el archivo con el comando cd.
Por ejemplo:
C:> cd mi_carpeta
C:\mi_carpeta> cd subcarpeta
C:\mi_carpeta\subcarpeta>
Y así hasta llegar a la carpeta donde tienes el archivo presupuesto.py
(también puedes hacer cd toda\la_\ruta)
Una vez que estés dentro de la carpeta que contiene el archivo presupuesto.py debes escribir:
python presupuesto.py
Fíjate si se resuelve.
Sino, fíjate en los comentarios que algunos chicos tuvieron el mismo problema. Pregúntales directamente si te pueden ayudar para seguir los mismos pasos que ellos
Ah!!! Y yo que leo los comentarios al revés, no me di cuenta que ya lo habías reselto y acabo de responderte, jajaja
Gracias por la ayuda, y felicitarte por el curso. Esta muy bien explicado. Saludos
Eugenia = Eu #Si se puede claro!
Hola a todos!! Eu, muchas gracias por los capítulos de phyton, soy un poco novato en la programación, en este caso encontré los errores, pero con respecto al error del raw_input resolví colocando un int en las siguientes:
print “%d/%d es %d” % (int(valor), self.divisor, resultado)
resultado = int(numero)//self.divisor
claro eso fue antes de leer las respuestas de los amigos participantes.
Pero en el transcurso de revisar el código me surgió la curiosidad de: ¿Por que podemos llamar a valor y resultado sin ponerles antes “self.”?
He estado pensando que es porque nombrándolas sin self. son creadas como variables globales y por esta razón se pueden llamar desde la clase sin ningún problema.
Gracias por invertir tu tiempo en enseñarnos!
Hola renny!!! Muy buena alternativa de resolverlo también!
Con respecto al porqué algunas variables se llaman con y otras sin self delante, es porque unas son variables de clase (propiedades) y otras variables locales.
Es decir:
self.variable hace referencia a una propiedad de clase. Al pertener a TODA la clase, puedo llamarla desde cualquier método de la clase, mientras que variable hace referencia a una variable local, creada solo y exclusivamente en el método donde se define, y no puede ser llamada desde otro método a no ser que sea pasada como parámetro.
Un ejemplo más concreto:
class Clase:
variable = 25
def metodo(self):
variable = 50
print self.variable # Imprime 25
print variable # imprime 50
def otro_metodo(self):
print self.variable # imprime 50
print variable # Da error. variable GLOBAL no está definida
Esto se debe, a que variable fue definida localmente en metodo(). Para ser propiedad de clase, debe declararse dentro de la clase o dentro de un método con self.
Y para ser global, debe declararse FUERA de la clase (corresponde declararla antes de definir la clase), por ejemplo:
variable = 70 # define la variable GLOBAL "variable"
class Clase:
variable = 25 # define la propiedad de clase "variable"
def metodo(self):
variable = 50 # define la variable "variable" local
print self.variable # Imprime 25 (toma la propiedad "variable" de clase)
print variable # imprime 50 (toma la variable "variable" local)
def otro_metodo(self):
print self.variable # imprime 50 (toma la propiedad "variable" de clase)
print variable # Imprime 70 (toma la variable "variable" global)
¿Está más clarinete ahora? 😀
Clarisimo Eu! Gracias, pero creo que hay un error en el ejemplo 1, pues si entendí bien lo que me explicaste en la linea 8, esa sentencia debería imprimir 25 y no 50!
class Clase:
variable = 25
def metodo(self):
variable = 50
print self.variable # Imprime 25
print variable # imprime 50
def otro_metodo(self):
print self.variable # imprime 50
print variable # Da error. variable GLOBAL no está definida
se que es un poco tonta la corrección, pero es para ver si entendí bien!
Me voy al otro capitulo!!!!
Si, es cierto, imprimiría 25. Son los riesgos de explicar con copy & paste 😀
Estaba buscando cursos de python y voila!!! gracias os sigo
Excelente Raul! Bienvenido!!!
No se como solucionarlo. Ayuda.
# -*- coding: utf-8 -*-
class Modelo:
def __init__(self):
self.divisor = 23
vac = raw_input(“Elige un n�mero entero entre 0 y 100: “);
valor = int(vac);
resultado = self.devolver_resultado(valor)
print “%d/%d es %d” % (valor, self.divisor, resultado)
def devolver_resultado(self, numero):
“””Divide el núemro por el divisor y devuelve un entero”””
resultado = numero//self.divisor
return resultado
obj = Modelo()
Hola Daniel!
¿Por qué dices que no sabes como resolverlo? El código que colocaste en tu comentario está perfecto!! Lo resolviste bien!!!!!
[…] Empieza a aprender! […]
¡Excelente curso!, recién lo he encontrado y me he quedado encantado con la sencillez de Python, agradezco el esfuerzo que realizas con este material. Ya veo porque algunos autores predican que es hora de cambiar Pascal por Python en las universidades.
En principio resolví el desafío tal cual como en el ejemplo de presupuesto
valor = raw_input(“Elige un número entero entre 0 y 100: “)
self.valor = int(valor)
resultado = self.devolver_resultado(self.valor)
print “%d/%d es %d” % (self.valor, self.divisor, resultado)
Pero tras leer la explicación del uso del “self”, creo que lo más óptimo entonces sería la conversión directamente en la lectura, tal como lo hizo Abdiel.
valor = input(raw_input(“Elige un número entero entre 0 y 100: “))
He leído en los comentarios 5 posibles soluciones, pero Eugenia, ¿cuál sería la más óptima? y lo pregunto ya que hiciste mucho énfasis por el uso de la memoria en los espacios que dejó nuestro compañero ajesusd en la declaración de variables.
A mi entender sería lo más óptimo la solución planteada por Abdiel, ya que no hay declaración extra de variables, el self no es necesario y la función int() no se repite. Pero sería interesante leer tu punto de vista.
Saludos Cordiales y agradecido de antemano.
Hola José! Gracias por tu comentario!
Y muy buena pregunta! 😉
Hay varias consideraciones que uno tiene que tener en cuenta y evaluar, a la hora de elegir cual opción es la más acertada.
1) Lo primero que debe tenerse en cuenta es la legibilidad del código
valor = raw_input(“Elige un número entero entre 0 y 100: “)
valor = int(valor)
Es más fácil de leer a simple vista (es decir, de un vistazo rápido), que:
valor = int(raw_input(“Elige un número entero entre 0 y 100: “))
LEGIBILIDAD: primera opción
2) Conocer si oficialmente, el lenguaje recomienda algo en particular sobre lo que se necesita decidir, es decir, buscar la opinión/especificación oficial
En este caso, si bien el ejemplo es muy sencillo, vale como para practicar 😀
Python, tiene algo llamado “El Zen de Python“. El Zen de Python es, en tono cómico, una lista de sugerencias para programar en Python. Citando alguna de ellas (que se pueden tener en cuenta como sugerencias oficiales al respecto de esto), te encuentras con:
Simple es mejor que complejo.
Plano es mejor que anidado.
Disperso es mejor que denso.
La legibilidad cuenta.
RECOMENDACIONES OFICIALES: primera opción suena más acertada que segunda opción
3) El rendimiento
En cuanto a rendimiento, no se está haciendo un uso de memoria excesivo en ninguno de los dos casos. Pues en cuanto a rendimiento, podrías optar por cualquiera de las dos alternativas.
RENDIMIENTO: primera o segunda, da igual.
4) La coherencia con el paradigma mediante el cual se está trabajando
En principio, con respecto al self.valor, allí el self no solo es innecesario sino que no guarda coherencia con el paradigma de la programación orientada a objetos. Suena terriblemente trágico, pero ¡No lo es! Es una observación técnica y para nada grave
Fijate que la variable valor es de uso local en el método __init__.
Esta variable, se pasa como parámetro al método devolver_resultado()
self, hace referencia a elementos propios de un objeto.
Son elementos propios del objeto, sus propiedades y métodos. Pero valor, no es una propiedad del objeto, sino que es una variable local del método __init__ necesaria temporalmente para ser pasada como parámetro al método devolver_resultado.
COHERENCIA: a decir verdad, primera y segunda opción dan igual también, solo que en este caso, habría que eliminar el self de self.valor
A nivel decisión, si uno hace una sumatoria de puntajes basado en las 4 consideraciones previas, la primea opción cumple con las 4, mientras que la segunda cumple con 2.
Personalmente, utilizaría:
valor = raw_input(“Elige un número entero entre 0 y 100: “)
valor = int(valor)
PEEEROOOO, eso no significa que:
valor = int(raw_input(“Elige un número entero entre 0 y 100: “))
sea incorrecto o poco recomendado. Al contrario, es una buena alternativa.
Lo único que hay que cuidar, es que no se convierta en “maña” o “vicio” el hecho de efectuar más de una acción en una misma línea 😉
Y siendo las 2 de la madrugada, morí de sueño 😛
¡Un abrazo!!
Eugenia, muchas gracias por e tiempo dedicado y la gran respuesta que has dado, aclaras mi duda. Sigo con el resto del material a ver si me pongo al día.
Saludos Cordiales,
Después de mucho tiempo he tenido algo de tiempo para seguir con tu guía, te felicito una vez mas Eugenia.
Una pregunta, para poder usar los atributos no es necesario definirlos antes?
Lo comento porque en el constructor pones “self.divisor = 23” pero no esta definido en la clase.
Saludos!
Hola Beto! Gracias por tu comentario!!
Con respecto a tu pregunta, te cuento que en Python no es necesario inicializar ningún tipo de variable. Toda variable se puede definir cuando se le asigna su valor.
De todas formas, a veces es más prolijo, cuando se programa orientado a objetos, definir de antemano las propiedades del objeto en la clase:
class MiClase:
propiedad_1 = ""
propiedad_2 = ""
propiedad_3 = ""
# ...
¿Por qué es más prolijo? Únicamente por una cuestión de legibilidad para el programador, que al mirar el código fuente ya de antemano y a simple vista puede conocer todos los métodos y propiedades (atributos) de un objeto.
Pero esto, también puede evitarse, documentando apropiadamente las clases (eso lo veremos en detalle en el capítulo 5).
Pero en definitiva la respuesta es que no es necesario
Saludos!!
Motivador el reto, sigamos adelante. se encontraron los 3 errores.
Hola buen día, primero que nada muchas gracias por compartir este excelente curso de python. Me encanta!! solo tengo una pregunta. Este curso se sentrara solo en el lenguaje python o en un futuro, existe la posilibidad de que se extienda a algun framework para la web, me interesa mucho en especial Django.
Saludos y que tengas una excelente semana, ya espero el capitulo de este martes.
Hola Rober!!
Gracias por tu comentario!!
Te cuento que por el momento, la guía solo se avocará al lenguaje en sí.
Tal vez en el futuro, Maestros del Web publique alguna guía de Django, pero no sabría decirte.
De todas formas, ten en cuenta que los frameworks como Django están hechos en el mismo lenguaje para el cual se utilizan. Conociendo a fondo el lenguaje, ya estás en condiciones de poder utilizar cualquier framework 😉
Un abrazo!!
Disculpa, ok el problema es que yo así como lo resolví a la hora de ejecutarlo no me sirve.
Me tira el siguiente error.
File “C:/pyton/maro.py, line 8
valor = int <raw_input >
Subi el codigo a pastebin asi te podemos ayudar mas subi tanto el codigo como el error asi te podriamos ayudar mas todavia 😀
me gusta esta pagina y se mira bien, y me gustaria aprender.
Hola, gracias ante todo por el trabajo que te tomas en hcer esta guia.
Tengo una duda…
Quisiera saber por que devolver_resultado recibe 2 argumentos?, donde definimos los argumentos que va a recibir una determinada funcion?
def devolver_resultado(self, numero):
“””Divide el núemro por el divisor y devuelve un entero”””
resultado = numero//self.divisor
return resultado
Hola!! apenas hoy me estoy anotando en el curso, tenia tiempo escuchando del lenguaje pero no había tenido el incentivo aun de enfrentarlo y este curso me sirvió de iniciativa y hasta ahora me a gustado. ya logre resolver lo de los errores y tengo que reconocer que me costo un poco, mi solución fue similar a una antes expuesta valor = int(raw_input(“Elige un número entero entre 0 y 100: “)).
Sigo con los próximos capítulos y espero ponerme al día para no quedarme atras!
Excelente Carlos! y Bienvenido!
Hola Eugenia, antetodo, gracias por tu tiempo. Pude encontrar los errores, pero me surge el problema que me tira un error de indentacion, revise todo el codigo (sobretodo en las lineas cercanas a la linea 9, donde muestra el error- pero no pude resolverlo. Serias tan amable de indicarme que estoy haciendo mal ?, mil gracias de antemano, saludos, Dario.
C:\Python27>python buscoerror.py
File “buscoerror.py”, line 9
resultado = devolver_resultado(valor)
^
IndentationError: unexpected indent
Revise el codigo y los indentados, pero no encuentro la solucion, alguien me podria ayudar ?, gracias……
—————————————————-
# -*- coding: utf-8 -*-
class Modelo:
def __init__(self):
self.divisor = 23
val = raw_input(“Elige un número entero entre 0 y 100: “);
valor = int(val);
resultado = self.devolver_resultado(valor)
print “%d/%d es %d” % (valor, self.divisor, resultado);
def devolver_resultado(self, numero):
“””Divide el núemro por el divisor y devuelve un entero”””
resultado = numero / self.divisor
return resultado
obj = Modelo()
Copiado en Pastebin http://pastebin.lugmen.org.ar/7076
Hola Diego,
La explicación sobre funciones está en el capítulo I. Los argumentos se indican entre los paréntesis.
Saludos!
Hola Darío:
Líneas 23 a 27. Al no estar identadas con respecto a la clase, eso hace que el método, se convierta en una función, ajena a la clase. Aquí lo corregí: http://pastebin.lugmen.org.ar/7083
Saludos!
Hola.
despues de 4 horas (no, no exagero) he buscado por internet y todo porque me salia un problema con el “return resultado” y con “obj = Modelo()” y yo comiendome el coco para dos fallitos!! uuf que noche he pasado y al final me he rendido y eran dos tonterias ains
el caso es que cambie a enteros lo de raw_input en varias ocasiones pero me aparecia el error del return y me volvia loco porque pensaba que ahí estaba el fallo.
muchas gracias x este curso para inexpertos me encanta que no sea lo tipico de esto es asi y sale perfecto.. tiene que haber fallos para que aprendamos como ejecuta el programa
La verdad no me di cuenta, bueno sii lo hice de una forma pero no sabia como dar el valor entero (int), aca no sobia ya que es un nuevo lenguaje para mi :s, peo veo es lo mismo ke en C#, c++ y otros lenguajes.
El error de sintaxis wow como no me di cuenta :s.
Tan facil uff, tendre mas cuidado la proxima y vere con ojos de aguila jeje.
Hola, me estoy iniciando en este reto Python. En este reto de buscar los errores, el primero que encontre fue el mal tipeo de “resultado”. Ahora bien, cuando ejecuto el programa en la consola siempre me arroja que hay un error en las ultimas comillas de
“%d/%d es %d” <—. He probado con varias comillas pero sigue dando el mismo error: invalid sysntax.
Saludos
class Modelo:
def __init__(self):
self.divisor = 23
valor = int(raw_input(“Elige un número entero entre 0 y 100: “))
resultado = self.devolver_resultado(valor)
print “%d/%d es %d” % (valor, self.divisor, resultado)
def devolver_resultado(self, numero):
“””Divide el núemro por el divisor y devuelve un entero”””
resultado = numero // self.divisor
return resultado
obj = Modelo()
Gracias por compartir lo que saben, yo tambien estoy empezando con python, pero me tope con un error que aun no puedo solucionar, resulta que el codigo que tienen aqui de presupuesto no me funciono, asi que hice uno pequeñito que pida un nombre y que lo muestre, pero hasta en eso me dio error, el cual es “NameError: global name ‘raw_input’ is not defined” segun estuve buscando es por la version de python que en la 3 ya han eliminado raw_input pero no se como solucionarlo :S
raw_input cambia en la versión 3 por input
Gracias por ésta guia
Buenas, no paro de darle vueltas al código y no lo consigo. Este es mi código:
# -*- coding: utf-8 -*-
class Modelo:
def __init__(self):
self.divisor = 23
val = raw_input(“Elige un número entero entre 0 y 100: “);
valor = int(val);
resultado = self.devolver_resultado(valor)
print “%d/%d es %d” % (valor, self.divisor, resulatdo);
def devolver_resultado(self, numero):
“””Divide el núemro por el divisor y devuelve un entero”””
resultado = numero / self.divisor
return resultado
obj = Modelo()
Verdaderamente es adictivo esto .. cada vez se pone mejor!!!
¿y el int () cuando lo enseñaron?
P/D: Sin ganas de entrar en discusiones .. ¿esta en una guia para enseñarle a un niño de 11 años que ya tiene conocimientos de programación no?
ssiiiii, listo encontré los errores, grande Eugenia, te adoro y cada vez amo mas a python
hola quetal? estoy aprendiendo python y se me a presentado un problema con una clase… mejor dicho con un objeto dejo el codigo para ver si me pueden ayudar les agradesco de antemano
while 1:
class moto:
def __init__(self, g):
self.g = g
def arrancar(self):
if g > 0:
print “arranca”
else:
print “no arranca”
def avansar(self):
if g > 0:
print “te quedan”, g, “litros”
else:
print “se acabo la gasolina”
motito = moto(3)
e = raw_input()
if e == “a”:
motito.arrancar()
elif e == “c”:
motito.avansar()
else:
print “preciona la opcion correcta”
solo funciona cuando ejecuto else:
me sale algo que g no esta definida… pero no se supone que g vale 20? o me equivoco…
perdn… decia que se supone que g vale 3
ya esta… era self.g no g
Buenas noches.
Ante todo agradecerte la guía.
Estoy intentando aprender python no tengo conocimientos de programación,tampoco entiendo muy bien los conceptos, pero con esmero y perseverancia se aprender.Localice el error de escritura hasta ahí llegue.
Si fueras tan amable me podrías poner la solución correcta y explicarlo para niño de 5 años?
Muchas gracias.
Hola.
A mi de este error:
File “buscar_error.py”, line 5
def __init__ (self):
^
El editor que utilizo es Geany en Debian Wheezy con Python 2.7.2+ (default, Dec 1 2011, 01:55:02)
[GCC 4.6.2] on linux2
¿Porqué me da este error de sangría?. Por lo demás está todo bien.
Gracias…
no puedo areclar este problema he hecho todo lo pocible a mi alcance y todo lo que lo demas iciero y ciempre me da errol una ajuda porfa
Al fin lo pude resolver. Gracias porque antes de este cursito ni siquiera entendía muy bien las clases, al fin ahora las comprendo… Gracias, aquí esta el código, funciona muy bien en python 3.2, no lo he probado en 2.7…
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Modelo:
def __init__(self):
self.divisor=23
valor=int(input(“Elije un numero entre 1 y 100: “))
resultado=self.devolver_resultado(valor)
print (“%d/%d es %d” % (valor, self.divisor, resultado))
def devolver_resultado(self, numero):
resultado=numero//self.divisor
return resultado
pbj=Modelo()