Trabajando con templates, archivos y condicionales
En el capítulo anterior, estuvimos modificando nuestro programa: creamos una lista de precios y agregamos plantillas HTML y TXT para imprimir los presupuestos.
Vimos como utilizar tuplas, listas y diccionarios e incorporamos una nueva estructura de control mediante el bucle for en el proceso de creación y utilización de listas de precios para nuestro programa.
En el capítulo de hoy, veremos cómo logramos utilizar plantillas para generar nuestros presupuestos y el proceso para guardarlos.
Comenzaremos con algo sencillo y sumamente práctico: lectura y escritura de archivos.
Lectura y escritura de archivos
Al trabajar con archivos, existen cuatro acciones básicas que podemos hacer con un archivo:
- Abrir un archivo
- Leer un archivo
- Escribir/sobrescribir un archivo
- Cerrar un archivo abierto
Cuando abrimos un archivo podemos hacerlo con diversos fines:
- Abrirlo para leerlo
- Abrirlo para escribirlo
- Abrirlo para leerlo y escribirlo, etc
Para abrir un archivo se realiza mediante la clase open()
de Python, cuyo método constructor recibirá como primer parámetro, la ruta del archivo a ser abierto y como segundo parámetro, el modo de apertura (es decir, el objetivo para el cual lo abrimos: escritura, solo lectura, lectura y escritura, etc.).
En la línea 103 abrimos un archivo para leerlo:
filename = open(archivo, 'r')
Donde archivo es la ruta del archivo pasada como parámetro en el método leer_plantilla() y la cadena ‘r’ representa el modo de apertura “solo lectura”.
Mientras tanto, en la línea 74, abrimos un archivo no solo para leerlo, sino también para escribirlo:
contador = open('contador.txt', 'r+')
En este caso, ‘r+’ significa “lectura y escritura”.
Sin embargo, en la línea 92, estamos abriendo un archivo, pero para crearlo. Utilizando en este caso el modo ‘w’, que creará el archivo si no existe (o lo reemplazará si existe, creando uno nuevo con el mismo nombre), preparándolo para ser escrito:
presupuesto = open(filename, 'w')
Tanto con la variable filename como con la variable contador y presupuesto, lo que estamos haciendo es crear un objeto archivo, para luego utilizar los métodos necesarios:
objeto.read()
para leer el contenido de un archivo;
objeto.write('nuevo contenido')
para escribir en el archivo;
objeto.seek(numero_de_byte)
para mover el cursor hacia el byte indicado en el archivo;
y objeto.close()
para cerrar el archivo.
Cuando leemos el contenido de un archivo con el método read(), éste, retorna una “cadena de texto”. Si el contenido del archivo que estamos leyendo, es un número (como en nuestro contador.txt), obtendremos el literal de ese número y para poder utilizarlo como “número” (por ejemplo, para hacer operaciones matemáticas), será necesario convertirlo a entero o flotante, como en la línea 75, donde mediante int() convertimos el literal leído a número entero:
ultimo_num = int(contador.read())
Aprendiendo a utilizar templates en Python
Importación de módulos
- presupuesto.py es nuestro módulo.
- Cualquier otro archivo con extensión .py, también es un módulo.
- Python, tiene sus propios módulos.
- Cualquier módulo Python (propio o provisto por Python) puede ser importado.
Importar módulos
Importar un módulo significa incluir un archivo .py dentro de otro, para utilizar sus métodos.
Para importar todo un módulo, se escribe:
import modulo
Para importar solo una clase de un módulo, se escribe:
from modulo import Clase
Para importar varias clases de un módulo, se separan los nombres de las clases con comas:
form modulo import ClaseUno, ClaseDos, ClaseVeinte
En nuestro ejemplo:
form string import Template
estamos importando la clase Template del módulo string de Python.
Esta clase, es la que nos va a permitir utilizar una plantilla para nuestro presupuesto y luego hacer un render (reemplazo dinámico) de datos.
La clase Template del módulo string de Python
Mira la líneaa 131 y 132 del módulo presupuesto.py:
txt = Template(txt).safe_substitute(diccionario) html = Template(html).safe_substitute(diccionario)
Template()
es una clase del módulostring
de Python.
- El constructor de esta clase (es decir, el método
__init__
) recibe como parámetro una plantilla:Template(txt)
yTemplate(html)
- Esta plantilla, debe tener ciertos “comodines” que indicarán los datos que deben ser reemplazados.
- Estos “comodines” se denominan identificadores.
- Los identificadores, se escriben con un signo $ delante:
$nombre_del_identificador
. Estos identificadores los hemos colocado en nuestro archivotemplate.txt
y también entemplate.html
- Para escribir un signo $ sin hacer referencia a un identificador, debe escaparse con otro signo $. Esto: $$ imprime $, mientras que $nombre_identificador será reemplazado por un identificador cuyo nombre sea
nombre_identificador
Los métodos substitute() y safe_substitute() de la clase Template
- Como nuestra clase Presupuesto, Template, tiene sus propios métodos:
substitute()
ysafe_substitute()
- Ambos métodos, reciben como parámetros, un diccionario de datos.
- Este diccionario se compone de
clave=valor
donde clave, será el nombre de un identificador y valor, el dato por el cuál será reemplazada la clave.
Un ejemplo simple
from string import Template print Template('Reemplazar $identificador').substitute(identificador='valor de reemplazo')
La salida de lo anterior, será:
Reemplazar valor de reemplazo
Métodos de la clase template
La diferencia entre el método substitute() y safe_substitute(), es que si nos olvidamos de colocar el valor para un identificador, el primer método generará un error, mientras que el segundo, simplemente lo dejará sin reemplazar.
Es decir que si escribimos
Template('Este es el $id1 y este $id2).safe_substitute(id1='Identificador Uno')
La salida será:
Este es el Identificador Uno y este $id2
Mientras que substitute provocaría un error.
dict(): creación de diccionario de datos
Ve a al línea 116 del módulo presupuesto:
diccionario = dict(nombre=self.encabezado_nombre, web=self.encabezado_web, email=self.encabezado_email, titulo=self.titulo, numero=self.numero_presupuesto, fecha=self.fecha, empresa=self.empresa, cliente=self.cliente, plan=self.plan, servicio=self.servicio, precio=self.importe, iva=self.monto_iva, total=self.neto, limite=self.vencimiento)
Aquí lo que hicimos, fue armar un diccionario de datos con la clase dict() de Python.
Podríamos haber colocado estos pares de clave=valor dentro del método safe_substitute()
directamente. Pero para hacerlo más legible y prolijo, creamos este diccionario de datos, que luego lo pasamos como parámetro a safe_substitute():
txt = Template(txt).safe_substitute(diccionario) html = Template(html).safe_substitute(diccionario)
Chuleta para utilizar Templates
Para utilizar una plantilla, debemos:
- Crear la plantilla en un archivo, colocando identificadores antecedidos por el signo $ en los lugares donde necesitemos reemplazar los datos dinámicamente.
- Importar la clase Template del módulo string de Python:
from string import Template
- Guardar el contenido de la plantilla en una variable:
# Crear un objeto archivo: Abrir el archivo en modo de solo lectura archivo = open('archivo', 'r') # Leer el archivo contenido = archivo.read() # No olvidarse de cerrar el archivo archivo.close()
- Crear un diccionario de datos con dict():
diccionario = dict(id='un valor', otro_id='Otro valor')
- Hacer un render de datos con la clase Template y el método
substitute()
osafe_substitute()
(este último, es mejor para prevenir errores):
Template(plantilla).safe_substitute(diccionario)
Dónde plantilla debe ser el contenido del archivo leído previamente y diccionario el creado mediante la clase dict()
Chuleta de operaciones básicas con archivos
Estructuras de control en Pytho: if… elif… y else
¿Guardamos el presupuesto, lo imprimimos en pantalla, o…? En el capítulo anterior estuvimos hablando sobre estructuras de control con el bucle for
. Hoy, incorporamos una nueva estructura de control: el condicional if:
if respuesta.lower() == 'n': print txt # si en cambio el usuario indica "n" elif respuesta.lower() == 's': filename = 'presupuestos/'+self.numero_presupuesto+'.html' presupuesto = open(filename, 'w') # Creo el archivo presupuesto.write(html) # escribo el contenido presupuesto.close() # cierro el archivo print '\n\tEl archivo se ha guardado en '+filename+'\n\n' # sino else: print '\n\tOpción incorrecta. No se guardó el presupuesto.\n\n' self.guardar_presupuesto(txt, html)
(ver líneas 87 a 99)
El condicional if, elif y else, es uno de los que más utilizarás en tu vida como programador. Básicamente, al igual que otras estructuras de control, permite tomar decisiones si una determinada condición se cumple. El razonamiento de condicionales puede representarse como sigue:
si condicion X se cumple: hacer esto sino, si condicion Y se cumple: hacer esto otro sino (si no se cumple ni X ni Y): hacer tal otra cosa
No necesariamente el condicional debe cumplir esa estructura. A veces solo es necesario evaluar una única condición y tomar una decisión SOLO sobre la base de si esta condición se cumple:
si condición X se cumple: hacer esto # fin
Ejemplo:
a = 10 if a == 10: print 'a es igual a 10'
O también, tomar una decisión si la condición se cumple y otra si no se cumple:
a = 10 if a == 10: print 'a es igual a 10' else: print 'a no es igual a 10'
Con elif se pueden tomar tantas decisiones como condiciones quieran evaluarse::
a = 10 if a == 10: print 'a es igual a 10' elif a == 9: print 'a es igual a 9' elif a == 75: print 'a no es ni 9 ni 10, es 75'
Y si a lo anterior le agregamos else estaríamos cubriendo todas las posibilidades:
a = 10 if a == 10: print 'a es igual a 10' elif a == 9: print 'a es igual a 9' elif a == 75: print 'a no es ni 9 ni 10, es 75' else: print 'a no es ni 9, ni 10 ni 75. Es un valor que no evalué'
Retomemos nuestro código. En el método guardar_presupuesto()
(línea 84), lo primero que hago es preguntar si se desea guardar o no el presupuesto, siendo las respuestas esperadas “s” (sí, lo deseo guardar) o “n” (no, no deseo guardarlo):
respuesta = raw_input('\n\t¿Desea guardar el presupuesto? (s/n): ')
Solo espero una de esas dos respuestas. Es necesario evaluar la respuesta ingresada.
if respuesta.lower() == 'n':
El método lower() me convierte el valor ingresado por el usuario a minúsculas, para que me sea más sencillo evaluar la condición. Básicamente la condición que estoy evaluando es: “si la respuesta fue no”.
Al evaluar una condición, la estructura de control responderá con True (verdadero) o False (falso). Si la respuesta ingresada fue “n”, entonces la condición cumple.
Sino, si la respuesta fue “s” elif respuesta.lower() == 's':
se está cumpliendo esta condición (se eligió si).
Pero también puede suceder, que ni “s” ni “n” sean ingresados. Ésto, lo evalúo genericamente con else:
Razonando la estructura completa:
Si la respuesta es “n”, imprimo el presupuesto en pantalla
if respuesta.lower() == 'n': print txt
En cambio, si la respuesta es “s”, creo un nuevo archivo y lo guardo.
elif respuesta.lower() == 's': filename = 'presupuestos/'+self.numero_presupuesto+'.html' presupuesto = open(filename, 'w') presupuesto.write(html) presupuesto.close() print '\n\tEl archivo se ha guardado en '+filename+'\n\n'
Pero si la respuesta no es ni “n” ni “s”, vuelvo a ejecutar este mismo método desde el comienzo, es decir que el método guardar_presupuesto() se llama a sí mismo:
print '\n\tOpción incorrecta. No se guardó el presupuesto.\n\n' self.guardar_presupuesto(txt, html)
Recursividad
Cuando un método se llama a sí mismo, se denomina recursividad. Ésto, genera una iteración (un bucle) del método en sí mismo. Por lo tanto, se debe ser muy cuidadoso al emplear una llamada recursiva y hacerlo solo cuando sea estrictamente necesario y no se corra el riesgo de caer en un bucle infinito.
Operadores lógicos y relacionales
Para evaluar condiciones no solo podemos recurrir a si “X es igual a Y”. Existen otros operadores que nos permitirán evaluar diferentes condiciones. Estos operadores se denominan operadores lógicos que nos permitirán evaluar múltiples condiciones en un mismo proceso y operadores relacionales, que nos permitirán evaluar la relación existente en una condición dada.
Operadores Relacionales
== Igual que != Distinto que < Menor que > Mayor que >= Mayor o igual que <= Menor o igual que
Usos:
if a == b # si a es igual que b
if a != b # si a es distinto que b
if a > b # si a es mayor que b
if a >= b # si a es mayor o igual que b
if a < b # si a es menor que b
if a <= b # si a es menor o igual que b
Operadores Lógicos
and (y) or (o) not (no)
Los operadores lógicos permitirán evaluar múltiples condiciones en una misma instancia:
si condicion_1 and condicion_2 or condicion_3
and evalúa si todas las condiciones se cumplen, es decir, que todas las condiciones deben retornar True (verdadero)
a = 10 b = 5 if (a == 10) and (b != 10): print 'Hola Mundo'
Se lee: Si (a es igual que 10) y (b es distinto que 10)
Como ambas condiciones se cumplen se imprimirá Hola Mundo.
Pero en el siguiente código:
a = 10 b = 5 if (a != 10) and (b == 5): print 'Hola Mundo'
La primera condición NO se cumple, entonces no se imprimirá nada.
or evalúa si alguna de las condiciones se cumple. Con que una sola condición se cumpla, se ejecutará la acción.
a = 10 b = 5 if (a != 10) or (b == 5): print 'Hola Mundo'
Se lee: si (a es distinto que 10) o (b es igual a 5).
La primera condición, no se cumple. Pero la segunda sí se cumple. Entonces, imprimirá Hola Mundo.
not evalúa si la condición NO se cumple:
a = 10 b = 5 if not a == 10: print 'Hola Mundo'
Se lee: si NO ES a igual que 10 (similar a escribir if a != 10)
Como la condición NO se cumple, no se imprimirá nada.
Métodos del objeto String
Vimos anteriormente que para evaluar la respuesta dada al preguntar si se desea guardar o no el presupuesto en un archivo, utilizamos el método lower(). Este método pertenece a la clase string de Python, y su función es la de convertir una cadena de texto en minúsculas.
La clase string de Python, además del método lower() tiene muchos otros métodos que frecuentemente podrás utilizar. Para hacerlo, simplemente debes utilizar la sintaxis: tu_cadena.metodo()
Otros métodos de uso frecuente del objeto string son:
capitalize()
Convierte el primer carácter de una cadena en mayúscula
upper()
Convierte toda la cadena a mayúsculas
lower()
Convierte toda la cadena a minúsculas
swapcase()
Convierte minúsculas a mayúsculas y mayúsculas a minúsculas
Más métodos del objeto string, puedes verlos en este enlace.
Nuevo reto: condicionales hasta en la sopa!
Dado el siguiente código:
# edades Ana = 43 Juan = 43 Pedro = 8 Roberto = 12 Melisa = 15 Helena = 3 if (Ana == Juan) and ((Helena < Melisa) or (Melisa < Roberto)) and not (Pedro > Roberto): print 'Veo condicionales hasta en la sopa!' else: print 'Soñaré con condicionales'
El resultado, imprimirá la frase “Veo condicionales hasta en la sopa!”.
El desafío
Modificando únicamente un operador lógico, debes lograr que se imprima la frase “Soñaré con condicionales”. No se puede quitar ningún operador. Solo puede cambiarse un operador lógico por otro.
Saludos! gracias por compartir! la verdad genial curso 😀
amo los Martes (L) jajaja.
con respecto al desafio.. desconozco si se podra poner por aca, pero como en el anterior si se pudo lo pongo:
Resultado:
if (Ana != Juan) and ((Helena < Melisa) or (Melisa Roberto):
cambiando ‘Ana == Juan’ por ‘Ana != Juan’ ya no se cumple el primer if, ya que para cumplirse tendrian que ser verdaderas las condiciones (Ana != Juan) and ((Helena < Melisa), siendo una sola falsa, no se cumple 😛
Saludoss! y graciass de nuevooooooo 😀
[…] trabajo con archivos. Aunque este capítulo va un poco más allá, ya que estaremos trabajando con TEMPLATES, ARCHIVOS Y CONDICIONALES. Etiquetas: Desdelinux, Guia, Maestrosdelweb, Manuales, […]
Genial como siempre. Sería muy bueno poder tener los capítulos ya realizados en formato PDF para poderlos descargar. 😀
Aunque haya mucho paréntesis, sólo son 3 ands (&& para los que venimos de lenguajes menos user-friendly); con que una de las condiciones sea falsa, todo será falso…
Saludos (:
@Pablo, hay que modificar un operador LÓGICO (and, or, not), no RELACIONAL. Al menos es lo que yo entendí en el enunciado.
Saludos (:
Una vez lleguemos a los 10 capítulos, esta guía se empaquetará en un PDF de fácil descarga. Y mientras se va desarrollando, entre preguntas y respuestas te puedes convertir en uno de los co-autores de Eugenia junto a tus aportes en los comentarios 😉
Hola a todos, con el reto de hoy yo lo hice así, no sé si sea lo correcto pero me arroja el resultado que deseamos.
if (Ana == Juan) and ((Helena < Melisa) *and* (Melisa Roberto):
***print ‘Veo condicionales hasta en la sopa!’
else:
***print ‘Soñaré con condicionales’
**
pd..los astericos lo coloqué solo como referencia y el and entre ellos fue el que modifique.
Holas,
Felicitaciones por el articulo, muy buena.
El resultado de las condicionales:
‘Soñaré con condicionales’
xD
Saludos
Gildus
¡Excelente guía! Vengo desde el mundo PHP y en unos pocos minutos ya le perdí el miedo a Python. Me alegra no tener que preocuparme tanto de los ; y { } en ciertos lugares, pero vamos que en 10 minutos me familiaricé con el lenguaje 😀
Bueno esta facil solo tienen que sustituir el or de esta parte por un and y listo ((Helena < Melisa) or (Melisa < Roberto)) quedaria asi ((Helena < Melisa) and (Melisa < Roberto)) simple tiene que cumplir ambas condiciones a true lo cual es falsa la segunda Melisa no es menor a Roberto
salu2
ciertoo lo que dijistes _cronos2, lei mal jaja
Saludos! y disculpen! 😛
Hola Pablo, hola _cronos2!!!
Pablo, tal cual como comentó _cronos2 el operador a modificar, debe UN SOLO OPERADOR LÓGICO…
Great drick!!!!!!!!!!!!!!!!!!!!!!! GREEEEEEEEEEEEAT!!! (así, a los gritos lo digo!!)
Genial, por si no se entendió 😀
Excelente Felipe!!
Es cierto: con Python te despreocupas de los punto y coma y las llaves de PHP, y solo debes centrarte en las identaciones 😉
GREAT Juan! GREEEEEEEEEEEEEEATTTTT!!! Nuevamente, lo digo a los gritos!!! GREEEEEEAT!!! 😉
Hola elav! ¿cómo estás?!?! Hola vander!
Yo ya estoy recopilando comentarios para agregar como anexo al PDF de la guía, así que elav, adelante!
vander, creo que habrá unos cuantos co-autores 😉
Nuevamente muchas gracias por este excelente curso, ya haciendo mas y mas pininos =), saludos a todos
Listo 😀
Solo hay que ser mas “exigente” con una de las condiciones.
solo se cambia el or por un and en el if.
muy fome, hay que poner retos de verdad
Hola Eugenia, CVander:
Sencillamente genial. No tengo mucho que aportar, solo dudas, pero en lo que pueda ayudar mediante comentarios.. pues ahí me tendrán… Estoy siguiendo de cerca esta guía y la estoy promoviendo desde mi blog. ¡¡¡Gran trabajo!!! Como siempre…
Si esta no es la solución:
if (Ana == Juan) and ((Helena < Melisa) or not (Melisa Roberto):
Soñaré con condicionales! 😉
Hola!!!! Eugenia…..Quiero aportar un pequeño programita que hice guiándome de la cuarta entrega de Python.
Usando estructuras de control IF ELIF & ELSE…..
Se trata de una pequeña calculadora que te pide que elijas una opción ya sea suma, resta o multiplicación…Una vez elegida la opción realiza la operación……
——————————————————————————————————
# -*- coding: utf-8 -*-
class Calculadora :
def set_menu ( self ):
print “Elige una opcion”
print “SUMA\t \t1”
print “RESTA\t\t 2”
print “MULTIPLICACION\t\t 3”
print “=”*20
self.opera = int(raw_input(“OPCION: “))
def set_operaciones ( self ):
if self.opera ==1:
print “HAS ELEGIDO SUMA”
self.a=int(raw_input(“Dame un numero: ” ))
self.b=int(raw_input(“Dame otro numero: ” ))
self.c=self.a+self.b
print “La suma es”, self.c
elif self.opera == 2 :
print “HAS ELEGIDO RESTA”
self.a=int(raw_input(“Dame un numero: ” ))
self.b=int(raw_input(“Dame otro numero: ” ))
self.c=self.a-self.b
print “La resta es”, self.c
elif self.opera == 3 :
print “HAS ELEGIDO MULTIPLICACION”
self.a=int(raw_input(“Dame un numero: ” ))
self.b=int(raw_input(“Dame otro numero: ” ))
self.c=self.a*self.b
print “La multiplicacion es”, self.c
else:
print “ESA OPCION NO SE ENCUENTRA”
def __init__ ( self ):
self.set_menu()
self.set_operaciones()
calc = Calculadora()
——————————————————
GRACIAS POR TODO ESTOY APRENDIENDO BASTANTE
CORRECCION DEL CÓDIGO ANTERIOR LOS ASTERISCOS (*) ANTES DE CADA LÍNEA DE CÓDIGO SON LAS IDENTACIONES.
“SALUDOS DESDE TAPACHULA CHIAPAS”
___________________________________________________________________________
# -*- coding: utf-8 -*-
class Calculadora :
****def set_menu ( self ):
********print “Elige una opcion”
********print “SUMA\t \t1”
********print “RESTA\t\t 2”
********print “MULTIPLICACION\t\t 3”
********print “=”*20
********self.opera = int(raw_input(“OPCION: “))
****def set_operaciones ( self ):
********if self.opera ==1:
************print “HAS ELEGIDO SUMA”
************self.a=int(raw_input(“Dame un numero: ” ))
************self.b=int(raw_input(“Dame otro numero: ” ))
************self.c=self.a+self.b
************print “La suma es”, self.c
********elif self.opera == 2 :
************print “HAS ELEGIDO RESTA”
************self.a=int(raw_input(“Dame un numero: ” ))
************self.b=int(raw_input(“Dame otro numero: ” ))
************self.c=self.a-self.b
************print “La resta es”, self.c
********elif self.opera == 3 :
************print “HAS ELEGIDO MULTIPLICACION”
************self.a=int(raw_input(“Dame un numero: ” ))
************self.b=int(raw_input(“Dame otro numero: ” ))
************self.c=self.a*self.b
************print “La multiplicacion es”, self.c
********else:
************print “ESA OPCION NO SE ENCUENTRA”
****def __init__ ( self ):
********self.set_menu()
********self.set_operaciones()
calc = Calculadora()
Hola Andrés!!!
A ver, desmembremos tu propuesta:
if (Ana == Juan) and ((Helena < Melisa) or not (Melisa < Roberto)) or not (Pedro > Roberto)
Hay en principio SOLO DOS condiciones que deben cumplirse, delimitadas por el único “and” de toda la sentencia:
1) if (Ana == Juan) Que Ana sea igual que Juan, debe cumplirse sí o sí (se cumple)
2) and (y) Debe cumplirse AL MENOS una de estas:
a) (Helena < Melisa) Qué Helena sea menor que Melisa (se cumple)
b) not (Melisa < Roberto) Qué Melisa NO sea menor que Roberto (se cumple)
c) not (Pedro > Roberto) Qué Pedro NO sea mayor que Roberto (se cumple)
Se cumplen las 3, y con solo una que se cumpliera, ya seguiría siendo VERDADERO el resultado de la condición ¿Por qué? Porque con “or” estoy dando haciendo que el cumplimiento de esas condiciones sea opcional.
Hola Gume!!! Excelente!!! Congrats!!!
Te cuento algo: La guía se publicará luego en PDF y tendrá un anexo de “co-autores” para el cual, estoy recopilando los aportes “pythoneros” que van colocando en los comentarios.
Me gusta mucho tu ejemplo para agregarlo como aporte de co-autor a la guía.
Python tiene unas reglas de estilo (es decir, una forma de cómo debe escribirse el código): Las PEP (http://www.python.org/dev/peps/pep-0008/) que sirven para escribir código estándar.
Te propongo lo siguiente:
Copia el código en http://pastebin.lugmen.org.ar/ (donde dice “Cuanto tiempo debemos retener el post?” marca la opción “para siempre”).
Edítale al código los estilos como se recomienda en las PEP 8:
– en
def funcion(self):
no debe haber espacios en blanco entre el nombre de la funcion, los parentesis, y los parámetros dentro)– y luego, cuando se definen variables hay que dejar un espacio en blanco a cada lado del =
ejemplo:
mi_variable = 'valor'
Una vez lo copies en http://pastebin.lugmen.org.ar/, responde este comentario colocando el link hacia el código, así ya puedo señalarlo para adjuntarlo a la guía ¿te parece?
Hola cheche! Para retos de verdad y menos “fomes”, lee la guía Python mientras haces bungee jumping! 😀
ahhhh!! Pasó que entendí que tenía que dar “verdadero” (de hecho ya daba verdadero sin modificaciones) entonces solo agregue el “or not” para que siga dando verdadero! {¡Paff!} Definitivamente entendí mal! Soy un salame! {¡Plop!}
Ok ahora para la reivindicarme digo que quitando el “not” del “and not” da negativo:
if (Ana == Juan) and ((Helena < Melisa) or (Melisa Roberto):
print ‘Soy un salame!’.’:(‘
else:
print ‘Puedo seguir con la guía de Python tranquilo’.’;)’
Gracias Eugenia, hasta the next step!
jajajajajajajajajaja! qué personaje!!! jajajajajaja
Estáaaaaaaaa bien!!! Da el resultado esperado!!! Peeeero (sin “plafes” violentos esta vez, por favor) la idea era cambiar un operador lógico por otro, sin eliminar ninguno “No se puede quitar ningún operador. Solo puede cambiarse un operador lógico por otro.” 😉
Igual está perfecto!! 😀
Despues de tres intentos creo que lo hice bien……..Gracias por las correcciones Eugenia. Es perfecta la idea y seria de gran ayuda publicarlo en PDF….
Este es el enlace al codigo corregido Bueno eso creo jeje…
http://pastebin.lugmen.org.ar/6932
Nuuuu, que mal, ¿la idea era cambiarlos? Ok, puedo hacerlo! 😉 Lo que hice esta vez: Cambie el “or” por “and”.
if (Ana == Juan) and ((Helena < Melisa) and (Melisa Roberto):
print ‘Che, vos, no existís’
else:
print ‘Si lo sé, no era tan complicado, es que me colgue jeje’
Esta vez si Eugenia, cumplí con mi deber! Gracias por todo. Abrazo.
Excelente Gume! Mil gracias por tu aporte!!
Oh, yeah!!!!!!!!!!!!!! Brindo con un mate cantando ♫ ♬ ♫ güi ar de chempions… güi ar de chempions… ♫ ♬ ♫ (por favor, léase sin entonar y muy desafinadamente para resultar realista)
Ahora si ya estoy al día, mañana espero el siguiente capitulo y ya no atrasarme :p
Felicidades
Genial!!! 😀
Esperando la quinta entrega…..
hola, voy avanzando poco a poco, pero tengo una pregunta como se manejaria la sintaxis de la estructura de control switch y while ??
Hola José!
En el caso de Python, son las construcciones if, elif, else las que sustituyen el switch/case de otros lenguajes (http://docs.python.org/tutorial/controlflow.html#if-statements)
En el caso de while, la diferencia con for es que se utiliza para iterar solo mientras una expresión sea verdadera. La sintáxis es:
while expresion:
# mientras expresion == True hacer esto
else:
# si expresion == False terminar con esto otro
# else, es opcional
Un ejemplo concreto:
a = 0
while a < 10:
print a
a += 2
else:
print "Hemos terminado"
Hola encuentro dos errores en el archivo que esta en el launchpad –> capitulo3 –> presupuesto
lineas 104 y 105, según el código debería ser “filename” y dice es “filname” … excelente tuto me lo repase hoy todo, muy fácil para aquellos que no entienden POO, larga vida para la comunidad
Hola Ale!
Ya mismo reviso los archivos en el repo! Gracias por avisar!!!!
Listooooo! Corregido http://bazaar.launchpad.net/~eugeniabahit/python-mdw/trunk/revision/7
Gracias again!!!!
hola eugenia estoy intentando hacer un programa que me calcule el gasto de una tanqueda a otra de gasolina en mi moto, en un txt tengo los datos de la ultima vez que tanquie y el usuario debe ingresar los datos de la tanqueada actual .. pero no se porque la funcion __init__ no me lleva a la funcion intro_datos
http://pastebin.lugmen.org.ar/7031
ya lo coregi estaba mal identado la funcion __init__
voy seguir avansando si tengo algun otro poroblema lo vuelvo a comentar
Uu este ha sido el capitulo q mas me ha gustado 😀 aunq no hayamos hecho nada pero es el que mas enseña y el que mas ha retado indirectamente si entiendes esto ya la hicistes 😛 solo falta instalar django y comenzar a hacer lo q sabemos hacer gracias Eu eres una master 😛 y lo mejor de todo… q eres mujer… cjz!!! ^⁻^
DUDA: aqui
if (Ana == Juan) and ((Helena < Melisa) or (Melisa Roberto)
haber si en lugar de ponerlo asi lo pongo asi:
if (Ana == Juan) and (Helena < Melisa) or (Melisa Roberto):
como evaluaria la condicion el if??? el problema esta con el or agarraria siempre las 2 condiciones en enmedio o… primero resolveria las 2 primeras condiciones y ahi aplicaria el or?? noc si me doy a entender…
En el primer ejemplo sería así: “Si ana es igual a juan y además helena es menor que melisa o melisa es menor que roberto” No se muy bien como explicarte, diría yo que es como para tener mas contexto, espero otra respuesta porque yo no me he podido expresar muy bien ahah
@sancas, el “or” en este caso, actúa como el signo + y el – en las ecuaciones aritméticas.
Si tienes 15 * 35 / 2 + 12, será naturalmente agrupado como (15 * 35 / 2) + 12.
Si el resultado de cada evaluación fuera:
if False and False or True
Lo interpretaría como if (False and False) or True, lo cual se traduce como:
Si el primer “término” es verdadero o el segundo es verdadero, entonces todo es verdadero.
La lectura de tu ejemplo sería:
Si (Ana es igual que Juan y Helena es Menor que Melisa) o Melisa es menor que Roberto.
Si lo primero fuese Falso y lo segundo Verdadero, se estaría cumpliendo igual.
HASTA HOY MARTES TERMINE LOS POST ANTERIORES AHORA ME TOCA EL NUMERO 5, SI UNO SE OLVIDA DE LOS CORCHETES Y LOS PUNTOS Y COMA DE C++ PARA HACER UN CODIGO MAS FACIL DE ESCRIBIR Y FELICITACIONES
pues yo he tenido que cambiar en mi codigo el texto “Soñaré” por “sonare” para que lo ejecutase.
después de probar de nuevo poniendo al principio esto:
# -*- conding: utf-8 -*-
me dí cuenta de que sobra una “n” y despues de dejarlo como coding… funcionó
este era un reto doble porque tuve que acordarme de poner lo de utf -8
(me parece increible que me esté enterando de como va un lenguaje) OOHHHH
hay un error tipográfico en el ejemplo de código de la sección “importar módulos”. dice “form string import Template” en lugar de “from”.
Hola Eugenia, te felicito un excelnte tutorial, me encanta, voy a pagar esta novatada, pero tengo que salir de la duda. desarrollo éste curso en SO kubuntu 11.10 pero tengo problemas para compliar los scripts por la “ñ” y las letras con tilde, te agardeceaía la ayuda.
Saludos Eugenia, soy algo nuevo en esta guía, recién la inicié ayer y me gustaría que por favor evaluaras mi respuesta al reto de este capitulo, ya que no se si entendi mal, pero no vi una solucion igual a la que yo di en los 49 comentarios anteriores y la verdad no se si he entendido mal tus instrucciones para resolver el reto, eso si, de la forma en que lo solucione si me imprime “Soñaré con condicionales” como dijiste no quite ningun operador, solo los cambie de posicion, quedandome de la siguiente manera:
Ana = 43
Juan = 43
Pedro = 8
Roberto = 12
Melisa = 15
Helena = 3
if (Ana == Juan) and not ((Helena < Melisa) or (Melisa Roberto):
print ‘Veo condicionales hasta en la sopa!’
else:
print ‘Soñaré con condicionales’
Espero y por favor me digas si ese era el objetivo…
Gracias.
IMPRESIONANTE!
que bueno aprender de esta forma, dan ganas de seguir leyendo
queria aportar que el ejemplo de las edades en el codigo podrian agregar la codificacion
# -*- coding: utf-8 -*-
se que estaba escrito en los capitulos anteriores, pero bue como uno es un pollo hay que repetirle algunas cosas
saludos y felicitaciones por este capitulo, vere que entrega el siguiente exitos!
Saludos,
En la siguiente línea, no debería decir ‘from’ en lugar de ‘form’?:
“form string import Template”
Espero la correciones no sean una molestia.
domo arigatou gozaimasu!