Curso Python
Curso Python
Módulo 1
En este módulo, aprenderás sobre:
• Fundamentos de programación.
• Establecimiento de tu entorno de programación.
• Compilación vs. interpretación.
• Introducción a Python.
Ninguna computadora es actualmente capaz de crear un nuevo idioma. Sin embargo, eso puede cambiar
pronto. Por otro lado, las personas también usan varios idiomas muy diferentes, pero estos idiomas se
crearon ellos mismos. Además, todavía están evolucionando.
Cada día se crean nuevas palabras y desaparecen las viejas. Estos lenguajes se llaman lenguajes
naturales.
Desafortunadamente, esta lengua está muy lejos de ser una lengua materna humana. Todos (tanto las
computadoras como los humanos) necesitamos algo más, un lenguaje común para las computadoras y
los seres humanos, o un puente entre los dos mundos diferentes.
Necesitamos un lenguaje en el que los humanos puedan escribir sus programas y un lenguaje que las
computadoras puedan usar para ejecutar los programas, que es mucho más complejo que el lenguaje
máquina y más sencillo que el lenguaje natural.
Tales lenguajes son a menudo llamados lenguajes de programación de alto nivel. Son algo similares a
los naturales en que usan símbolos, palabras y convenciones legibles para los humanos. Estos lenguajes
permiten a los humanos expresar comandos a computadoras que son mucho más complejas que las
ofrecidas por las IL.
Un programa escrito en un lenguaje de programación de alto nivel se llama (en contraste con el código
de máquina ejecutado por las computadoras). Del mismo modo, el archivo que contiene el código fuente
se llama archivo fuente.
Si la línea se ve bien, el intérprete intenta ejecutarla (nota: cada línea generalmente se ejecuta por
separado, por lo que el trío "Lectura - Verificación - Ejecución", pueden repetirse muchas veces, más
veces que el número real de líneas en el archivo fuente, como algunas partes del código pueden ejecutarse
más de una vez).
También es posible que una parte significativa del código se ejecute con éxito antes de que el intérprete
encuentre un error. Este es el comportamiento normal en este modelo de ejecución.
Puedes preguntar ahora: ¿Cuál es mejor? ¿El modelo de "compilación" o el modelo de "interpretación"?
No hay una respuesta obvia. Si hubiera habido, uno de estos modelos habría dejado de existir hace mucho
tiempo. Ambos tienen sus ventajas y sus desventajas.
• Python es un lenguaje interpretado. Esto significa que hereda todas las ventajas y desventajas
descritas. Por supuesto, agrega algunas de sus características únicas a ambos conjuntos.
• Si deseas programar en Python, necesitarás el intérprete de Python. No podrás ejecutar tu código
sin él. Afortunadamente, Python es gratis. Esta es una de sus ventajas más importantes.
Debido a razones históricas, los lenguajes diseñados para ser utilizados en la manera de interpretación a
menudo se llaman lenguajes de programación, mientras que los programas fuente codificados que los
usan se llaman scripts.
¿Qué es Python?
Python es un lenguaje de programación de alto nivel, interpretado, orientado a objetos y de uso
generalizado con semántica dinámica, que se utiliza para la programación de propósito general.
Y aunque puede que conozcas a la pitón como una gran serpiente, el nombre del lenguaje de
programación Python proviene de una vieja serie de comedia de la BBC llamada Monty Python's Flying
Circus.
En el apogeo de su éxito, el equipo de Monty Python estaba realizando sus escenas para audiencias en
vivo en todo el mundo, incluso en el Hollywood Bowl.
Dado que Monty Python es considerado uno de los dos nutrientes fundamentales para un programador
(el otro es la pizza), el creador de Python nombró el lenguaje en honor del programa de televisión.
• Un lenguaje fácil e intuitivo tan poderoso como los de los principales competidores.
• De código abierto, para que cualquiera pueda contribuir a su desarrollo.
• El código que es tan comprensible como el inglés simple.
• Adecuado para tareas cotidianas, permitiendo tiempos de desarrollo cortos.
Unos 20 años después, está claro que todas estas intenciones se han cumplido. Algunas fuentes dicen que
Python es el lenguaje de programación más popular del mundo, mientras que otros afirman que es el
tercero o el quinto.
De cualquier manera, todavía ocupa un alto rango en el top ten de la PYPL Popularity of Programming
Language y la TIOBE Programming Community Index.
Python no es una lengua joven. Es maduro y digno de confianza. No es una maravilla de un solo golpe.
Es una estrella brillante en el firmamento de programación, y el tiempo dedicado a aprender Python es
una muy buena inversión.
• Es fácil de aprender - El tiempo necesario para aprender Python es más corto que en muchos
otros lenguajes; esto significa que es posible comenzar la programación real más rápido.
• Es fácil de enseñar - La carga de trabajo de enseñanza es menor que la que necesitan otros
lenguajes; esto significa que el profesor puede poner más énfasis en las técnicas de programación
generales (independientes del lenguaje), no gastando energía en trucos exóticos, extrañas
excepciones y reglas incomprensibles.
• Es fácil de utilizar - Para escribir software nuevo; a menudo es posible escribir código más rápido
cuando se usa Python.
• Es fácil de entender - A menudo, también es más fácil entender el código de otra persona más
rápido si está escrito en Python.
• Es fácil de obtener, instalar y desplegar - Python es gratuito, abierto y multiplataforma; No
todos los lenguajes pueden presumir de eso.
Por supuesto, Python también tiene sus inconvenientes:
Rivales de Python
Python tiene dos competidores directos, con propiedades y predisposiciones comparables. Estos son:
Cython
Otro miembro de la familia Python es Cython.
Cython es una de las posibles soluciones al rasgo de Python más doloroso: la falta de eficiencia. Los
cálculos matemáticos grandes y complejos pueden ser fácilmente codificados en Python (mucho más
fácil que en "C" o en cualquier otro lenguaje tradicional), pero la ejecución del código resultante puede
requerir mucho tiempo.
¿Cómo se reconcilian estas dos contradicciones? Una solución es escribir tus ideas matemáticas usando
Python, y cuando estés absolutamente seguro de que tu código es correcto y produce resultados válidos,
puedes traducirlo a "C". Ciertamente, "C" se ejecutará mucho más rápido que Python puro.
Esto es lo que pretende hacer Cython: traducir automáticamente el código de Python (limpio y claro,
pero no demasiado rápido) al código "C" (complicado y hablador, pero ágil).
Jython
Otra versión de Python se llama Jython.
"J" es para "Java". Imagina un Python escrito en Java en lugar de C. Esto es útil, por ejemplo, si
desarrollas sistemas grandes y complejos escritos completamente en Java y deseas agregarles cierta
flexibilidad de Python. El tradicional CPython puede ser difícil de integrar en un entorno de este tipo, ya
que C y Java viven en mundos completamente diferentes y no comparten muchas ideas comunes.
Jython puede comunicarse con la infraestructura Java existente de manera más efectiva. Es por esto que
algunos proyectos lo encuentran útil y necesario.
Nota: la implementación actual de Jython sigue los estándares de Python 2. Hasta ahora, no hay Jython
conforme a Python 3.
PyPy y RPython
Echa un vistazo al logo de abajo. Es un rebus. ¿Puedes resolverlo?
Es un logotipo de PyPy - un Python dentro de un Python. En otras palabras, representa un entorno de
Python escrito en un lenguaje similar a Python llamado RPython (Restricted Python). En realidad es un
subconjunto de Python. El código fuente de PyPy no se ejecuta de manera interpretativa, sino que se
traduce al lenguaje de programación C y luego se ejecuta por separado.
Esto es útil porque si deseas probar cualquier característica nueva que pueda ser o no introducida en la
implementación de Python, es más fácil verificarla con PyPy que con CPython. Esta es la razón por la
que PyPy es más una herramienta para las personas que desarrollan Python que para el resto de los
usuarios.
Esto no hace que PyPy sea menos importante o menos serio que CPython.
Además, PyPy es compatible con el lenguaje Python 3.
Hay muchos más Pythons diferentes en el mundo. Los encontrarás sí los buscas, pero este curso se
centrará en CPython.
• Un editor que te ayudará a escribir el código (debes tener algunas características especiales, no
disponibles en herramientas simples); este editor dedicado te dará más que el equipo estándar del
sistema operativo.
• Una consola en la que puedes iniciar tu código recién escrito y detenerlo por la fuerza cuando se
sale de control.
• Una herramienta llamada depurador, capaz de ejecutar tu código paso a paso y te permite
inspeccionarlo en cada momento de su ejecución.
Además de sus muchos componentes útiles, la instalación estándar de Python 3 contiene una aplicación
muy simple pero extremadamente útil llamada IDLE.
IDLE es un acrónimo de: Integrated Development and Learning Environment (Desarrollo Integrado y
Entorno de Aprendizaje).
Navega por los menús de tu sistema operativo, encuentra IDLE en algún lugar debajo de Python 3.x y
ejecútalo. Esto es lo que deberías ver:
¿Cómo escribir y ejecutar tu primer programa?
Ahora es el momento de escribir y ejecutar tu primer programa en Python 3. Por ahora, será muy simple.
El primer paso es crear un nuevo archivo fuente y llenarlo con el código. Haz clic en File en el menú del
IDLE y elige New File.
Como puedes ver, IDLE abre una nueva ventana para ti. Puedes usarla para escribir y modificar tu código.
Esta es la ventana del editor. Su único propósito es ser un lugar de trabajo en el que se trate tu código
fuente. No confundas la ventana del editor con la ventana de shell. Realizan diferentes funciones.
La ventana del editor actualmente no tiene título, pero es una buena práctica comenzar a trabajar
nombrando el archivo de origen.
Haz clic en File (en la nueva ventana), luego haz clic en Save as ... , selecciona una carpeta para el nuevo
archivo (el escritorio es un buen lugar para tus primeros intentos de programación) y elige un nombre
para el nuevo archivo.
Nota: no
establezcas ninguna extensión para el nombre de archivo que vas a utilizar. Python necesita que sus
archivos tengan la extensión .py , por lo que debes confiar en los valores predeterminados de la ventana
de diálogo. El uso de la extensión .py estándar permite que el sistema operativo abra estos archivos
correctamente.
Esto se debe a que la naturaleza del error es diferente y el error se descubre en una etapa diferente de
la interpretación.
La ventana del editor no proporcionará ninguna información útil sobre el error, pero es posible que las
ventanas de la consola si.
El mensaje (en rojo) muestra (en las siguientes líneas):
• El rastreo (que es la ruta que el código atraviesa a través de diferentes partes del programa,
puedes ignorarlo por ahora, ya que está vacío en un código tan simple).
• La ubicación del error (el nombre del archivo que contiene el error, el número de línea y el
nombre del módulo); nota: el número puede ser engañoso, ya que Python generalmente muestra
el lugar donde se da cuenta por primera vez de los efectos del error, no necesariamente del error
en sí.
• El contenido de la línea errónea: nota: la ventana del editor de IDLE no muestra números de
línea, pero muestra la ubicación actual del cursor en la esquina inferior derecha; utilízalo para
ubicar la línea errónea en un código fuente largo.
• El nombre del error y una breve explicación.
Experimenta creando nuevos archivos y ejecutando tu código. Intenta enviar un mensaje diferente a la
pantalla, por ejemplo,¡rawr!, miau, o incluso tal vez un ¡oink! Intenta estropear y arreglar tu código,
observa que sucede.
Sandbox
Este curso no requiere que instales ninguna aplicación de software para probar tu código y hacer los
ejercicios.
Para probar o experimentar con tu código, puedes utilizar un entorno de programación en línea interactivo
y dedicado.
Sandbox permite que el código Python se ejecute en un navegador de Internet.
Es una herramienta integrada dentro del curso, que se puede usar como un Sandbox de Python basado
en el navegador que te permite probar el código discutido a lo largo del curso, así como un intérprete
que te permite iniciar, realizar y probar los ejercicios de laboratorio diseñados específicamente para
este curso.
... luego da clic en el botón Sandbox para ingresar al Modo Sandbox, pega el código en la ventana del
editor y haz clic en el botón Ejecutar para ver que sucede.
Para volver a nuestro curso, haz clic en Back to course en la esquina superior derecha de la interfaz de
Sandbox.
Interfaz de práctica
Este curso contiene cuatro tipos diferentes de interfaces.
Hasta ahora, haz visto la Interfaz de estudio (una o dos ventanas con texto e imágenes/animación) y la
Interfaz de Sandbox, que puedes usar para probar tu propio código (haz clic en Sandbox para cambiar
a la Interfaz de Sandbox).
Lo que ves ahora es la Interfaz de práctica, que te permite estudiar cosas nuevas y realizar tareas de
codificación al mismo tiempo. Utilizarás este tipo de interfaz la mayor parte del tiempo durante el curso.
La Interfaz de práctica consiste en un área de texto a la izquierda y las ventanas del Editor/Consola a la
derecha.
Otro tipo de interfaz que verás en el futuro es la Interfaz de prueba/examen, que te permitirá verificar tus
conocimientos y habilidades para ver que tan bien has dominado el material de estudio.
Fundamentos de Programación en Python:
Módulo 2
En este módulo, aprenderás sobre:
• Los tipos de datos y los métodos básicos de formateo, conversión de datos, entrada y salida de
datos.
• Operadores.
• Variables.
¡Hola, Mundo!
Es hora de comenzar a escribir código real y funcional en Python. Por el momento será muy sencillo.
Como se muestran algunos conceptos y términos fundamentales, estos fragmentos de código no serán
complejos ni difíciles.
Ejecuta el código en la ventana del editor a la derecha. Si todo sale bien, veras la línea de texto en la
ventana de consola.
Como alternativa, inicia IDLE, crea un nuevo archivo fuente de Python, coloca este código, nombra el
archivo y guárdalo. Ahora ejecútalo. Si todo sale bien, verás una línea en la ventana de la consola IDLE.
El código que has ejecutado debería parecerte familiar. Viste algo muy similar cuando te guiamos a través
de la configuración del entorno IDLE.
Ahora dedicaremos un poco de tiempo para mostrarte y explicarte lo que estás viendo y por que se ve
así.
Como puedes ver, el primer programa consta de las siguientes partes:
• La palabra print.
• Un paréntesis de apertura.
• Una comilla.
• Una línea de texto: ¡Hola, Mundo!.
• Otra comilla.
• Un paréntesis de cierre.
Cada uno de los elementos anteriores juega un papel muy importante en el código.
print("¡Hola, Mundo!")
La función print()
Mira la línea de código a continuación:
("¡Hola, Mundo!")
La palabra print que puedes ver aquí es el nombre de una función. Eso no significa que dondequiera
que aparezca esta palabra, será siempre el nombre de una función. El significado de la palabra proviene
del contexto en el cual se haya utilizado la palabra.
Probablemente hayas encontrado el término función muchas veces antes, durante las clases de
matemáticas. Probablemente también puedes recordar varios nombres de funciones matemáticas, como
seno o logaritmo.
Las funciones de Python, sin embargo, son más flexibles y pueden contener más contenido que sus
parientes matemáticos.
Una función (en este contexto) es una parte separada del código de computadora el cual es capaz de:
• Causar algún efecto (por ejemplo, enviar texto a la terminal, crear un archivo, dibujar una
imagen, reproducir un sonido, etc.); esto es algo completamente inaudito en el mundo de las
matemáticas.
• Evaluar un valor o algunos valores (por ejemplo, la raíz cuadrada de un valor o la longitud de
un texto dado); esto es lo que hace que las funciones de Python sean parientes de los conceptos
matemáticos.
Además, muchas de las funciones de Python pueden hacer las dos cosas anteriores juntas.
• Pueden venir de Python mismo. La función print es una de este tipo; dicha función es un valor
agregado de Python junto con su entorno (está integrada); no tienes que hacer nada especial (por
ejemplo, pedirle a alguien algo) si quieres usarla.
• Pueden provenir de uno o varios de los módulos de Python llamados complementos; algunos de
los módulos vienen con Python, otros pueden requerir una instalación por separado, cual sea el
caso, todos deben estar conectados explícitamente con el código (te mostraremos cómo hacer esto
pronto).
• Puedes escribirlas tú mismo, colocando tantas funciones como desees y necesites dentro de su
programa para hacerlo más simple, claro y elegante.
El nombre de la función debe ser significativo (el nombre de la función print es evidente), imprime en
la terminal.
Si vas a utilizar alguna función ya existente, no podrás modificar su nombre, pero cuando comiences a
escribir tus propias funciones, debes considerar cuidadosamente la elección de nombres.
La función print()
Como se dijo anteriormente, una función puede tener:
• Un efecto.
• Un resultado.
También hay un tercer componente de la función, muy importante, el o los argumento(s).
Las funciones matemáticas usualmente toman un argumento, por ejemplo, sen (x) toma una x, que es la
medida de un ángulo.
Las funciones de Python, por otro lado, son más versátiles. Dependiendo de las necesidades individuales,
pueden aceptar cualquier número de argumentos, tantos como sea necesario para realizar sus tareas. Nota:
algunas funciones de Python no necesitan ningún argumento.
print"¡Hola, Mundo!"
A pesar del número de argumentos necesarios o proporcionados, las funciones de Python demandan
fuertemente la presencia de un par de paréntesis - el de apertura y de cierre, respectivamente.
Si deseas entregar uno o más argumentos a una función, colócalos dentro de los paréntesis. Si vas a
utilizar una función que no tiene ningún argumento, aún tiene que tener los paréntesis.
Nota: para distinguir las palabras comunes de los nombres de funciones, coloca un par de paréntesis
vacíos después de sus nombres, incluso si la función correspondiente requiere uno o más argumentos.
Esta es una medida estándar.
La función de la que estamos hablando aquí es print().
La función print()
El único argumento entregado a la función print() en este ejemplo es una cadena:
print()
Como se puede ver, la cadena está delimitada por comillas - de hecho, las comillas forman la cadena,
recortan una parte del código y le asignan un significado diferente.
Podemos imaginar que las comillas significan algo así: el texto entre nosotros no es un código. No está
diseñado para ser ejecutado, y se debe tomar tal como está.
Casi cualquier cosa que ponga dentro de las comillas se tomará de manera literal, no como código, sino
como datos. Intenta jugar con esta cadena en particular - puedes modificarla. Ingresa contenido nuevo o
borra parte del contenido existente.
Existe más de una forma de como especificar una cadena dentro del código de Python, pero por ahora,
esta será suficiente.
Hasta ahora, has aprendido acerca de dos partes importantes del código- la función y la cadena. Hemos
hablado de ellos en términos de sintaxis, pero ahora es el momento de discutirlos en términos de
semántica.
La función print()
El nombre de la función (print en este caso) junto con los paréntesis y los argumentos, forman la
invocación de la función.
Discutiremos esto en mayor profundidad mas adelante, pero por lo pronto, arrojaremos un poco más de
luz al asunto.
print("¡Hola, Mundo!")
¿Qué sucede cuando Python encuentra una invocación como la que está a continuación?
nombreFunción(argumento)
Veamos:
• Primero, Python comprueba si el nombre especificado es legal (explora sus datos internos para
encontrar una función existente del nombre; si esta búsqueda falla, Python cancela el código).
• En segundo lugar, Python comprueba si los requisitos de la función para el número de argumentos
le permiten invocar la función de esta manera (por ejemplo, si una función específica exige
exactamente dos argumentos, cualquier invocación que entregue solo un argumento se
considerará errónea y abortará la ejecución del código).
• Tercero, Python deja el código por un momento y salta dentro de la función que se desea
invocar; por lo tanto, también toma los argumentos y los pasa a la función.
• Cuarto, la función ejecuta el código, provoca el efecto deseado (si lo hubiera), evalúa el (los)
resultado(s) deseado(s) y termina la tarea.
• Finalmente, Python regresa al código (al lugar inmediatamente después de la invocación) y
reanuda su ejecución.
LABORATORIO
Tiempo Estimado
5 minutos
Nivel de dificultad
Muy fácil
Objetivos
• Familiarizarse con la función print() y sus capacidades de formateo.
• Experimentar con el código de Python.
Escenario
El comando print() , el cual es una de las directivas más sencillas de Python, simplemente imprime
una línea de texto en la pantalla.
En tu primer laboratorio:
La función print()
El efecto es muy útil y espectacular. La función toma los argumentos (puede aceptar más de un argumento
y también puede aceptar menos de un argumento) los convierte en un formato legible para el ser humano
si es necesario (como puedes sospechar, las cadenas no requieren esta acción, ya que la cadena ya está
legible) y envía los datos resultantes al dispositivo de salida (generalmente la consola); en otras
palabras, cualquier cosa que se ponga en la función de print() aparecerá en la pantalla.
No es de extrañar entonces, que de ahora en adelante, utilizarás print() muy intensamente para ver
los resultados de tus operaciones y evaluaciones.
Cualquiera. Te mostraremos pronto que print() puede operar con prácticamente todos los tipos de
datos ofrecidos por Python. Cadenas, números, caracteres, valores lógicos, objetos: cualquiera de estos
se puede pasar con éxito a print().
• El programa invoca la función print() dos veces, como puedes ver hay dos líneas separadas
en la consola: esto significa que print() comienza su salida desde una nueva línea cada vez
que comienza su ejecución. Puedes cambiar este comportamiento, pero también puedes usarlo a
tu favor.
• Cada invocación de print() contiene una cadena diferente, como su argumento y el contenido
de la consola lo reflejan- esto significa que las instrucciones en el código se ejecutan en el
mismo orden en que se colocaron en el archivo de origen; no se ejecuta la siguiente instrucción
hasta que se complete la anterior (hay algunas excepciones a esta regla, pero puedes ignorarlas
por ahora).
Hemos cambiado un poco el ejemplo: hemos agregado una invocación vacía de la función print().
La llamamos vacía porque no hemos agregado ningún argumento a la función.
Lo puedes ver en la ventana del editor. Ejecuta el código.
¿Qué ocurre?
print("La Witsi Witsi Araña subió a su telaraña.")
print()
print("Vino la lluvia y se la llevó.")
Como puedes ver, la invocación de print() vacía no esta tan vacía como se esperaba - genera una
línea vacía (esta interpretación también es correcta) su salida es solo una nueva línea.
Esta no es la única forma de producir una nueva linea en la consola de salida. Enseguida mostraremos
otra manera.
Tanto la barra diagonal inversa como la n forman un símbolo especial denominado carácter de nueva
línea (newline character), que incita a la consola a iniciar una nueva línea de salida.
Como se puede observar, aparecen dos nuevas líneas en la canción infantil, en los lugares donde se ha
utilizado \n.
2. No todos los pares de escape (la barra invertida junto con otro carácter) significan algo.
Experimenta con el código en el editor, ejecútalo y observa lo que sucede.
Hay una invocación de la función print() pero contiene tres argumentos. Todos ellos son cadenas.
Los argumentos están separados por comas. Se han rodeado de espacios para hacerlos más visibles,
pero no es realmente necesario y no se hará más.
En este caso, las comas que separan los argumentos desempeñan un papel completamente diferente a la
coma dentro de la cadena. El primero es una parte de la sintaxis de Python, el segundo está destinado a
mostrarse en la consola.
Si vuelves a mirar el código, verás que no hay espacios dentro de las cadenas.
Ejecuta el código y observa lo que pasa.
Los espacios, removidos de las cadenas, han vuelto a aparecer. ¿Puedes explicar porque?
Dos conclusiones surgen de este ejemplo:
• Una función print() invocada con más de un argumento genera la salida en una sola línea.
• La función print() pone un espacio entre los argumentos emitidos por iniciativa propia.
No se va a explicar en profundidad ahora. Se planea hacer esto cuando se trate el tema de funciones. Por
ahora, simplemente queremos mostrarte como funciona. Siéntete libre de utilizarlo en tus propios
programas.
El mecanismo se llama argumentos de palabras clave. El nombre se deriva del hecho de que el
significado de estos argumentos no se toma de su ubicación (posición) sino de la palabra especial (palabra
clave) utilizada para identificarlos.
La función print() tiene dos argumentos de palabras clave que se pueden utilizar para estos
propósitos. El primero de ellos se llama end.
En la ventana del editor se puede ver un ejemplo muy simple de como utilizar un argumento de palabra
clave.
Para utilizarlo es necesario conocer algunas reglas:
• Un argumento de palabra clave consta de tres elementos: una palabra clave que identifica el
argumento ( -termina aquí); un signo de igual (=); y un valor asignado a ese argumento.
• Cualquier argumento de palabra clave debe ponerse después del último argumento posicional
(esto es muy importante).
En nuestro ejemplo, hemos utilizado el argumento de palabra clave y lo hemos igualado a una cadena
que contiene un espacio.
Ejecuta el código para ver como funciona.
Como puedes ver, el argumento de palabra clave determina los caracteres que la función print() envía a
la salida una vez que llega al final de sus argumentos posicionales.
El comportamiento predeterminado refleja la situación en la que el argumento de la palabra clave se usa
implícitamente de la siguiente manera: end="\n".
La función print() ahora utiliza un guión, en lugar de un espacio, para separar los argumentos
generados.
Nota: el valor del argumento sep también puede ser una cadena vacía. Pruébalo tu mismo.
La función print() - los argumentos de
palabras clave
Ambos argumentos de palabras clave pueden mezclarse en una invocación, como aquí en la ventana
del editor.
El ejemplo no tiene mucho sentido, pero representa visiblemente las interacciones entre end y sep.
LABORATORIO
Tiempo Estimado
5 minutos
Nivel de dificultad
Muy fácil
Objetivos
• Familiarizarse con la función de print() y sus capacidades de formato.
• Experimentar con el código de Python.
Escenario
Modifica la primera línea de código en el editor, utilizando las palabras clave sep y end, para que
coincida con el resultado esperado. Recuerda, utilizar dos funciones print().
Resultado Esperado
Fundamentos***Programación***en...Python
LABORATORIO
Tiempo Estimado
5-10 minutos
Nivel de dificultad
Facil
Objetivos
• Experimentar con el código Python existente.
• Descubrir y solucionar errores básicos de sintaxis.
• Familiarizarse con la función print() y sus capacidades de formato.
Escenario
Recomendamos que juegues con el código que hemos escrito para ti y que realices algunas correcciones
(quizás incluso destructivas). Siéntete libre de modificar cualquier parte del código, pero hay una
condición: aprende de tus errores y saca tus propias conclusiones.
Intenta:
Un literal se refiere a datos cuyos valores están determinados por el literal mismo.
Debido a que es un concepto un poco difícil de entender, un buen ejemplo puede ser muy útil.
Observa los siguientes dígitos:
123
¿Puedes adivinar qué valor representa? claro que puedes - es ciento veintitrés.
Que tal este:
c
¿Representa algún valor? Tal vez. Puede ser el símbolo de la velocidad de la luz, por ejemplo. También
puede representar la constante de integración. Incluso la longitud de una hipotenusa en el Teorema de
Pitágoras. Existen muchas posibilidades.
Se utilizan literales para codificar datos y ponerlos dentro del código. Ahora mostraremos algunas
convenciones que se deben seguir al utilizar Python.
Enteros
Quizá ya sepas un poco acerca de como las computadoras hacen cálculos con números. Tal vez has
escuchado del sistema binario, y como es que ese es el sistema que las computadoras utilizan para
almacenar números y como es que pueden realizar cualquier tipo de operaciones con ellos.
No exploraremos las complejidades de los sistemas numéricos posicionales, pero se puede afirmar que
todos los números manejados por las computadoras modernas son de dos tipos:
El proceso es casi como usar lápiz y papel, es simplemente una cadena de dígitos que conforman el
número, pero hay una condición, no se deben insertar caracteres que no sean dígitos dentro del número.
Tomemos por ejemplo, el número once millones ciento once mil ciento once. Si tomaras ahorita un lápiz
en tu mano, escribirías el siguiente numero: 11,111,111, o así: 11.111.111, incluso de esta
manera: 11 111 111.
Es claro que la separación hace que sea más fácil de leer, especialmente cuando el número tiene
demasiados dígitos. Sin embargo, Python no acepta estas cosas. Esta prohibido. ¿Qué es lo que Python
permite? El uso de guion bajo en los literales numéricos.*
Por lo tanto, el número se puede escribir ya sea así: 11111111, o como sigue: 11_111_111.
NOTA *Python 3.6 ha introducido el guion bajo en los literales numéricos, permitiendo colocar un
guion bajo entre dígitos y después de especificadores de base para mejorar la legibilidad. Esta
característica no está disponible en versiones anteriores de Python.
¿Cómo se codifican los números negativos en Python? Como normalmente se hace, agregando un signo
de menos. Se puede escribir: -11111111, o -11_111_111.
Los números positivos no requieren un signo positivo antepuesto, pero es permitido, si se desea hacer.
Las siguientes líneas describen el mismo número: +11111111 y 11111111.
La segunda convención nos permite utilizar números en hexadecimal. Dichos números deben ser
precedidos por el prefijo 0x o 0X (cero-x).
0x123 es un número hexadecimal con un valor (decimal) igual a 291. La función print() puede manejar
estos valores también. Intenta esto:
print(0x123)
Flotantes
Ahora es tiempo de hablar acerca de otro tipo, el cual esta designado para representar y almacenar los
números que (como lo diría un matemático) tienen una parte decimal no vacía.
Son números que tienen (o pueden tener) una parte fraccionaria después del punto decimal, y aunque
esta definición es muy pobre, es suficiente para lo que se desea discutir.
Cuando se usan términos como dos y medio o menos cero punto cuatro, pensamos en números que la
computadora considera como números punto-flotante:
2.5 -0.4
Nota: dos punto cinco se ve normal cuando se escribe en un programa, sin embargo si tu idioma nativo
prefiere el uso de una coma en lugar de un punto, se debe asegurar que el número no contenga más
comas.
Python no lo aceptará, o (en casos poco probables) puede malinterpretar el número, debido a que la coma
tiene su propio significado en Python.
Si se quiere utilizar solo el valor de dos punto cinco, se debe escribir como se mostró anteriormente. Nota
que hay un punto entre el 2 y el 5 - no una coma.
Como puedes imaginar, el valor de cero punto cuatro puede ser escrito en Python como:
0.4
Pero no hay que olvidar esta sencilla regla, se puede omitir el cero cuando es el único dígito antes del
punto decimal.
En esencia, el valor 0.4 se puede escribir como:
.4
Se puede pensar que son idénticos, pero Python los ve de una manera completamente distinta.
4 es un número entero, mientras que 4.0 es un número punto-flotante .
Por otro lado, no solo el punto hace que un número sea flotante. Se puede utilizar la letra e.
Cuando se desea utilizar números que son muy pequeños o muy grandes, se puede implementar la
notación científica.
Por ejemplo, la velocidad de la luz, expresada en metros por segundo. Escrita directamente se vería de
la siguiente manera: 300000000.
Para evitar escribir tantos ceros, los libros de texto emplean la forma abreviada, la cual probablemente
hayas visto: 3 x 108.
La letra E (también se puede utilizar la letra minúscula e - proviene de la palabra exponente) la cual
significa por diez a la n potencia.
Nota:
Codificando Flotantes
Veamos ahora como almacenar números que son muy pequeños (en el sentido de que están muy cerca
del cero).
Una constante de física denominada "La Constante de Planck" (denotada como h), de acuerdo con los
libros de texto, tiene un valor de: 6.62607 x 10-34.
Si se quisiera utilizar en un programa, se debería escribir de la siguiente manera:
6.62607E-34
Nota: el hecho de que se haya escogido una de las posibles formas de codificación de un valor flotante
no significa que Python lo presentará de la misma manera.
Python podría en ocasiones elegir una notación diferente.
Este es el resultado:
1e-22
salida
Python siempre elige la presentación más corta del número, y esto se debe de tomar en consideración
al crear literales.
Cadenas
Las cadenas se emplean cuando se requiere procesar texto (como nombres de cualquier tipo, direcciones,
novelas, etc.), no números.
Ya conoces un poco acerca de ellos, por ejemplo, que las cadenas requieren comillas así como los
flotantes necesitan punto decimal.
Este es un ejemplo de una cadena: "Yo soy una cadena."
Sin embargo, hay una cuestión. ¿Cómo se puede codificar una comilla dentro de una cadena que ya está
delimitada por comillas?
Supongamos que se desea mostrar un muy sencillo mensaje:
Me gusta "Monty Python"
¿Cómo se puede hacer esto sin generar un error? Existen dos posibles soluciones.
La primera se basa en el concepto ya conocido del carácter de escape, el cual recordarás se utiliza
empleando la diagonal invertida. La diagonal invertida puede también escapar de la comilla. Una
comilla precedida por una diagonal invertida cambia su significado, no es un limitador, simplemente es
una comilla. Lo siguiente funcionará como se desea:
print("Me gusta \"Monty Python\"")
Nota: ¿Existen dos comillas con escape en la cadena, puedes observar ambas?
La segunda solución puede ser un poco sorprendente. Python puede utilizar una apóstrofe en lugar de
una comilla. Cualquiera de estos dos caracteres puede delimitar una cadena, pero para ello se debe ser
consistente.
Si se delimita una cadena con una comilla, se debe cerrar con una comilla.
Si se inicia una cadena con un apóstrofe, se debe terminar con un apóstrofe.
Este ejemplo funcionará también:
print('Me gusta "Monty Python"')
Codificando cadenas
Ahora, la siguiente pregunta es: ¿Cómo se puede insertar un apóstrofe en una cadena la cual está limitada
por dos apóstrofes?
A estas alturas ya se debería tener una posible respuesta o dos.
Intenta imprimir una cadena que contenga el siguiente mensaje:
I'm Monty Python.
¿Sabes cómo hacerlo? Haz clic en Revisar para saber si estas en lo cierto:
print('I\'m Monty Python.')
o
Como se puede observar, la diagonal invertida es una herramienta muy poderosa, puede escapar no solo
comillas, sino también apóstrofes.
Ya se ha mostrado, pero se desea hacer énfasis en este fenómeno una vez mas - una cadena puede estar
vacía - puede no contener caracter alguno.
Una cadena vacía sigue siendo una cadena:
'' ""
Valores Booleanos
Para concluir con los literales de Python, existen dos más.
No son tan obvios como los anteriores y se emplean para representar un valor muy abstracto - la
veracidad.
Cada vez que se le pregunta a Python si un número es más grande que otro, el resultado es la creación de
un tipo de dato muy específico - un valor booleano.
El nombre proviene de George Boole (1815-1864), el autor de Las Leyes del Pensamiento, las cuales
definen el Algebra Booleana - una parte del algebra que hace uso de dos valores: Verdadero y
Falso, denotados como 1 y 0.
LABORATORIO
Tiempo Estimado
5 minutos
Nivel de dificultad
Fácil
Objetivos
• Familiarizarse con la función print() y sus capacidades de formato.
• Practicar el codificar cadenas.
• Experimentar con el código de Python.
Escenario
Escribe una sola línea de código, utilizando la función print(), así como los caracteres de nueva línea
y escape, para obtener la salida esperada de tres líneas.
Salida Esperada
Puntos Clave
1. Literales son notaciones para representar valores fijos en el código. Python tiene varios tipos de
literales, es decir, un literal puede ser un número por ejemplo, 123), o una cadena (por ejemplo, "Yo soy
un literal.").
2. El Sistema Binario es un sistema numérico que emplea 2 como su base. Por lo tanto, un número
binario está compuesto por 0s y 1s únicamente, por ejemplo, 1010 es 10 en decimal.
Los sistemas de numeración Octales y Hexadecimales son similares pues emplean 8 y 16 como sus bases
respectivamente. El sistema hexadecimal utiliza los números decimales más seis letras adicionales.
3. Los Enteros (o simplemente int) son uno de los tipos numéricos que soporta Python. Son números
que no tienen una parte fraccionaria, por ejemplo, 256, o -1 (enteros negativos).
4. Los números Punto-Flotante (o simplemente flotantes) son otro tipo numérico que soporta Python.
Son números que contienen (o son capaces de contener) una parte fraccionaria, por ejemplo, 1.27.
5. Para codificar un apóstrofe o una comilla dentro de una cadena se puede utilizar el carácter de escape,
por ejemplo, 'I\'m happy.', o abrir y cerrar la cadena utilizando un conjunto de símbolos distintos
al símbolo que se desea codificar, por ejemplo, "I'm happy." para codificar un apóstrofe, y 'Él
dijo "Python", no "typhoon"' para codificar comillas.
6. Los Valores Booleanos son dos objetos constantes Verdadero y Falso empleados para representar
valores de verdad (en contextos numéricos 1 es True, mientras que 0 es False).
EXTRA
Existe un literal especial más utilizado en Python: el literal None. Este literal es llamado un objeto de
NonType (ningún tipo), y puede ser utilizado para representar la ausencia de un valor. Pronto se
hablará más acerca de ello.
Ejercicio 1
¿Qué tipos de literales son los siguientes dos ejemplos?
"Hola", "007"
Ejercicio 2
¿Qué tipo de literales son los siguientes cuatro ejemplos?
"1.5", 2.0, 528, False
El primero es una cadena, el segundo es numérico (flotante), el tercero es numérico (entero) y el cuarto
es booleano.
Ejercicio 3
¿Cuál es el valor en decimal del siguiente numero en binario?
1011
Es 11, porque (2**0) + (2**1) + (2**3) = 11
El orden en el que aparecen no es por casualidad. Hablaremos más de ello cuando se hayan visto todos.
Recuerda: Cuando los datos y operadores se unen, forman juntos expresiones. La expresión más sencilla
es el literal.
Operadores aritméticos:
exponenciación
Un signo de ** (doble asterisco) es un operador de exponenciación (potencia). El argumento a la
izquierda es la base, el de la derecha, el exponente.
Las matemáticas clásicas prefieren una notación con superíndices, como el siguiente: 23. Los editores de
texto puros no aceptan esa notación, por lo tanto Python utiliza ** en lugar de la notación matemática,
por ejemplo, 2 ** 3.
Nota: En los ejemplos, los dobles asteriscos están rodeados de espacios, no es obligatorio hacerlo pero
hace que el código sea mas legible.
Los ejemplos muestran una característica importante de los operadores numéricos de Python.
Ejecuta el código y observa cuidadosamente los resultados que arroja. ¿Puedes observar algo?
Recuerda: Es posible formular las siguientes reglas con base en los resultados:
Operadores aritméticos:
multiplicación
Un símbolo de * (asterisco) es un operador de multiplicación.
• El resultado carece de la parte fraccionaria, está ausente (para los enteros), o siempre es igual a
cero (para los flotantes); esto significa que los resultados siempre son redondeados.
• Se ajusta a la regla entero vs flotante.
Ejecuta el ejemplo debajo y observa los resultados:
print(6 // 3) print(6 // 3.) print(6. // 3) print(6. // 3.)
Como se puede observar, una división de entero entre entero da un resultado entero. Todos los demás
casos producen flotantes.
NOTA
La division entera también se le suele llamar en inglés floor division. Más adelante te cruzarás con este
término.
Piensa en el como una diagonal (operador de división) acompañado por dos pequeños círculos.
El resultado de la operación es el residuo que queda de la división entera.
En otras palabras, es el valor que sobra después de dividir un valor entre otro para producir un resultado
entero.
Nota: el operador en ocasiones también es denominado módulo en otros lenguajes de programación.
Observa el fragmento de código â“ intenta predecir el resultado y después ejecútalo:
print(14 % 4)
¿Cuál es el resultado?
3.0 - no 3 pero 3.0 (la regla aun funciona: 12 // 4.5 da 2.0; 2.0 * 4.5 da 9.0; 12 - 9.0
da 3.0)
Operadores: como no dividir
Como probablemente sabes, la división entre cero no funciona.
No intentes:
Operadores: suma
El símbolo del operador de suma es el + (signo de más), el cual esta completamente alineado a los
estándares matemáticos.
De nuevo, observa el siguiente fragmento de código:
print(-4 + 4) print(-4. + 8)
Por cierto: también hay un operador + unario. Se puede utilizar de la siguiente manera:
print(+2)
El operador conserva el signo de su único argumento, el de la derecha.
Aunque dicha construcción es sintácticamente correcta, utilizarla no tiene mucho sentido, y sería difícil
encontrar una buena razón para hacerlo.
Observa el fragmento de código que está arriba - ¿Puedes adivinar el resultado o salida?
• 2 ** 2 → 4; 4 ** 3 → 64
• 2 ** 3 → 8; 2 ** 8 → 256
Lista de prioridades
Como eres nuevo a los operadores de Python, no se presenta por ahora una lista completa de las
prioridades de los operadores.
En lugar de ello, se mostrarán solo algunos, y se irán expandiendo conforme se vayan introduciendo
operadores nuevos.
Observa la siguiente tabla:
Prioridad Operador
1 +, - unario
2 **
3 *, /, %
4 +, - binario
Nota: se han enumerado los operadores en orden de la mas alta (1) a la mas baja (4) prioridad.
Intenta solucionar la siguiente expresión:
print(2 * 3 % 5)
Ambos operadores (* y %) tienen la misma prioridad, el resultado solo se puede obtener conociendo el
sentido del enlazado. ¿Cuál será el resultado?
Operadores y paréntesis
Por supuesto, se permite hacer uso de paréntesis, lo cual cambiará el orden natural del cálculo de la
operación.
De acuerdo con las reglas aritméticas, las sub-expresiones dentro de los paréntesis siempre se
calculan primero.
Se pueden emplear tantos paréntesis como se necesiten, y seguido son utilizados para mejorar la
legibilidad de una expresión, aun si no cambian el orden de las operaciones.
Un ejemplo de una expresión con múltiples paréntesis es la siguiente:
print((5 * ((25 % 13) + 100) / (2 * 13)) // 2)
Intenta calcular el valor que se calculará en la consola. ¿Cuál es el resultado de la función print()?
10.0
Puntos Clave
1. Una expresión es una combinación de valores (o variables, operadores, llamadas a funciones,
aprenderás de ello pronto) las cuales son evaluadas y dan como resultado un valor, por ejemplo, 1+2.
2. Los operadores son símbolos especiales o palabras clave que son capaces de operar en los valores y
realizar operaciones matemáticas, por ejemplo, el * multiplica dos valores: x*y.
5. Un operador binario es un operador con dos operados, por ejemplo, 4+5, o 12%5.
6. Algunos operadores actúan antes que otros, a esto se le llama - jerarquía de prioridades:
7. Las sub-expresiones dentro de paréntesis siempre se calculan primero, por ejemplo, 15-
1*(5*(1+2))=0.
8. Los operadores de exponenciación utilizan enlazado hacia la derecha, por ejemplo, 2**2**3=256.
Ejercicio 1
¿Cuál es la salida del siguiente fragmento de código?
print((2**4), (2*4.), (2*4))
16 8.0 8
Ejercicio 2
¿Cuál es la salida del siguiente fragmento de código?
print((-2/4), (2/4), (2//4), (-2//4))
-0.5 0.5 0 -1
Ejercicio 3
¿Cuál es la salida del siguiente fragmento de código?
print((2%-4), (2%4), (2**3**2))
-2 2 512
• Un nombre.
• Un valor (el contenido del contenedor).
Comencemos con lo relacionado al nombre de la variable.
Las variables no aparecen en un programa automáticamente. Como desarrollador, tu debes decidir
cuantas variables deseas utilizar en tu programa.
También las debes de nombrar.
Palabras Clave
Observa las palabras que juegan un papel muy importante en cada programa de Python.
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class',
'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for',
'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal',
'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with',
'yield']
Son llamadas palabras clave o (mejor dicho) palabras reservadas. Son reservadas porque no se deben
utilizar como nombres: ni para variables, ni para funciones, ni para cualquier otra cosa que se desee
crear.
El significado de la palabra reservada está predefinido, y no debe cambiar.
Afortunadamente, debido al hecho de que Python es sensible a mayúsculas y minúsculas, cualquiera de
estas palabras se pueden modificar cambiando una o varias letras de mayúsculas a minúsculas o
viceversa, creando una nueva palabra, la cual no esta reservada.
Por ejemplo - no se puede nombrar a la variable así:
import
No se puede tener una variable con ese nombre, esta prohibido, pero se puede hacer lo siguiente:
Import
Estas palabras podrían parecer un misterio ahorita, pero pronto se aprenderá acerca de su significado.
Creando variables
¿Qué se puede poner dentro de una variable?
Cualquier cosa.
Se puede utilizar una variable para almacenar cualquier tipo de los valores que ya se han mencionado, y
muchos mas de los cuales aun no se han explicado.
El valor de la variable en lo que se ha puesto dentro de ella. Puede variar tanto como se necesite o
requiera. El valor puede ser entero, después flotante, y eventualmente ser una cadena.
Hablemos de dos cosas importantes - como son creadas las variables, y como poner valores dentro
de ellas (o mejor dicho, como dar o pasarles valores).
RECUERDA
Una variable se crea cuando se le asigna un valor. A diferencia de otros lenguajes de programación,
no es necesario declararla.
Si se le asigna cualquier valor a una variable no existente, la variable será automáticamente creada. No
se necesita hacer algo más.
La creación (o su sintaxis) es muy simple: solo utiliza el nombre de la variable deseada, después el
signo de igual (=) y el valor que se desea colocar dentro de la variable.
• La primera crea una variable llamada var, y le asigna un literal con un valor entero de 1.
• La segunda imprime el valor de la variable recientemente creada en la consola.
Nota: print() tiene una función más â“ puede manejar variables también. ¿Puedes predecir cual será
la salida (resultado) del código?
1
Utilizando variables
Se tiene permitido utilizar cuantas declaraciones de variables sean necesarias para lograr el objetivo del
programa, por ejemplo:
var = 1 balance_cuenta = 1000.0 nombreCliente = 'John Doe' print(var,
balance_cuenta, nombreCliente) print(var)
Sin embargo, no se permite utilizar una variable que no exista, (en otras palabras, una variable a la cual
no se le a dado un valor).
Este ejemplo ocasionara un error:
ar = 1 print(ar)
Se ha tratado de utilizar la variable llamada Var, la cual no tiene ningún valor (nota: var y Var son
entidades diferentes, y no tienen nada en común dentro de Python).
RECUERDA
Se puede utilizar print() para combinar texto con variables utilizando el operador + para mostrar
cadenas con variables, por ejemplo:
var = "3.7.1" print("Versión de Python: " var)
La primer línea del código crea una nueva variable llamada var y le asigna el valor de 1.
La declaración se lee de la siguiente manera: asigna el valor de 1 a una variable llamada var.
La tercera línea le asigna a la misma variable un nuevo valor tomado de la variable misma, sumándole
1. Al ver algo así, un matemático probablemente protestaría, ningún valor puede ser igualado a si mismo
mas uno. Esto es una contradicción. Pero Python trata el signo = no como igual a, sino como asigna un
valor.
Entonces, ¿Cómo se lee esto en un programa?
Toma el valor actual de la variable var, sumale 1 y guárdalo en la variable var.
En efecto, el valor de la variable var ha sido incrementado por uno, lo cual no está relacionado con
comparar la variable con otro valor.
500 - ¿Porque? Bueno, primero, la variable var es creada y se le asigna el valor de 100. Después, a la
misma variable se le asigna un nuevo valor: el resultado de sumarle 200 a 300, lo cual es 500.
Nota: se necesita hacer uso del operador ** para evaluar la raíz cuadrada:
√ (x) = x(½)
y
c = √ a2 + b 2
¿Puedes predecir la salida del código?
Revisa abajo y ejecuta el código en el editor para confirmar tus predicciones.
c = 5.0
LABORATORIO
Tiempo Estimado
10 minutos
Nivel de dificultad
Fácil
Objetivos
• Familiarizarse con el concepto de almacenar y trabajar con diferentes tipos de datos en Python.
• Experimentar con el código en Python.
Escenario
A continuación una historia:
Érase una vez en la Tierra de las Manzanas, Juan tenía tres manzanas, María tenía cinco manzanas, y
Adán tenía seis manzanas. Todos eran muy felices y vivieron por muchísimo tiempo. Fin de la Historia.
Tu tarea es:
Operadores Abreviados
Es tiempo de explicar el siguiente conjunto de operadores que harán la vida del
programador/desarrollador mas fácil.
Muy seguido, se desea utilizar la misma variable al lado derecho y al lado izquierdo del operador =.
Por ejemplo, si se necesita calcular una serie de valores sucesivos de la potencia de 2, se puede usar el
siguiente código:
x = x * 2
También, puedes utilizar una expresión como la siguiente si no puedes dormir y estas tratando de
resolverlo con alguno de los métodos tradicionales:
oveja = oveja + 1
Python ofrece una manera mas corta de escribir operaciones como estas, lo cual se puede codificar de la
siguiente manera:
x 2 oveja 1
A continuación se intenta presentar una descripción general para este tipo de operaciones.
Si op es un operador de dos argumentos (esta es una condición muy imporante) y el operador es utilizado
en el siguiente contexto:
variable = variable expresión
x = x ** 2 ⇒ x 2
LABORATORIO
Tiempo estimado
10 minutos
Nivel de dificultad
Fácil
Objetivos
• Familiarizarse con el concepto de variables y trabajar con ellas.
• Realizar operaciones básicas y conversiones.
• Experimentar con el código de Python.
Escenario
Millas y kilómetros son unidades de longitud o distancia.
Teniendo en mente que 1 equivale aproximadamente a 1.61 kilómetros, complemente el programa en
el editor para que convierta de:
• Millas a kilómetros.
• Kilómetros a millas.
No se debe cambiar el código existente. Escribe tu código en los lugares indicados con ###. Prueba tu
programa con los datos que han sido provistos en el código fuente.
Pon mucha atención a lo que esta ocurriendo dentro de la función print(). Analiza como es que se
proveen múltiples argumentos para la función, y como es que se muestra el resultado.
Nota que algunos de los argumentos dentro de la función print() son cadenas (por ejemplo "millas
son", y otros son variables (por ejemplo millas).
CONSEJO
Hay una cosa interesante mas que esta ocurriendo. ¿Puedes ver otra función dentro de la función
print() ? Es la función round(). Su trabajo es redondear la salida del resultado al numero de
decimales especificados en el paréntesis, y regresar un valor flotante (dentro de la función round() se
puede encontrar el nombre de la variable, el nombre, una coma, y el numero de decimales que se desean
mostrar). Se hablará mas de esta función muy pronto, no te preocupes si no todo queda muy claro. Solo
se quiere impulsar tu curiosidad.
Después de completar el laboratorio , abre Sandbox (el arenero), y experimenta más. Intenta escribir
diferentes convertidores, por ejemplo, un convertidor de USD a EUR, un convertidor de temperatura,
etc. â“ ¡deja que tu imaginación vuele! Intenta mostrar los resultados combinando cadenas y variables.
Intenta utilizar y experimentar con la función round() para redondear tus resultados a uno, dos o tres
decimales. Revisa que es lo que sucede si no se provee un dígito al redondear. Recuerda probar tus
programas.
Experimenta, saca tus propias conclusiones, y aprende. Se curioso.
Resultado Esperado
7.38 millas son 11.88 kilómetros
12.25 kilómetros son 7.61 millas
kilometros = 12.25
millas = 7.38
LABORATORIO
Tiempo Estimado
10-15 minutos
Nivel de Dificultad
Fácil
Objetivos
• Familiarizarse con los conceptos de números, operadores y operaciones aritméticas en Python.
• Realizar cálculos básicos.
Escenario
Observa el código en el editor: lee un valor flotante, lo coloca en una variable llamada x, e imprime
el valor de la variable llamada y. Tu tarea es completar el código para evaluar la siguiente expresión:
3x3 - 2x2 + 3x - 1
El resultado debe ser asignado a y.
Recuerda que la notación algebraica clásica muy seguido omite el operador de multiplicación, aquí se
debe de incluir de manera explicita. Nota como se cambia el tipo de dato para asegurarnos de que x es
del tipo flotante.
Mantén tu código limpio y legible, y pruébalo utilizando los datos que han sido proporcionados. No te
desanimes por no lograrlo en el primer intento. Se persistente y curioso.
Prueba de Datos
Datos de Muestra
x = 0 x = 1 x = -1
Salida Esperada
y = -1.0 y = 3.0 y = -9.0
x=-1.5
x = float(x)
print(x)
y=3*x**3 - 2*x**2 + 3*x - 1
print("y =", y)
Puntos Clave
1. Una variable es una ubicación nombrada reservada para almacenar valores en la memoria. Una
variable es creada o inicializada automáticamente cuando se le asigna un valor por primera vez.
2. Cada variable debe de tener un nombre único - un identificador. Un nombre valido debe ser aquel
que no contiene espacios, debe comenzar con un guion bajo (_), o una letra, y no puede ser una palabra
reservada de Python. El primer carácter puede estar seguido de guiones bajos, letras, y dígitos. Las
variables en Python son sensibles a mayúsculas y minúsculas.
3. Python es un lenguaje de tipo dinámico, lo que significa que no se necesita declarar variables en él.
Para asignar valores a las variables, se utiliza simplemente el operador de asignación, es decir el signo
de igual (=) por ejemplo, var 1.
5. Se les puede asignar valores nuevos a variables ya existentes utilizando el operador de asignación o
un operador abreviado:
var = 2 print(var) var = 3 print(var) var += 1 print(var)
6. Se puede combinar texto con variables empleado el operador +, y utilizar la función print() para
mostrar o imprimir los resultados, por ejemplo:
var = "007" print("Agente " + var)
Ejercicio 1
¿Cuál es el resultado del siguiente fragmento de código?
var = 2 var = 3 print(var)
3
Ejercicio 2
¿Cuáles de los siguientes nombres de variables son ilegales en Python?
my_var m 101 averylongvariablename m101 m 101 Del del
my_var m 101 # incorrecto (comienza con un digito)
averylongvariablename m101 m 101 # incorrecto (contiene un espacio)
Del del # incorrecto (es una palabra clave)
Ejercicio 3
¿Cuál es el resultado del siguiente fragmento de código?
a = '1' b = "1" print(a + b)
11
Ejercicio 4
¿Cuál es el resultado del siguiente fragmento de código?
a = 6 b = 3 a /= 2 * b print(a)
1.0
2 * b = 6
a = 6 → 6 / 6 = 1.0
Los desarrolladores buenos y responsables describen cada pieza importante de código, por ejemplo,
el explicar el rol de una variable; aunque la mejor manera de comentar una variable es dándole un nombre
que no sea ambiguo.
Por ejemplo, si una variable determinada esta diseñada para almacenar el área de un cuadrado, el nombre
areaCuadrado será muchísimo mejor que tiaJuana.
Esto es frecuentemente realizado cuando se esta probando un programa, con el fin de aislar un fragmento
de código donde posiblemente se encuentra un error.
LABORATORIO
Tiempo Estimado
5 minutos
Nivel de Dificultad
Muy Fácil
Objetivos
• Familiarizarse con el concepto de comentarios en Python.
• Utilizar y no utilizar los comentarios.
• Reemplazar los comentarios con código.
• Experimentar con el código de Python.
Escenario
El código en el editor contiene comentarios. Intenta mejorarlo: agrega o quita comentarios donde
consideres que sea apropiado (en ocasiones el remover un comentario lo hace mas legible), además,
cambia el nombre de las variables donde consideres que esto mejorará la comprensión del código.
NOTA
Los comentarios son muy importantes. No solo hacen que el programa sea más fácil de entender, pero
también sirven para deshabilitar aquellas partes de código que no son necesarias (por ejemplo, cuando
se necesita probar cierta parte del código, e ignorar el resto). Los buenos programadores describen cada
parte importante del código, y dan nombres significativos a variables, debido a que en ocasiones es
mucho más sencillo dejar el comentario dentro del código mismo.
Es bueno utilizar nombres de variables legibles, y en ocasiones es mejor dividir el código en partes con
nombres (por ejemplo en funciones). En algunas situaciones, es una buena idea escribir los pasos de
como se realizaron los cálculos de una forma sencilla y clara.
Una cosa mas: puede ocurrir que un comentario contenga una pieza de información incorrecta o errónea,
nunca se debe de hacer eso a propósito.
Puntos Clave
1. Los comentarios pueden ser utilizados para colocar información adicional en el código. Son omitidos
al momento de la ejecución. Dicha información es para los lectores que están manipulando el código. En
Python, un comentario es un fragmento de texto que comienza con un #. El comentario se extiende hasta
el final de la línea.
2. Si deseas colocar un comentario que abarque varias líneas, es necesario colocar un # al inicio de cada
línea. Además, se puede utilizar un comentario para marcar un fragmento de código que no es necesaria
en el momento y no se desea ejecutar. (observa la ultima línea de código del siguiente fragmento), por
ejemplo:
print("Hola!")
3. Cuando sea posible, se deben auto comentar los nombres de las variables, por ejemplo, si se están
utilizando dos variables para almacenar la altura y longitud de algo, los nombres altura y longitud
son una mejor elección que mivar1 y mivar2.
4. Es importante utilizar los comentarios para que los programas sean más fáciles de entender, además
de emplear variables legibles y significativas en el código. Sin embargo, es igualmente importante no
utilizar nombres de variables que sean confusos, o dejar comentarios que contengan información
incorrecta.
5. Los comentarios pueden ser muy útiles cuando tu estas leyendo tu propio código después de un tiempo
(es común que los desarrolladores olviden lo que su propio código hace), y cuando otros están leyendo
tu código (les puede ayudar a comprender que es lo que hacen tus programas y como es que lo hacen).
Ejercicio 1
¿Cuál es la salida del siguiente fragmento de código?
# print("Cadena #1") print("Cadena #2")
Cadena #2
Ejercicio 2
¿Qué ocurrirá cuando se ejecute el siguiente código?
# Esto es un comentario en varias líneas # print("Hola!")
SyntaxError: invalid syntax
La función input()
Ahora se introducirá una nueva función, la cual pareciese ser un reflejo de la función print().
La función input() es capaz de leer datos que fueron introducidos por el usuario y pasar esos datos al
programa en ejecución.
El programa entonces puede manipular los datos, haciendo que el código sea verdaderamente interactivo.
Todos los programas leen y procesan datos. Un programa que no obtiene datos de entrada del usuario
es un programa sordo.
Observa el ejemplo:
print("Dime algo...") algo = input() print("Mmm...", algo, "...¿en
serio?")
Nota:
• El programa solicita al usuario que inserte algún dato desde la consola (seguramente utilizando
el teclado, aunque también es posible introducir datos utilizando la voz o alguna imagen).
• La función input() es invocada sin argumentos (es la manera mas sencilla de utilizar la
función); la función pondrá la consola en modo de entrada; aparecerá un cursor que parpadea,
y podrás introducir datos con el teclado, al terminar presiona la tecla Enter; todos los datos
introducidos serán enviados al programa a través del resultado de la función.
• Nota: el resultado debe ser asignado a una variable; esto es crucial, si no se hace los datos
introducidos se perderán.
• Después se utiliza la función print() para mostrar los datos que se obtuvieron, con algunas
observaciones adicionales.
Intenta ejecutar el código y permite que la función te muestre lo que puede hacer.
Nota:
• La función input() al ser invocada con un argumento, contiene una cadena con un mensaje.
• El mensaje será mostrado en consola antes de que el usuario tenga oportunidad de escribir algo.
• Después de esto input() hará su trabajo.
Esta variante de la invocación de la función input() simplifica el código y lo hace más claro.
Una cadena que contiene todos los caracteres que el usuario introduce desde el teclado. No es un entero
ni un flotante.
Esto significa que no se debe utilizar como un argumento para operaciones matemáticas, por
ejemplo, no se pueden utilizar estos datos para elevarlos al cuadrado, para dividirlos entre algo o por
algo.
cualquierNumero = input("Inserta un número: ") algo = cualquierNumero
** 2.0 print(cualquierNumero, "al cuadrado es", algo)
La última línea lo explica todo, se intentó aplicar el operador ** a 'str' (una cadena) acompañado por
un 'float' (valor flotante).
• La función int() toma un argumento (por ejemplo, una cadena: int(string)) e intenta
convertirlo a un valor entero; si llegase a fallar, el programa entero fallará también (existe una
manera de solucionar esto, se explicará mas adelante).
• La función float() toma un argumento (por ejemplo, una cadena: float(string)) e
intenta convertirlo a flotante (el resto es lo mismo).
Esto es muy simple y muy efectivo. Sin embargo, estas funciones se pueden invocar directamente
pasando el resultado de la función input() directamente. No hay necesidad de emplear variables como
almacenamiento intermedio.
Se ha implementado esta idea en el editor, observa el código.
¿Puedes imaginar como la cadena introducida por el usuario fluye desde la función input() hacía la
función print()?
Eventualmente serás capaz de escribir programas completos, los cuales acepten datos en forma de
números, los cuales serán procesados y se mostrarán los resultados.
Por supuesto, estos programas serán muy primitivos y no muy utilizables, debido a que no pueden tomar
decisiones, y consecuentemente no son capaces de reaccionar acorde a cada situación.
Sin embargo, esto no es un problema; se explicará como solucionarlo pronto.
El siguiente ejemplo hace referencia al programa anterior que calcula la longitud de la hipotenusa. Vamos
a reescribirlo, para que pueda leer las longitudes de los catetos desde la consola.
Revisa la ventana del editor, así es como se ve ahora.
Este programa le preguntó al usuario los dos catetos, calcula la hipotenusa e imprime el resultado.
Ejecútalo de nuevo e intenta introducir valores negativos.
El programa desafortunadamente, no reacciona correctamente a este error.
Vamos a ignorar esto por ahora. Regresaremos a ello pronto.
Debido a que la función print() acepta una expresión como argumento, se puede quitar la variable
del código.
Como se muestra en el siguiente código:
cateto_a = float(input("Inserta la longitud del primer cateto: "))
cateto_b = float(input("Inserta la longitud del segundo cateto "))
print("La longitud de la hipotenusa es: ", (cateto_a**2 + cateto_b**2)
** .5)
Operadores de cadenas -
introducción
Es tiempo de regresar a estos dos operadores aritméticos: + y *.
Ambos tienen una función secundaría. Son capaces de hacer algo más que sumar y multiplicar.
Los hemos visto en acción cuando sus argumentos son (flotantes o enteros).
Ahora veremos que son capaces también de manejar o manipular cadenas, aunque, en una manera muy
específica.
Concatenación
El sigo de + (más), al ser aplicado a dos cadenas, se convierte en un operador de concatenación:
string + string
Simplemente concatena (junta) dos cadenas en una. Además, puede ser utilizado más de una vez en una
misma expresión.
En contraste con el operador aritmético, el operador de concatenación no es conmutativo, por ejemplo,
"ab" + "ba" no es lo mismo que "ba" + "ab".
No olvides, si se desea que el signo + sea un concatenador, no un sumador, solo se debe asegurar que
ambos argumentos sean cadenas.
No se pueden mezclar los tipos de datos aquí.
Este es un programa sencillo que muestra como funciona el signo + como concatenador:
nom = input("¿Me puedes dar tu nombre por favor? ") ape = input("¿Me
puedes dar tu apellido por favor? ") print("Gracias.") print("\nTu
nombre es " + nom + " " + ape + ".")
Nota: El utilizar + para concatenar cadenas te permite construir la salida de una manera más precisa, en
comparación de utilizar únicamente la función print(), aún cuando se enriquezca con los argumentos
end= y sep=.
Replicación
El signo de * (asterisco), cuando es aplicado a una cadena y a un número (o a un número y cadena) se
convierte en un operador de replicación.
cadena * número número * cadena
RECUERDA
Un número menor o igual que cero produce una cadena vacía.
Este sencillo programa "dibuja" un rectángulo, haciendo uso del operador (+), pero en un nuevo rol:
print("+" + 10 * "-" + "+") print(("|" + " " * 10 + "|\n") * 5, end="")
print("+" + 10 * "-" + "+")
Nota como se ha utilizado el paréntesis en la segunda línea de código.
¡Intenta practicar para crear otras figuras o tus propias obras de arte!
Sinceramente, puede hacer mucho más que transformar números en cadenas, eso lo veremos después.
Se ha modificado un poco para mostrar cómo es que la función str() trabaja. Gracias a esto, podemos
pasar el resultado entero a la función print() como una sola cadena, sin utilizar las comas.
Tiempo Estimado
5-10 minutos
Nivel de Dificultad
Fácil
Objetivos
• Familiarizarse con la entrada y salida de datos en Python.
• Evaluar expresiones simples.
Escenario
La tarea es completar el código para evaluar y mostrar el resultado de cuatro operaciones aritméticas
básicas.
El resultado debe ser mostrado en consola.
Quizá no podrás proteger el código de un usuario que intente dividir entre cero. Por ahora, no hay que
preocuparse por ello.
Prueba tu código - ¿Produce los resultados esperados?
a = float(input("Ingresa el primer valor: "))
b = float(input("Ingresa el segundo valor: "))
print("Suma:", a + b)
print("Resta:", a - b)
print("Multiplicación:", a * b)
print("División:", a / b)
print("\n¡Eso es todo, amigos!")
LABORATORIO
Tiempo estimado
20 minutos
Nivel de dificultad
Intermedio
Objetivos
• Familiarizarse con los conceptos de números, operadores y expresiones aritméticas en Python.
• Comprender la precedencia y asociatividad de los operadores de Python, así como el correcto uso
de los paréntesis.
Escenario
La tarea es completar el código para poder evaluar la siguiente expresión:
El resultado debe de ser asignado a y. Se cauteloso, observa los operadores y priorízalos. Utiliza cuantos
paréntesis sean necesarios.
Puedes utilizar variables adicionales para acortar la expresión (sin embargo, no es muy necesario). Prueba
tu código cuidadosamente.
Datos de Prueba
Entrada de muestra: 1
Salida esperada:
y = 0.6000000000000001
Entrada de muestra: 10
Salida esperada:
y = 0.09901951266867294
Salida esperada:
y = 0.009999000199950014
Entrada de muestra: -5
Salida esperada:
y = -0.19258202567760344
x = float(input("Ingresa un valor para x: "))
y = 1./(x + 1./(x + 1./(x + 1./x)))
print("y =", y)
LABORATORIO
Tiempo estimado
15-20 minutos
Nivel de dificultad
Fácil
Objetivos
• Mejorar la habilidad de implementar números, operadores y operaciones aritméticas en Python.
• Utilizar la función print() y sus capacidades de formateo.
• Aprender a expresar fenómenos del día a día en términos de un lenguaje de programación.
Escenario
La tarea es preparar un código simple para evaluar o encontrar el tiempo final de un periodo de tiempo
dado, expresándolo en horas y minutos. Las horas van de 0 a 23 y los minutes de 0 a 59. El resultado
debe ser mostrado en la consola.
Por ejemplo, si el evento comienza a las 12:17 y dura 59 minutos, terminará a las 13:16.
No te preocupes si tu código no es perfecto, está bien si acepta una hora invalida, lo más importante es
que el código produzca una salida correcta acorde a la entrada dada.
Prueba el código cuidadosamente. Pista: utilizar el operador % puede ser clave para el éxito.
Datos de Prueba
Entrada de muestra: 12 17 59
Puntos Clave
1. La función print() envía datos a la consola, mientras que la función input() obtiene datos de
la consola.
2. La función input() viene con un parámetro inicial: un mensaje de tipo cadena para el usuario.
Permite escribir un mensaje antes de la entrada del usuario, por ejemplo:
nombre = input() print("Hola, " + nombre + ". ¡Un gusto conocerte!")
3. Cuando la función input() es llamada o invocada, el flujo del programa se detiene, el símbolo del
cursor se mantiene parpadeando (le está indicando al usuario que tome acción ya que la consola está en
modo de entrada) hasta que el usuario haya ingresado un dato y/o haya presionado la tecla Enter.
NOTA
Puedes probar la funcionalidad completa de la función input() localmente en tu máquina. Por razones
de optimización, se ha limitado el máximo número de ejecuciones en Edube a solo algunos segundos
únicamente. Ve a Sandbox, copia y pega el código que está arriba, ejecuta el programa y espera unos
segundos. Tu programa debe detenerse después de unos segundos. Ahora abre IDLE, y ejecuta el mismo
programa ahí -¿Puedes notar alguna diferencia?
Consejo: La característica mencionada anteriormente de la función input() puede ser utilizada para
pedirle al usuario que termine o finalice el programa. Observa el siguiente código:
nombre = input("Ingresa tu nombre: ") print("Hola, " + nombre + ". ¡Un
gusto conocerte!") print("\nPresiona la tecla Enter para finalizar el
programa.") input() print("FIN.")
3. El resultado de la función input() es una cadena. Se pueden unir cadenas unas con otras a través
del operador de concatenación (+). Observa el siguiente código:
num1 = input("Ingresa el primer número: ") # Ingresa 12 num2 =
input("Ingresa el segundo número: ") # Ingresa 21 print(num1 + num2)
# el programa regresa 1221
Ejercicio 2
¿Cuál es la salida esperada del siguiente código?
x = input("Ingresa un número: ") # el usuario ingresa un 2
print(type(x))
<class 'str'>
¡Bien hecho! Has llegado al final del Módulo 2 y has completado un paso importante en tu educación de
programación en Python. Aquí hay un breve resumen de los objetivos que has cubierto y con los que te
has familiarizado en el Módulo 2:
• Los métodos básicos de formateo y salida de datos ofrecidos por Python, junto con los tipos
principales de datos y operadores numéricos, sus relaciones mutuas y enlaces.
• El concepto de variables y la manera correcta de darles nombre.
• El operador de asignación, las reglas que rigen la construcción de expresiones.
• La entrada y conversión de datos.
Ahora estás listo para tomar el cuestionario del módulo e intentar el desafío final: La Prueba del Módulo
2, que te ayudará a evaluar lo que has aprendido hasta ahora.
Fundamentos de Programación en
Python: Módulo 3
Preguntas y respuestas
• Si, es cierto.
• No, esto es falso.
Nunca obtendrás una respuesta como Déjame pensar ..., no lo sé, o probablemente sí, pero no lo sé con
seguridad.
Para hacer preguntas, Python utiliza un conjunto de operadores muy especiales. Revisemos uno
tras otro, ilustrando sus efectos en algunos ejemplos simples.
Es un operador binario con enlazado a la izquierda. Necesita dos argumentos y verifica si son iguales.
Ejercicios
True (verdadero) - por supuesto, 2 es igual a 2. Python responderá True (Recuerda este par de
literales predefinidos, True y False - También son palabras clave de Python).
Esta pregunta no es tan fácil como la primera. Por suerte, Python es capaz de convertir el valor entero en
su equivalente real, y en consecuencia, la respuesta es True
Esto debería ser fácil. La respuesta será (o mejor dicho, siempre es) False.
Ten en cuenta que no podemos encontrar la respuesta si no sabemos qué valor está almacenado
actualmente en la variable (var).
Si la variable se ha cambiado muchas veces durante la ejecución del programa, o si se ingresa su valor
inicial desde la consola, Python solo puede responder a esta pregunta en el tiempo de ejecución del
programa.
Ahora imagina a un programador que sufre de insomnio, y tiene que contar las ovejas negras y blancas
por separado siempre y cuando haya exactamente el doble de ovejas negras que de las blancas.
La pregunta será la siguiente:
ovejasNegras 2 * ovejasBlancas
Debido a la baja prioridad de el operador == ,la pregunta será tratada como la siguiente:
ovejasNegras (2 * ovejaBlancas)
Entonces, vamos a practicar la comprensión del operador == - ¿Puedes adivinar la salida del código a
continuación?
var = 0 # asignando 0 a var print(var 0) var = 1 # asignando 1 a var
print(var 0)
También se puede hacer una pregunta de comparación usando el operador > (mayor que).
Si deseas saber si hay más ovejas negras que blancas, puedes escribirlo de la siguiente manera:
ovejasNegras ovejasBlancas # mayor que.
El operador mayor que tiene otra variante especial, una variante no estricta, pero se denota de manera
diferente que la notación aritmética clásica: >= (mayor o igual que).
Si queremos saber si tenemos que usar un gorro o no, nos hacemos la siguiente pregunta:
centigradosAfuera 0.0 # mayor o igual a.
Como probablemente ya hayas adivinado, los operadores utilizados en este caso son: El operador <
(menor que) y su hermano no estricto: <= (menor o igual que).
Vamos a comprobar si existe un riesgo de ser multados (la primera pregunta es estricta, la segunda no).
¿Qué puedes hacer con la respuesta (es decir, el resultado de una operación de comparación) que se
obtiene de la computadora?
Hay al menos dos posibilidades: primero, puedes memorizarlo (almacenarlo en una variable) y
utilizarlo más tarde. ¿Cómo haces eso? Bueno, utilizarías una variable arbitraria como esta:
= numerodeLeones >= numerodeLeonas
La segunda posibilidad es más conveniente y mucho más común: puedes utilizar la respuesta que
obtengas para tomar una decisión sobre el futuro del programa.
Necesitas una instrucción especial para este propósito, y la discutiremos muy pronto.
Ahora necesitamos actualizar nuestra tabla de prioridades , y poner todos los nuevos operadores en
ella. Ahora se ve como a continuación:
Prioridad Operador
1 +, - unario
2 **
3 *, /, %
4 +, - binario
5 <, <=, >, >=
6 ==, !=
LABORATORIO
Tiempo Estimado
5 minutos
Nivel de dificultad
Muy Fácil
Objetivos
• Familiarizarse con la función input().
• Familiarizarse con los operadores de comparación en Python.
Escenario
Usando uno de los operadores de comparación en Python, escribe un programa simple de dos líneas que
tome el parámetro n como entrada, que es un entero, e imprime False si n es menor que 100, y True
si n es mayor o igual que 100.
No debes crear ningún bloque if (hablaremos de ellos muy pronto). Prueba tu código usando los datos
que te proporcionamos.
Datos de prueba
Ejemplo de entrada: 55
Ejemplo de entrada: 99
Resultado esperado: False
Ejemplo de entrada: -5
Ya sabes como hacer preguntas a Python, pero aún no sabes como hacer un uso razonable de las
respuestas. Se debe tener un mecanismo que le permita hacer algo si se cumple una condición, y no
hacerlo si no se cumple.
Es como en la vida real: haces ciertas cosas o no cuando se cumple una condición específica, por ejemplo,
sales a caminar si el clima es bueno, o te quedas en casa si está húmedo y frío.
Para tomar tales decisiones, Python ofrece una instrucción especial. Debido a su naturaleza y su
aplicación, se denomina instrucción condicional (o declaración condicional).
Existen varias variantes de la misma. Comenzaremos con la más simple, aumentando la dificultad
lentamente.
La primera forma de una declaración condicional, que puede ver a continuación, está escrita de manera
muy informal pero figurada:
cierto_o_no: hacer_esto_si_cierto
Esta declaración condicional consta de los siguientes elementos, estrictamente necesarios en este orden:
Como puedes ver, almorzar no es una actividad condicional y no depende del clima.
Sabiendo que condiciones influyen en nuestro comportamiento y asumiendo que tenemos las funciones
sin parámetros irACaminar() y almorzar(), podemos escribir el siguiente fragmento de código:
if ClimaEsBueno: irAcaminar() almorzar()
Ejecución condicional: La
declaración if
Si un determinado desarrollador de Python sin dormir se queda dormido cuando cuenta 120 ovejas, y el
procedimiento de inducción del sueño se puede implementar como una función especial llamada
dormirSoñar(), todo el código toma la siguiente forma:
if contadordeOvejas >= 120: #evalúa una expresión de prueba.
dormirSoñar() #se ejecuta si la expresión de prueba es Verdadera.
Puedes leerlo como sigue: si contadorOvejas es mayor o igual que 120, entonces duerme y sueña
(es decir, ejecuta la función duermeSueña.)
Hemos dicho que las declaraciones condicionales deben tener sangría. Esto crea una estructura muy
legible, demostrando claramente todas las rutas de ejecución posibles en el código.
Echa un vistazo al siguiente código:
if contadorOvejas >= 120: hacerCama() tomarDucha() dormirSoñar()
alimentarPerros()
Como puedes ver, tender la cama, tomar una ducha y dormir y soñar se ejecutan condicionalmente,
cuando contadorOvejas alcanza el límite deseado.
Alimentar a los perros, sin embargo, siempre se hace (es decir, la función alimentarPerros no
tiene sangría y no pertenece al bloque if, lo que significa que siempre se ejecuta).
Ahora vamos a discutir otra variante de la declaración condicional, que también permite realizar una
acción adicional cuando no se cumple la condición.
Por lo tanto, hay una nueva palabra: else - esta es una palabra reservada.
La parte del código que comienza con else dice que hacer si no se cumple la condición especificada
por el if (observa los dos puntos después de la palabra).
Lee lo que hemos planeado para este domingo. Si hay buen clima, saldremos a caminar. Si encontramos
un buen restaurante, almorzaremos allí. De lo contrario, vamos a comer un sandwich. Si hay mal clima,
iremos al cine. Si no hay boletos, iremos de compras al centro comercial más cercano.
Escribamos lo mismo en Python. Considera cuidadosamente el código aquí:
if climaEsBueno: else:
• Este uso de la declaraciónif se conoce como anidamiento; recuerda que cada else se refiere
al if que se encuentra en el mismo nivel de sangría; se necesita saber esto para determinar cómo
se relacionan los ifs y los elses.
• Considera como la sangría mejora la legibilidad y hace que el código sea más fácil de entender
y rastrear.
La declaración elif
El segundo caso especial presenta otra nueva palabra clave de Python: elif. Como probablemente
sospechas, es una forma más corta de else-if.
elif se usa para verificar más de una condición, y para detener cuando se encuentra la primera
declaración verdadera.
Nuestro siguiente ejemplo se parece a la anidación, pero las similitudes son muy leves. Nuevamente,
cambiaremos nuestros planes y los expresaremos de la siguiente manera: si hay buen clima, saldremos a
caminar, de lo contrario, si obtenemos entradas, iremos al cine, de lo contrario, si hay mesas libres en el
restaurante, vamos a almorzar; si todo falla, regresaremos a casa y jugaremos ajedrez.
¿Has notado cuantas veces hemos usado la palabra de lo contrario? Esta es la etapa en la que la palabra
clave elif desempeña su función.
Esto puede sonar un poco desconcertante, pero ojalá que algunos ejemplos simples ayuden a
comprenderlo mejor.
El fragmento de código anterior debe estar claro: lee dos valores enteros, los compara y encuentra cuál
es el más grande.
Ejemplo 2:
Ahora vamos a mostrarte un hecho intrigante. Python tiene una característica interesante, mira el código
a continuación:
#lee dos números numero1 = int (input("Ingresa el primer número:"))
numero2 = int (input("Ingresa el segundo número:")) # elegir el número
más grande if numero1 > numero2: nmasGrande = numero1 else: nmasGrande
= numero2 #imprimir el resultado print("El número más grande es: ",
nmasGrande)
Nota: si alguna de las ramas de if-elif-else contiene una sola instrucción, puedes codificarla de forma más
completa (no es necesario que aparezca una línea con sangría después de la palabra clave), pero solo
continúa la línea después de los dos puntos).
Sin embargo, este estilo puede ser engañoso, y no lo vamos a usar en nuestros programas futuros, pero
definitivamente vale la pena saber si quieres leer y entender los programas de otra persona.
No hay otras diferencias en el código.
Ejemplo 3:
Es hora de complicar el código: encontremos el mayor de los tres números. ¿Se ampliará el código? Un
poco.
Suponemos que el primer valor es el más grande. Luego verificamos esta hipótesis con los dos valores
restantes.
Observa el siguiente código:
#lee tres números numero1 = int (input("Ingresa el primer número:"))
numero2 = int (input("Ingresa el segundo número:")) numero3 = int
(input("Ingresa el tercer número:")) #asumimos temporalmente que el
primer número #es el más grande #lo verificaremos pronto nmasGrande =
numero1 #comprobamos si el segundo número es más grande que el mayor
número actual #y actualiza el número más grande si es necesario if
numero2 > nmasGrande: nmasGrande = numero2 #comprobamos si el
tercer número es más grande que el mayor número actual #y actualiza el
número más grande si es necesario if numero3 >
nmasGrande: nmasGrande = numero3 #imprimir el resultado print("El
número más grande es:", nmasGrande)
Este método es significativamente más simple que tratar de encontrar el número más grande comparando
todos los pares de números posibles (es decir, el primero con el segundo, el segundo con el tercero y el
tercero con el primero). Intenta reconstruir el código por ti mismo.
En segundo lugar, asumimos que nuestro algoritmo no sabrá por adelantado cuántos números se
entregarán al programa. Esperamos que el usuario ingrese todos los números que desee; el algoritmo
funcionará bien con cien y con mil números. ¿Cómo hacemos eso?
Hacemos un trato con el usuario: cuando se ingresa el valor-1, será una señal de que no hay más datos
y que el programa debe finalizar su trabajo.
De lo contrario, si el valor ingresado no es igual a -1, el programa leerá otro número, y así sucesivamente.
El truco se basa en la suposición de que cualquier parte del código se puede realizar más de una vez,
precisamente, tantas veces como sea necesario.
La ejecución de una determinada parte del código más de una vez se denomina bucle. El significado de
este término es probablemente obvio para ti.
Las líneas 02 a 08 forman un bucle. Los pasaremos tantas veces como sea necesario para revisar todos
los valores ingresados.
¿Puedes usar una estructura similar en un programa escrito en Python? Si, si puedes.
Información Adicional
Python a menudo viene con muchas funciones integradas que harán el trabajo por ti. Por ejemplo, para
encontrar el número más grande de todos, puede usar una función incorporada de Python llamada
max(). Puedes usarlo con múltiples argumentos. Analiza el código de abajo:
# lee tres números numero1 = int(input("Ingresa el primer número:"))
numero2 = int(input("Ingresa el segundo número:")) numero3 =
int(input("Ingresa el tercer número:")) # verifica cuál de los números
es el mayor # y pásalo a la variable de mayor número numeroMayor =
(numero1,numero2,numero3) # imprimir el resultado print("El número más
grande es:", numeroMayor)
De la misma manera, puedes usar la función min() para devolver el número más bajo. Puedes
reconstruir el código anterior y experimentar con él en el Sandbox.
Vamos a hablar sobre estas (y muchas otras) funciones pronto. Por el momento, nuestro enfoque se
centrará en la ejecución condicional y los bucles para permitirte ganar más confianza en la programación
y enseñarte las habilidades que te permitirán comprender y aplicar los dos conceptos en tu codigo.
Entonces, por ahora, no estamos tomando atajos.
LABORATORIO
Tiempo estimado
5-10 minutos
Nivel de dificultad
Fácil
Objetivos
• Familiarizarse con la función input().
• Familiarizarse con los operadores de comparación en Python.
• Familiarizarse con el concepto de ejecución condicional.
Escenario
Espatifilo, más comúnmente conocida como la planta de Cuna de Moisés o flor de la paz, es una de las
plantas para interiores más populares que filtra las toxinas dañinas del aire. Algunas de las toxinas que
neutraliza incluyen benceno, formaldehído y amoníaco.
Imagina que tu programa de computadora ama estas plantas. Cada vez que recibe una entrada en forma
de la palabra Espatifilo, grita involuntariamente a la consola la siguiente cadena: "¡Espatifilo
es la mejor planta de todas!"
Escribe un programa que utilice el concepto de ejecución condicional, tome una cadena como entrada y
que:
Prueba tu código con los datos que te proporcionamos. ¡Y hazte de un Espatifilo también!
Datos de prueba
Entrada de muestra: espatifilo
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil/Medio
Objetivos
Familiarizar al estudiante con:
Escenario
Érase una vez una tierra - una tierra de leche y miel, habitada por gente feliz y próspera. La gente pagaba
impuestos, por supuesto, su felicidad tenía límites. El impuesto más importante, denominado Impuesto
Personal de Ingresos (IPI, para abreviar) tenía que pagarse una vez al año y se evaluó utilizando la
siguiente regla:
• Si el ingreso del ciudadano no era superior a 85,528 pesos, el impuesto era igual al 18% del
ingreso menos 556 pesos y 2 centavos (esta fue la llamada exención fiscal ).
• Si el ingreso era superior a esta cantidad, el impuesto era igual a 14,839 pesos y 2 centavos, más
el 32% del excedente sobre 85,528 pesos.
Tu tarea es escribir una calculadora de impuestos.
Datos de prueba
Entrada de muestra: 10000
LABORATORIO
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil/Medio
Objetivos
Familiarizar al estudiante con:
Escenario
Como seguramente sabrás, debido a algunas razones astronómicas, el año pueden ser bisiesto o común .
Los primeros tienen una duración de 366 días, mientras que los últimos tienen una duración de 365 días.
Desde la introducción del calendario gregoriano (en 1582), se utiliza la siguiente regla para determinar
el tipo de año:
Datos de prueba
Entrada de muestra: 2000
Puntos clave
1. Los operadores de comparación (o también denominados relacionales) se utilizan para comparar
valores. La siguiente tabla ilustra cómo funcionan los operadores de comparación, asumiendo que x=0,
y=1 y z=0:
2. Cuando desea ejecutar algún código solo si se cumple una determinada condición, puede usar una
declaración condicional:
Ejercicio 1
¿Cuál es la salida del siguiente fragmento de código?
x = 5
y = 10
z = 8
print(x > y)
print(y > z)
False True
Ejercicio 2
¿Cuál es la salida del siguiente fragmento de código?
x, y, z = 5, 10, 8
print(x > z)
print((y - 5) == x)
False True
Ejercicio 3
¿Cuál es la salida del siguiente fragmento de código?
x, y, z = 5, 10, 8
x, y, z = z, y, x
print(x > z)
print((y - 5) == x)
True False
Ejercicio 4
¿Cuál es la salida del siguiente fragmento de código?
x = 10
if x == 10:
print(x == 10)
if x > 5:
print(x > 5)
if x < 10:
print(x < 10)
else:
print("else")
True True else
Ejercicio 5
¿Cuál es la salida del siguiente fragmento de código?
x = "1"
if x == 1:
print("uno")
elif x == "1":
if int (x)> 1:
print("dos")
elif int (x) < 1:
print("tres")
else:
print("cuatro")
if int (x) == 1:
print("cinco")
else:
print("seis")
cuatro cinco
Ejercicio 6
¿Cuál es la salida del siguiente fragmento de código?
x = 1 y = 1.0 z = "1"
if x == y:
print("uno")
if y == int (z):
print("dos") elif x == y:
print("tres")
else:
print("cuatro")
uno dos
Si observas algunas similitudes con la instrucción if, está bien. De hecho, la diferencia sintáctica es solo
una: usa la palabra while en lugar de la palabra if.
La diferencia semántica es más importante: cuando se cumple la condición, if realiza sus declaraciones
sólo una vez; while repite la ejecución siempre que la condición se evalúe como True.
Nota: todas las reglas relacionadas con sangría también se aplican aquí. Te mostraremos esto pronto.
• Si deseas ejecutar más de una declaración dentro de un while, debes (como con if) poner
sangría a todas las instrucciones de la misma manera.
• Una instrucción o conjunto de instrucciones ejecutadas dentro del while se llama el cuerpo del
ciclo.
• Si la condición es False (igual a cero) tan pronto como se compruebe por primera vez, el cuerpo
no se ejecuta ni una sola vez (ten en cuenta la analogía de no tener que hacer nada si no hay nada
que hacer).
• El cuerpo debe poder cambiar el valor de la condición, porque si la condición es True al
principio, el cuerpo podría funcionar continuamente hasta el infinito. Observa que hacer una cosa
generalmente disminuye la cantidad de cosas por hacer.
Si deseas obtener la mejor experiencia de aprendizaje al ver cómo se comporta un ciclo infinito, inicia
IDLE, cree un Nuevo archivo, copia y pega el código anterior, guarda tu archivo y ejecuta el programa.
Lo que verás es la secuencia interminable de cadenas impresas de "Estoy atrapado dentro de
un ciclo". En la ventana de la consola de Python. Para finalizar tu programa, simplemente presiona
Ctrl-C (o Ctrl-Break en algunas computadoras). Esto provocará la excepción KeyboardInterrupt
y permitirá que tu programa salga del ciclo. Hablaremos de ello más adelante en el curso.
Volvamos al bosquejo del algoritmo que te mostramos recientemente. Te mostraremos como usar este
ciclo recién aprendido para encontrar el número más grande de un gran conjunto de datos ingresados.
Analiza el programa cuidadosamente. Localiza el cuerpo del ciclo y descubre como se sale del cuerpo:
# Almacenaremos el número más grande actual aquí
numero Mayor = -999999999
# Ingresa el primer valor
numero = int(input ("Introduzca un número o escriba -1 para detener:"))
# Si el número no es igual a -1, continuaremos
while numero != 1:
# ¿Es el número más grande que el número más grande?
if numero > numeroMayor:
# Sí si, actualiza el mayor númeroNúmero
numeroMayor = numero
# Ingresa el siguiente número
numero = int (input("Introduce un número o escribe -1 para detener:"))
# Imprimir el número más grande
print("El número más grande es:", numeroMayor)
Comprueba como este código implementa el algoritmo que te mostramos anteriormente.
La condición que verifica si un número es impar también puede codificarse en estas formas equivalentes:
if numero % 2 == 1: e if numero % 2:
Este código está destinado a imprimir la cadena "Dentro del ciclo" y el valor almacenado en la
variable contador durante un ciclo dado exactamente cinco veces. Una vez que la condición se haya
cumplido (la variable contador ha alcanzado 0), se sale del ciclo y aparece el mensaje "Fuera del
ciclo". así como el valor almacenado en contador se imprime.
Pero hay una cosa que se puede escribir de forma más compacta: la condición del ciclo while.
¿Es más compacto que antes? Un poco. ¿Es más legible? Eso es discutible.
RECUERDA
No te sientas obligado a codificar tus programas de una manera que siempre sea la más corta y la más
compacta. La legibilidad puede ser un factor más importante. Manten tu código listo para un nuevo
programador.
LABORATORIO
Tiempo estimado
15 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
Escenario
Un mago junior ha elegido un número secreto. Lo ha escondido en una variable llamada
númeroSecreto. Quiere que todos los que ejecutan su programa jueguen el juego Adivina el número
secreto, y adivina qué número ha elegido para ellos. ¡Quienes no adivinen el número quedarán atrapados
en un ciclo sin fin para siempre! Desafortunadamente, él no sabe cómo completar el código.
Tu tarea es ayudar al mago a completar el código en el editor de tal manera que el código:
• Pedirá al usuario que ingrese un número entero.
• Utilizará un ciclo while.
• Comprobará si el número ingresado por el usuario es el mismo que el número escogido por el
mago. Si el número elegido por el usuario es diferente al número secreto del mago, el usuario
debería ver el mensaje "¡Ja, ja! ¡Estás atrapado en mi ciclo!" y se le solicitará
que ingrese un número nuevamente. Si el número ingresado por el usuario coincide con el número
escogido por el mago, el número debe imprimirse en la pantalla, y el mago debe decir las
siguientes palabras: "¡Bien hecho, muggle! Eres libre ahora".
INFO EXTRA
Por cierto, mira la función print(). La forma en que lo hemos utilizado aquí se llama impresión
multilínea . Puede utilizar comillas triples para imprimir cadenas en varias líneas para facilitar la lectura
del texto o crear un diseño especial basado en texto. Experimenta con ello.
numeroSecreto = 777
print(
"""
+==================================+
| Bienvenido a mi juego, muggle! |
| Introduce un número entero |
| y adivina qué número he |
| elegido para ti. |
| Entonces, |
| ¿Cuál es el número secreto? |
+==================================+
""")
Sería bueno si alguien pudiera hacer esta cuenta aburrida por ti. ¿Es eso posible?
Por supuesto que lo es, hay un ciclo especial para este tipo de tareas, y se llama for.
En realidad, el ciclo for está diseñado para realizar tareas más complicadas, puede "explorar" grandes
colecciones de datos elemento por elemento. Te mostraremos como hacerlo pronto, pero ahora
presentaremos una variante más sencilla de su aplicación.
• La palabra reservada for abre el ciclo for; nota - No hay condición después de eso; no tienes que
pensar en las condiciones, ya que se verifican internamente, sin ninguna intervención.
• Cualquier variable después de la palabra reservada for es la variable de control del ciclo; cuenta
los giros del ciclo y lo hace automáticamente.
• La palabra reservada in introduce un elemento de sintaxis que describe el rango de valores
posibles que se asignan a la variable de control.
• La función range() (esta es una función muy especial) es responsable de generar todos los
valores deseados de la variable de control; en nuestro ejemplo, la función creará (incluso podemos
decir que alimentará el ciclo con) valores subsiguientes del siguiente conjunto: 0, 1, 2 .. 97, 98,
99; nota: en este caso, la función range() comienza su trabajo desde 0 y lo finaliza un paso (un
número entero) antes del valor de su argumento.
• Nota la palabra clave pass dentro del cuerpo del ciclo - no hace nada en absoluto; es una
instrucción vacía : la colocamos aquí porque la sintaxis del ciclo for exige al menos una
instrucción dentro del cuerpo (por cierto, if, elif, else y while expresan lo mismo).
Nuestros próximos ejemplos serán un poco más modestos en el número de repeticiones de ciclo.
Echa un vistazo al fragmento de abajo. ¿Puedes predecir su salida?
for i in range(10):
print("El valor de i es actualmente", i)
La invocación de la función range() puede estar equipada con dos argumentos, no solo uno:
for i in range (2, 8):
print("El valor de i es actualmente", i)
En este caso, el primer argumento determina el valor inicial (primero) de la variable de control.
El último argumento muestra el primer valor que no se asignará a la variable de control.
Nota: la función range() solo acepta enteros como argumentos y genera secuencias de enteros.
¿Puedes adivinar la salida del programa? Ejecútalo para comprobar si ahora también estabas en lo cierto.
El primer valor mostrado es 2 (tomado del primer argumento de range()).
El tercer argumento es un incremento: es un valor agregado para controlar la variable en cada giro del
ciclo (como puedes sospechar, el valor predeterminado del incremento es 1 ).
¿Puedes decirnos cuántas líneas aparecerán en la consola y qué valores contendrán?
Ejecuta el programa para averiguar si tenías razón.
Nota: si el conjunto generado por la función range() está vacío, el ciclo no ejecutará su cuerpo en
absoluto.
Al igual que aquí, no habrá salida:
for i in range(1, 1): print("El valor de i es actualmente", i)
Nota: el conjunto generado por range() debe ordenarse en un orden ascendente. No hay forma de
forzar el range() para crear un conjunto en una forma diferente. Esto significa que el segundo
argumento de range() debe ser mayor que el primero.
Echemos un vistazo a un programa corto cuya tarea es escribir algunas de las primeras potencias de dos:
pow = 1
for exp in range(16):
print ("2 a la potencia de", exp, "es", pow)
pow * = 2
La variable exp se utiliza como una variable de control para el ciclo e indica el valor actual del
exponente. La propia exponenciación se sustituye multiplicando por dos. Dado que 2 0 es igual a 1,
después 2 × 1 es igual a 21, 2 × 21 es igual a 22, y así sucesivamente. ¿Cuál es el máximo exponente para
el cual nuestro programa aún imprime el resultado?
Ejecuta el código y verifica si la salida coincide con tus expectativas.
LABORATORIO
Tiempo estimado
5 minutos
Nivel de dificultad
Muy fácil
Objetivos
Familiarizar al estudiante con:
Escenario
¿Sabes lo que es Mississippi? Bueno, es el nombre de uno de los estados y ríos en los Estados Unidos.
El río Mississippi tiene aproximadamente 2,340 millas de largo, lo que lo convierte en el segundo río
más largo de los Estados Unidos (el más largo es el río Missouri). ¡Es tan largo que una sola gota de agua
necesita 90 días para recorrer toda su longitud!
La palabra Mississippi también se usa para un propósito ligeramente diferente: para contar mississippily
(mississippimente).
Si no estás familiarizado con la frase, estamos aquí para explicarte lo que significa: se utiliza para contar
segundos.
La idea detrás de esto es que agregar la palabra Mississippi a un número al contar los segundos en voz
alta hace que suene más cercano al reloj, y por lo tanto "un Mississippi, dos Mississippi, tres Mississippi"
tomará aproximadamente unos tres segundos reales de tiempo. A menudo lo usan los niños que juegan
al escondite para asegurarse de que el buscador haga un conteo honesto.
Tu tarea es muy simple aquí: escribe un programa que use un ciclo for para "contar de forma
mississippi" hasta cinco. Habiendo contado hasta cinco, el programa debería imprimir en la pantalla el
mensaje final "¡Listo o no, ahí voy!"
Por el momento, nos gustaría que supieras que hemos importado el módulo time y hemos utilizado el
método sleep() para suspender la ejecución de cada función posterior de print() dentro del ciclo
for durante un segundo, de modo que el mensaje enviado a la consola se parezca a un conteo real. No
te preocupes, pronto aprenderás más sobre módulos y métodos.
Salida esperada
1 Mississippi
2 Mississippi
3 Mississippi
4 Mississippi
5 Mississippi
import time
for segundo in range(1, 6):
print(segundo, "Mississippi")
[Link](1)
print("Listo o no, ahí voy!")
• Parece que no es necesario continuar el ciclo en su totalidad; se debe abstener de seguir ejecutando
el cuerpo del ciclo e ir más allá.
• Parece que necesitas comenzar el siguiente giro del ciclo sin completar la ejecución del turno
actual.
Python proporciona dos instrucciones especiales para la implementación de estas dos tareas. Digamos
por razones de precisión que su existencia en el lenguaje no es necesaria: un programador experimentado
puede codificar cualquier algoritmo sin estas instrucciones. Tales adiciones, que no mejoran el poder
expresivo del lenguaje, sino que solo simplifican el trabajo del desarrollador, a veces se denominan
dulces sintácticos o azúcar sintáctica.
Estas dos instrucciones son:
• Break: Sale del ciclo inmediatamente, e incondicionalmente termina la operación del ciclo; el
programa comienza a ejecutar la instrucción más cercana después del cuerpo del ciclo.
• Continue: Se comporta como si el programa hubiera llegado repentinamente al final del
cuerpo; el siguiente turno se inicia y la expresión de condición se prueba de inmediato.
Ambas palabras son palabras clave reservadas.
Ahora te mostraremos dos ejemplos simples para ilustrar como funcionan las dos instrucciones. Mira el
código en el editor. Ejecuta el programa y analiza la salida. Modifica el código y experimenta.
# break - ejemplo
# continua - ejemplo
contador = 1
if numero > numeroMayor:
numeroMayor = numero
numero = int (input ("Ingresa un número o escribe -1 para finalizar
el programa:"))
if contador:
print("El número más grande es", numeroMayor)
else:
print("No ha ingresado ningún número")
Otra vez: ejecútalo, pruébalo y experimenta con él.
LABORATORIO
Tiempo estimado
10 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
Escenario
La instrucción break se usa para salir/terminar un ciclo.
Diseña un programa que use un ciclo while y le pida continuamente al usuario que ingrese una palabra
a menos que ingrese "chupacabra" como la palabra de salida secreta, en cuyo caso el mensaje "¡Has
dejado el ciclo con éxito". Debe imprimirse en la pantalla y el ciclo debe terminar.
No imprimas ninguna de las palabras ingresadas por el usuario. Utiliza el concepto de ejecución
condicional y la declaración break.
while True:
palabra = input ("Estás atrapado en un ciclo infinito. Ingresa la
palabra secreta para dejar el ciclo:")
if palabra == "chupacabra":
break
print("¡Has dejado el ciclo con éxito!")
LABORATORIO
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
Escenario
La sentencia continue se usa para omitir el bloque actual y avanzar a la siguiente iteración, sin ejecutar
las declaraciones dentro del ciclo.
Se puede usar tanto con while y ciclos for.
Tu tarea aquí es muy especial: ¡Debes diseñar un devorador de vocales! Escribe un programa que use:
• Un ciclo for.
• El concepto de ejecución condicional (if-elif-else).
• La declaración continue.
Tu programa debe:
Datos de prueba
Entrada de muestra: Gregory
Salida esperada:
G R G R Y
Salida esperada:
B S T M S
Salida esperada:
# Indicar al usuario que ingrese una palabra
# y asignarlo a la variable userWord.
userWord=input("ingrese una letra: ")
userWord = [Link]()
for letra in userWord:
# Completa el cuerpo del ciclo for.
if letra == "A":
continue
elif letra == "E":
continue
elif letra == "I":
continue
elif letra == "O":
continue
elif letra == "U":
continue
else:
print(letra)
LABORATORIO
Tiempo estimado
5-10 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
Escenario
Tu tarea aquí es aún más especial que antes: ¡Debes rediseñar el devorador de vocales (feo) del
laboratorio anterior ([Link]) y crear un mejor devorador de vocales (bonito) mejorado! Escribe un
programa que use:
• Un ciclo for.
• El concepto de ejecución condicional (if-elif-else ).
• La declaración continue.
Tu programa debe:
Salida esperada:
GRGRY
Salida esperada:
BSTMS
Salida esperada:
palabraSinVocal = ""
Como pudiste haber sospechado, los ciclos también pueden tener la rama else, como los if.
La rama else del ciclo siempre se ejecuta una vez, independientemente de si el ciclo ha entrado o
no en su cuerpo .
¿Puedes adivinar la salida? Ejecuta el programa para comprobar si tenías razón.
Modifica el fragmento un poco para que el ciclo no tenga oportunidad de ejecutar su cuerpo ni una sola
vez:
i = 5 while i < 5: print(i) i += 1 else: print("else:", i)
Ahora vamos a informarte sobre otros tipos de variables. Nuestras variables actuales solo pueden
almacenar un valor a la vez, pero hay variables que pueden hacer mucho más; pueden almacenar
tantos valores como desees.
LABORATORIO
Tiempo estimado
20-30 minutos
Nivel de dificultad
Medio
Objetivos
Familiarizar al estudiante con:
Escenario
Escucha esta historia: Un niño y su padre, un programador de computadoras, juegan con bloques de
madera. Están construyendo una pirámide.
Su pirámide es un poco rara, ya que en realidad es una pared en forma de pirámide, es plana. La pirámide
se apila de acuerdo con un principio simple: cada capa inferior contiene un bloque más que la capa
superior.
La figura ilustra la regla utilizada por los constructores:
Tu tarea es escribir un programa que lea la cantidad de bloques que tienen los constructores, y generar la
altura de la pirámide que se puede construir utilizando estos bloques.
Nota: La altura se mide por el número de capas completas: si los constructores no tienen la cantidad
suficiente de bloques y no pueden completar la siguiente capa, terminan su trabajo inmediatamente.
Prueba tu código con los datos que hemos proporcionado.
Datos de prueba
Entrada de muestra: 6
Entrada de muestra: 20
Entrada de muestra: 2
Tiempo estimado
20 minutos
Nivel de dificultad
Media
Objetivos
Familiarizar al estudiante con:
Escenario
En 1937, un matemático alemán llamado Lothar Collatz formuló una hipótesis intrigante (aún no se ha
comprobado) que se puede describir de la siguiente manera:
1. Toma cualquier número entero que no sea negativo y que no sea cero y asígnale el nombre c0.
2. Si es par, evalúa un nuevo c0 como c0 ÷ 2.
3. De lo contrario, si es impar, evalúe un nuevo c0 como 3 × c0 + 1.
4. Si c0 ≠ 1, salta al punto 2.
La hipótesis dice que, independientemente del valor inicial de c0, el valor siempre tiende a 1.
Por supuesto, es una tarea extremadamente compleja usar una computadora para probar la hipótesis de
cualquier número natural (incluso puede requerir inteligencia artificial), pero puede usar Python para
verificar algunos números individuales. Tal vez incluso encuentres el que refutaría la hipótesis.
Escribe un programa que lea un número natural y ejecute los pasos anteriores siempre que c0 sea
diferente de 1. También queremos que cuente los pasos necesarios para lograr el objetivo. Tu código
también debe mostrar todos los valores intermedios de c0.
Sugerencia: la parte más importante del problema es como transformar la idea de Collatz en un ciclo
while- esta es la clave del éxito.
Datos de prueba
Entrada de muestra: 15
Salida esperada:
46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1 pasos = 17
Entrada de muestra: 16
Salida esperada:
8 4 2 1 pasos = 4
Entrada de muestra: 1023
Salida esperada:
3070 1535 4606 2303 6910 3455 10366 5183 15550 7775 23326 11663 34990
17495 52486 26243 78730 39365 118096 59048 29524 14762 7381 22144 11072
5536 2768 1384 692 346 173 520 260 130 65 196 98 49 148 74 37 112 56
28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 pasos = 62
c0=int(input("Ingrese un numero: "))
count=0
while c0!=1:
if c0%2==0:
c0=c0//2
print(c0)
count+=1
else:
c0=3*c0+1
print(c0)
count+=1
print("pasos =" ,count)
Puntos clave
• El ciclo while ejecuta una sentencia o un conjunto de declaraciones siempre que una condición
booleana especificada sea verdadera, por ejemplo:
# Ejemplo 1
while True:
print("Atascado en un ciclo infinito")
# Ejemplo 2
contador = 5
while contador > 2:
print(contador) contador -= 1
• El ciclo for ejecuta un conjunto de sentencias muchas veces; se usa para iterar sobre una
secuencia (por ejemplo, una lista, un diccionario, una tupla o un conjunto; pronto aprenderás
sobre ellos) u otros objetos que son iterables (por ejemplo, cadenas). Puedes usar el ciclo for
para iterar sobre una secuencia de números usando la función incorporada range. Mira los
ejemplos a continuación:
# Ejemplo 1
palabra = "Python"
for letter in palabra:
print(letter, fin = "*") #
Ejemplo 2
for i in range(1, 10):
if i % 2 == 0:
print(i)
2. Puedes usar las sentencias break y continue para cambiar el flujo de un ciclo:
3. Los ciclos while y for también pueden tener una cláusula else en Python. La cláusula else se
ejecuta después de que el ciclo finalice su ejecución siempre y cuando no haya terminado con break,
por ejemplo:
n = 0
while n != 3:
print(n) n += 1
else:
print(n, "else")
print()
for i in range(0, 3):
print(i)
else:
print(i, "else")
4. La función range() genera una secuencia de números. Acepta enteros y devuelve objetos de rango.
La sintaxis de range() tiene el siguiente aspecto: range(start, stop, step), donde:
Código de ejemplo:
for i in range(3):
print(i, end=" ") # salidas: 0 1 2
for i in range(6, 1, -2):
print(i, end=" ") # salidas: 6, 4, 2
Solución de muestra:
for i in range(0, 11):
if i % 2 != 0:
print(i))
Ejercicio 2
Crea un bucle while que cuente de 0 a 10, e imprima números impares en la pantalla. Usa el esqueleto
de abajo:
x = 1 while x < 11:
# line of code
# line of code
# line of code
Solución de muestra:
x = 1
while x < 11:
if x % 2 != 0:
print(x)
x += 1
Ejercicio 3
Crea un programa con un bucle for y una declaración break. El programa debe iterar sobre los
caracteres en una dirección de correo electrónico, salir del bucle cuando llegue al símbolo @ e imprimir
la parte antes de @ en una línea. Usa el esqueleto de abajo:
for ch in "[Link]@[Link]":
if ch == "@":
# línea de código
# línea de código
Solución de muestra:
for ch in "[Link]@[Link]":
if ch == "@":
break
print(ch, end="")
Ejercicio 4
Crea un programa con un bucle for y una declaracióncontinue. El programa debe iterar sobre una
cadena de dígitos, reemplazar cada 0 con x, e imprimir la cadena modificada en la pantalla. Usa el
esqueleto de abajo:
for digit in "0165031806510":
if digit == "0":
# línea de código
# línea de código
# línea de código
Ejercicio 5
¿Cuál es la salida del siguiente código?
n = 3
while n > 0:
print(n + 1) n -= 1
else:
print(n)
4
3
2
0
Ejercicio 6
¿Cuál es la salida del siguiente código?
n = range(4)
for num in n:
print(num - 1)
else:
print(num)
-1
0
1
2
3
Ejercicio 7
¿Cuál es la salida del siguiente código?
for i in range(0, 6, 3):
print(i)
0
3
Lógica de computadora
¿Te has dado cuenta de que las condiciones que hemos usado hasta ahora han sido muy simples, por no
decir, bastante primitivas? Las condiciones que utilizamos en la vida real son mucho más complejas.
Veamos esta oración:
Si tenemos tiempo libre, el clima es bueno, saldremos a caminar.
Hemos utilizado la conjunción and (y), lo que significa que salir a caminar depende del cumplimiento
simultáneo de estas dos condiciones. En el lenguaje de la lógica, tal conexión de condiciones se denomina
conjunción. Y ahora otro ejemplo:
Si estás en el centro comercial estoy en el centro comercial, uno de nosotros le comprará un regalo a
mamá.
La aparición de la palabra or (o) significa que la compra depende de al menos una de estas
condiciones. En lógica, este compuesto se llama una disyunción.
Está claro que Python debe tener operadores para construir conjunciones y disyunciones. Sin ellos, el
poder expresivo del lenguaje se debilitaría sustancialmente. Se llaman operadores lógicos.
and
Un operador de conjunción lógica en Python es la palabra y. Es un operador binario con una prioridad
inferior a la expresada por los operadores de comparación. Nos permite codificar condiciones
complejas sin el uso de paréntesis como este:
contador > 0 valor == 100
El resultado proporcionado por el operador and se puede determinar sobre la base de la tabla de verdad.
Argumento A Argumento B A B
False False False
False True False
True False False
True True True
or
Un operador de disyunción es la palabra or. Es un operador binario con una prioridad más baja que
and (al igual que + en comparación con *). Su tabla de verdad es la siguiente:
Argumento A Argumento B A B
False False False
False True True
True False True
True True True
not
Además, hay otro operador que se puede aplicar para condiciones de construcción. Es un operador
unario que realiza una negación lógica. Su funcionamiento es simple: convierte la verdad en falso y lo
falso en verdad.
Este operador se escribe como la palabra not, y su prioridad es muy alta: igual que el unario + y -.
Su tabla de verdad es simple:
Argumento Argumento
False True
True False
Expresiones lógicas
Creemos una variable llamada var y asignémosle 1. Las siguientes condiciones son equivalentes a
pares:
print() print()
print() print()
Observa como se han utilizado los paréntesis para codificar las expresiones: las colocamos allí para
mejorar la legibilidad.
Deberíamos agregar que ninguno de estos operadores de dos argumentos se puede usar en la forma
abreviada conocida como op=. Vale la pena recordar esta excepción.
El resultado de sus operaciones es uno de estos valores: False o True. Esto significa que este
fragmento de código asignará el valor True a la variable j si i no es cero; de lo contrario, será False.
i = 1 j = not not i
Operadores bitwise
Sin embargo, hay cuatro operadores que le permiten manipular bits de datos individuales. Se
denominan operadores bitwise.
Cubren todas las operaciones que mencionamos anteriormente en el contexto lógico, y un operador
adicional. Este es el operador xor (como en o exclusivo ), y se denota como ^ (signo de intercalación).
Agreguemos un comentario importante: los argumentos de estos operadores deben ser enteros. No
debemos usar flotantes aquí.
La diferencia en el funcionamiento de los operadores lógicos y de bits es importante: los operadores
lógicos no penetran en el nivel de bits de su argumento. Solo les interesa el valor entero final.
Los operadores bitwise son más estrictos: tratan con cada bit por separado. Si asumimos que la variable
entera ocupa 64 bits (lo que es común en los sistemas informáticos modernos), puede imaginar la
operación a nivel de bits como una evaluación de 64 veces del operador lógico para cada par de bits de
los argumentos. Su analogía es obviamente imperfecta, ya que en el mundo real todas estas 64
operaciones se realizan al mismo tiempo (simultáneamente).
Si asumimos que los enteros se almacenan con 32 bits, la imagen a nivel de bits de las dos variables será
la siguiente:
i: 00000000000000000000000000001111 j:
00000000000000000000000000010110
Se ejecuta la asignación:
og = i and j
Estamos tratando con una conjunción lógica aquí. Vamos a trazar el curso de los cálculos. Ambas
variables i y j no son ceros, por lo que se considerará que representan a True. Al consultar la tabla de
verdad para el operador and, podemos ver que el resultado será True. No se realizan otras operaciones.
log: True
El operador & operará con cada par de bits correspondientes por separado, produciendo los valores de
los bits relevantes del resultado. Por lo tanto, el resultado será el siguiente:
i 000000000000000000000000000
j 000000000000000000000000000
bit = i & j 000000000000000000000000000
Estos bits corresponden al valor entero de seis.
Puede ser un poco sorprendente: el valor de la variable bitneg es -16. Esto puede parecer extraño,
pero no lo es en absoluto. Si deseas obtener más información, debes consultar el sistema de números
binarios y las reglas que rigen los números de complemento de dos.
i 0000000000000000000000000000
bitneg = ~i 1111111111111111111111111111
Cada uno de estos operadores de dos argumentos se puede utilizar en forma abreviada. Estos son los
ejemplos de sus notaciones equivalentes:
x = x & y x y
x = x | y x y
x = x ^ y x y
La variable almacena la información sobre varios aspectos de la operación del sistema. Cada bit de la
variable almacena un valor de si/no. También se te ha dicho que solo uno de estos bits es tuyo, el
tercero (recuerda que los bits se numeran desde cero y el número de bits cero es el más bajo, mientras
que el más alto es el número 31). Los bits restantes no pueden cambiar, porque están destinados a
almacenar otros datos. Aquí está tu bit marcado con la letra x:
flagRegister = 000000000000000000000000000000000
Es posible que tengas que hacer frente a las siguientes tareas:
1. Comprobar el estado de tu bit: deseas averiguar el valor de su bit; comparar la variable completa
con cero no hará nada, porque los bits restantes pueden tener valores completamente impredecibles, pero
puedes usar la siguiente propiedad de conjunción:
x & 1 = x x & 0 = 0
Si aplicas la operación & a la variable flagRegister junto con la siguiente imagen de bits:
0000000000000000000000000000000
(observa el 1 en la posición de tu bit) como resultado, obtendrás una de las siguientes cadenas de bits:
Dicha secuencia de ceros y unos, cuya tarea es tomar el valor o cambiar los bits seleccionados, se
denomina máscara de bits.
Construyamos una máscara de bits para detectar el estado de tus bits. Debería apuntar a el tercer bit. Ese
bit tiene el peso de 23=8. Se podría crear una máscara adecuada mediante la siguiente declaración:
theMask = 8
También puedes hacer una secuencia de instrucciones dependiendo del estado de tu bit i, aquí está:
if flagRegister & theMask: # mi bit está listo else: # mi bit se
restablece
2. Reinicia tu bit: asigna un cero al bit, mientras que todos los otros bits deben permanecer sin cambios;
usemos la misma propiedad de la conjunción que antes, pero usemos una máscara ligeramente diferente,
exactamente como se muestra a continuación:
1111111111111111111111111111111
Tenga en cuenta que la máscara se creó como resultado de la negación de todos los bits de la variable
theMask. Restablecer el bit es simple, y se ve así (elige el que más te guste):
flagRegister = flagRegister & ~theMask flagregister &= ~theMask
3. Establece tu bit : asigna un 1 a tu bit, mientras que todos los bits restantes deben permanecer sin
cambios; usa la siguiente propiedad de disyunción:
x | 1 = 1 x | 0 = x
Ya estás listo para configurar su bit con una de las siguientes instrucciones:
flagRegister = flagRegister | theMask flagRegister |= theMask
4. Niega tu bit: reemplaza un 1 con un 0 y un 0 con un 1. Puedes utilizar una propiedad interesante del
operador ~x:
x ^ 1 = ~x x ^ 0 = x
Como puede ver, multiplicar por diez es de hecho un desplazamiento de todos los dígitos a la izquierda
y llenar el vacío resultante con cero.
¿División entre diez? Echa un vistazo:
12340 ÷ 10 = 1234
La computadora realiza el mismo tipo de operación, pero con una diferencia: como dos es la base para
los números binarios (no 10), desplazar un valor un bit a la izquierda corresponde a multiplicarlo
por dos ; respectivamente, desplazar un bit a la derecha es como dividir entre dos (observe que se
pierde el bit más a la derecha).
Los operadores de cambio en Python son un par de dígrafos: < < y > >, sugiriendo claramente en
qué dirección actuará el cambio.
valor << bits valor >> bits
Nota:
Y aquí está la tabla de prioridades actualizada , que contiene todos los operadores presentados hasta
ahora:
Prioridad Operador
1 ! ~ (tipo) ++ -- + - unario
2 **
3 * / %
4 + - binario
5 << >>
6 <<=>> =
7 == !=
8 &
9 |
10 &&
11 ||
12 = += -= *= /= %= &= ^= |= >>= <<=
Puntos clave
• and → si ambos operandos son verdaderos, la condición es verdadera, por ejemplo, (True and
True) es True.
• or → si alguno de los operandos es verdadero, la condición es verdadera, por ejemplo, (True
or False) es True.
• not → devuelve False si el resultado es verdadero y devuelve True si es falso, por ejemplo, not
True es False.
2. Puedes utilizar operadores bit a bit para manipular bits de datos individuales. Los siguientes datos de
muestra:
Se utilizarán para ilustrar el significado de operadores bit a bit en Python. Analiza los ejemplos a
continuación:
• & hace un bit a bit and (y), por ejemplo, x & y = 0, el cual es 0000 0000 en binario.
• | hace un bit a bit or (o), por ejemplo, x | y = 31, el cual es 0001 1111 en binario.
• ˜ hace un bit a bit not (no), por ejemplo, ˜ x = 240, el cual es 1111 0000 en binario.
• ^ hace un bit a bit xor, por ejemplo, x ^ y = 31, el cual es 0001 1111 en binario.
• >> hace un desplazamiento bit a bit a la derecha, por ejemplo, y >> 1 = 8, el cual es 0000
1000 en binario.
• << hace un desplazamiento bit a bit a la izquierda, por ejemplo, y << 3 = , el cual es 1000
0000 en binario.
Ejercicio 1
¿Cuál es la salida del siguiente fragmento de código?
x = 1
y = 0
z = ((x == y) and (x == y)) or not(x == y)
print(not(z))
False
Ejercicio 2
¿Cuál es la salida del siguiente fragmento de código?
x = 4 y = 1 a = x & y b = x | y c = ~ x d = x ^ 5 e = x >> 2 f = x <<
2 print(a, b, c, d, e, f)
0 5 -5 1 1 16
Si no crees que esta sea una tarea complicada, toma un papel y escribe un programa que:
¿Y si solo pudieras numerarlos? Y luego di: dame el valor número 2; asigna el valor número 15; aumenta
el número del valor 10000.
Te mostraremos como declarar tales variables de múltiples valores . Haremos esto con el ejemplo que
acabamos de sugerir. Escribiremos un programa que ordene una secuencia de números. No seremos
particularmente ambiciosos: asumiremos que hay exactamente cinco números.
Vamos a crear una variable llamada numeros; se le asigna no solo un número, sino que se llena con
una lista que consta de cinco valores (nota: la lista comienza con un corchete abierto y termina con
un corchete cerrado ; el espacio entre los corchetes es llenado con cinco números separados por comas).
numeros = 10, 5, 7, 2, 1
Digamos lo mismo utilizando una terminología adecuada: numeros es una lista que consta de cinco
valores, todos ellos números. También podemos decir que esta declaración crea una lista de longitud
igual a cinco (ya que contiene cinco elementos).
Los elementos dentro de una lista pueden tener diferentes tipos . Algunos de ellos pueden ser enteros,
otros son flotantes y otros pueden ser listas.
Python ha adoptado una convención que indica que los elementos de una lista están siempre numerados
desde cero. Esto significa que el elemento almacenado al principio de la lista tendrá el número cero.
Como hay cinco elementos en nuestra lista, al último de ellos se le asigna el número cuatro. No olvides
esto.
Pronto te acostumbrarás y se convertirá en algo natural.
Antes de continuar con nuestra discusión, debemos indicar lo siguiente: nuestra lista es una colección
de elementos, pero cada elemento es un escalar.
Listas de indexación
¿Cómo cambias el valor de un elemento elegido en la lista?
Vamos a asignar un nuevo valor de 111 al primer elemento en la lista. Lo hacemos de esta manera:
numeros = [10, 5, 7, 2, 1]
print("Contenido de la lista original:", numeros) # imprime el
contenido de la lista original
numeros[0] = 111
print("Nuevo contenido de la lista:", numeros) # contenido de la lista
actual.
Y ahora queremos copiar el valor del quinto elemento al segundo elemento. ¿Puedes adivinar como
hacerlo?
numeros = [10, 5, 7, 2, 1]
print("Contenido de la lista original:", numeros) # imprimiendo
contenido de la lista original.
numeros[0] = 111
print("\nPrevio contenido de la lista:", numeros) # imprimiendo
contenido de la lista anterior. # copiando el valor del quinto elemento
al segundo
print("Nuevo contenido de la lista:", numeros) # imprimiendo el
contenido de la lista actual.
El valor dentro de los corchetes que selecciona un elemento de la lista se llama un índice, mientras que
la operación de seleccionar un elemento de la lista se conoce como indexación.
Vamos a utilizar la función print() para imprimir el contenido de la lista cada vez que realicemos los
cambios. Esto nos ayudará a seguir cada paso con más cuidado y ver que sucede después de una
modificación de la lista en particular.
Nota: todos los índices utilizados hasta ahora son literales. Sus valores se fijan en el tiempo de ejecución,
pero cualquier expresión también puede ser un índice. Esto abre muchas posibilidades.
Accediendo al contenido de la lista
Se puede acceder a cada uno de los elementos de la lista por separado. Por ejemplo, se puede imprimir:
print(numeros[0]) # accediendo al primer elemento de la lista.
Suponiendo que todas las operaciones anteriores se hayan completado con éxito, el fragmento enviará
111 a la consola.
Como puedes ver en el editor, la lista también puede imprimirse como un todo, como aquí:
print(numeros) # imprimiendo la lista completa.
Como probablemente hayas notado antes, Python decora la salida de una manera que sugiere que todos
los valores presentados forman una lista. La salida del fragmento de ejemplo anterior se ve así:
[111, 1, 7, 2, 1]
La función len()
La longitud de una lista puede variar durante la ejecución. Se pueden agregar nuevos elementos a la
lista, mientras que otros pueden eliminarse de ella. Esto significa que la lista es una entidad muy
dinámica.
Si deseas verificar la longitud actual de la lista, puedes usar una función llamada len() (su nombre
proviene de length - longitud).
La función toma el nombre de la lista como un argumento y devuelve el número de elementos
almacenados actualmente dentro de la lista (en otras palabras, la longitud de la lista).
Observa la última línea de código en el editor, ejecuta el programa y verifica que valor imprimirá en la
consola. ¿Puedes adivinar?
Tienes que apuntar al elemento que quieres eliminar, desaparecerá de la lista y la longitud de la lista se
reducirá en uno.
Mira el fragmento de abajo. ¿Puedes adivinar qué salida producirá? Ejecuta el programa en el editor y
comprueba.
print(len(numeros)) print(numeros)
No puedes acceder a un elemento que no existe , no puedes obtener su valor ni asignarle un valor.
Ambas instrucciones causarán ahora errores de tiempo de ejecución:
print(numeros[4])
numeros[4] = 1
Agrega el fragmento de código anterior después de la última línea de código en el editor, ejecute el
programa y verifique que sucede.
Nota: hemos eliminado uno de los elementos de la lista; ahora solo hay cuatro elementos en la lista. Esto
significa que el elemento número cuatro no existe.
Del mismo modo, el elemento con un índice igual a -2 es el anterior al último en la lista.
print(numeros)
El último elemento accesible en nuestra lista es numeros[-4] (el primero). ¡No intentes ir más lejos!
LABORATORIO
Tiempo estimado
5 minutos
Nivel de dificultad
Muy fácil
Objetivos
Familiarizar al estudiante con:
Escenario
Había una vez un sombrero. El sombrero no contenía conejo, sino una lista de cinco números: 1, 2, 3, 4
y 5.
Tu tarea es:
• Escribir una línea de código que solicite al usuario que reemplace el número central en la lista
con un número entero ingresado por el usuario (paso 1).
• Escribir una línea de código que elimine el último elemento de la lista (paso 2).
• Escribir una línea de código que imprima la longitud de la lista existente (paso 3).
¿Listo para este desafío?
listaSombrero = [1, 2, 3, 4, 5] # Esta es una lista existente de números
ocultos en el sombrero.
Esto también significa que invocar un método requiere alguna especificación de los datos a partir de los
cuales se invoca el método.
Puede parecer desconcertante aquí, pero lo trataremos en profundidad cuando profundicemos en la
programación orientada a objetos.
En general, una invocación de función típica puede tener este aspecto:
resultado =
Nota: el nombre del método está precedido por el nombre de los datos que posee el método. A
continuación, se agrega un punto, seguido del nombre del método y un par de paréntesis que encierran
los argumentos.
El método se comportará como una función, pero puede hacer algo más: puede cambiar el estado
interno de los datos a partir de los cuales se ha invocado.
Puedes preguntar: ¿por qué estamos hablando de métodos, y no de listas?
Este es un tema esencial en este momento, ya que le mostraremos como agregar nuevos elementos a una
lista existente. Esto se puede hacer con métodos propios de las listas, no por funciones.
Dicha operación se realiza mediante un método llamado append(). Toma el valor de su argumento y
lo coloca al final de la lista que posee el método.
La longitud de la lista aumenta en uno.
El método insert() es un poco más inteligente: puede agregar un nuevo elemento en cualquier lugar
de la lista, no solo al final.
lista
• El primero muestra la ubicación requerida del elemento a insertar. Nota: todos los elementos
existentes que ocupan ubicaciones a la derecha del nuevo elemento (incluido el que está en la
posición indicada) se desplazan a la derecha, para hacer espacio para el nuevo elemento.
• El segundo es el elemento a insertar.
Observa el código en el editor. Ve como usamos los métodos append() e insert(). Presta atención
a lo que sucede después de usar insert(): el primer elemento anterior ahora es el segundo, el segundo
el tercero, y así sucesivamente.
Imprime el contenido de la lista final en la pantalla y ve que sucede. El fragmento de código sobre el
fragmento de código inserta 333 en la lista, por lo que es el segundo elemento. El segundo elemento
anterior se convierte en el tercero, el tercero en el cuarto, y así sucesivamente.
¿Qué pasará ahora? Ejecuta el programa y comprueba si esta vez también tenías razón.
Deberías obtener la misma secuencia, pero en orden inverso (este es el mérito de usar el método
insert()).
miLista = [] # creando una lista vacía
for i in range (5):
[Link] (i + 1)
rint(miLista)
Necesitas una variable cuya suma se almacenará y se le asignará inicialmente un valor de 0 - su nombre
es suma. Luego agrega todos los elementos de la lista usando el bucle for. Echa un vistazo al fragmento
en el editor.
Comentemos este ejemplo:
• La instrucción for especifica la variable utilizada para navegar por la lista (i) seguida de la
palabra clave in y el nombre de la lista siendo procesado (miLista).
• A la variable i se le asignan los valores de todos los elementos de la lista subsiguiente, y el
proceso ocurre tantas veces como hay elementos en la lista.
• Esto significa que usa la variable i como una copia de los valores de los elementos, y no necesita
emplear índices.
• La función len() tampoco es necesaria aquí.
Necesitas una variable cuya suma se almacenará y se le asignará inicialmente un valor de 0 - su nombre
es suma. Luego agrega todos los elementos de la lista usando el bucle for. Echa un vistazo al fragmento
en el editor.
Comentemos este ejemplo:
• La instrucción for especifica la variable utilizada para navegar por la lista (i) seguida de la
palabra clave in y el nombre de la lista siendo procesado (miLista).
• A la variable i se le asignan los valores de todos los elementos de la lista subsiguiente, y el
proceso ocurre tantas veces como hay elementos en la lista.
• Esto significa que usa la variable i como una copia de los valores de los elementos, y no necesita
emplear índices.
• La función len() tampoco es necesaria aquí.
miLista = [10, 1, 8, 3, 5]
suma = 0
for i in range(len(miLista)):
suma += miLista[i]
print(suma)
Si haces algo como esto, perderás el valor previamente almacenadoenvariable2. Cambiar el orden
de las tareas no ayudará. Necesitas una tercera variable que sirva como almacenamiento auxiliar.
Así es como puedes hacerlo:
variable1 = 1 variable2 = 2 = variable1 variable1 = variable2 variable2
=
Python ofrece una forma más conveniente de hacer el intercambio, echa un vistazo:
variable1 = 1 variable2 = 2 variable1, variable2 = variable2, variable1
Listas en acción
Ahora puedes intercambiar fácilmente los elementos de la lista para revertir su orden:
miLista = [10, 1, 8, 3, 5] miLista [0], miLista [4] = miLista [4],
miLista [0] miLista [1], miLista [3] = miLista [3], miLista [1]
print(miLista)
Nota:
• Hemos asignado la variable longitud a la longitud de la lista actual (esto hace que nuestro
código sea un poco más claro y más corto).
• Hemos lanzado el ciclo for para que se ejecute a través de su cuerpo longitud // 2 veces
(esto funciona bien para listas con longitudes pares e impares, porque cuando la lista contiene un
número impar de elementos, el del medio permanece intacto).
• Hemos intercambiado el elemento i (desde el principio de la lista) por el que tiene un índice igual
a (longitud-i-1) (desde el final de la lista); en nuestro ejemplo, for i igual a 0 la
(longitud-i-1) da 4; for i igual a 3, da 3: esto es exactamente lo que necesitábamos.
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
Escenario
Los Beatles fueron uno de los grupos de música más populares de la década de 1960 y la banda más
vendida en la historia. Algunas personas los consideran el acto más influyente de la era del rock. De
hecho, se incluyeron en la compilación de la revista Time de las 100 personas más influyentes del siglo
XX.
La banda sufrió muchos cambios de formación, que culminaron en 1962 con la formación de John
Lennon, Paul McCartney, George Harrison y Richard Starkey (mejor conocido como Ringo Starr).
Escribe un programa que refleje estos cambios y le permita practicar con el concepto de listas. Tu tarea
es:
# Paso 2:
# Paso 3:
for miembros in range(2):
[Link] (input ("Nuevo miembro de la banda:"))
print("Paso 3:", Beatles)
# Paso 4:
del Beatles [-1]
del Beatles [-1]
print("Paso 4:", Beatles)
# Paso 5:
[Link] (0, "RingoStarr")
print("Paso 5:", Beatles)
print("Los Fab:", len (Beatles))
Puntos clave
1. La lista es un tipo de dato en Python que se utiliza para almacenar múltiples objetos. Es una
colección ordenada y mutable de elementos separados por comas entre corchetes, por ejemplo:
miLista = [1, None, True, "Soy una cadena", 256, 0]
3. Las listas pueden estar anidadas, por ejemplo: miLista = [1, 'a', ["lista", 64, [0,
1], False]].
[Link] listas pueden ser iteradas mediante el uso del bucle for, por ejemplo:
miLista = ["blanco", "purpura", "azul", "amarillo", "verde"]
for color in miLista :
print(color)
6. La función len() se puede usar para verificar la longitud de la lista, por ejemplo:
miLista = ["blanco", "purpura", "azul", "amarillo", "verde"]
print(len(miLista)) # la salidas es 5
del miLista[2]
print (len(miLista)) # la salidas es 4
resultado = [Link](arg).
Ejercicio 1
¿Cuál es la salida del siguiente fragmento de código?
lst = [1, 2, 3, 4, 5]
[Link](1, 6)
del lst[0]
[Link](1)
print(lst)
[6, 2, 3, 4, 5, 1]
Ejercicio 2
¿Cuál es la salida del siguiente fragmento de código?
lst = [1, 2, 3, 4, 5]
lst2 = []
agregar = 0
for number in lst:
agregar += number
[Link] (agregar)
print(lst2)
[1, 3, 6, 10, 15]
Ejercicio 3
¿Qué sucede cuando ejecutas el siguiente fragmento de código?
lst = []
del lst
print(lst)
NameError: el nombre 'lst' no está definido
Ejercicio 4
¿Cuál es la salida del siguiente fragmento de código?
lst = [1, [2, 3], 4]
print(lst[1])
print(len(lst))
[2, 3]
3
Como puedes ver, todas las listas tienen un método denominado sort(), que las ordena lo más rápido
posible. Ya has aprendido acerca de algunos de los métodos de lista anteriormente, y pronto aprenderás
más sobre otros.
miLista = []
swapped = True
num = int (input("¿Cuántos elementos deseas ordenar?:"))
for i in range(num):
val = float(input("Introduce un elemento de la lista:"))
[Link](val)
while swapped:
swapped = False
for i in range(len(miLista) - 1):
if miLista[i] > miLista[i + 1]:
swapped = True
miLista[i], miLista[i + 1] = miLista[i + 1], miLista[i]
print("\nOrdenado:")
print(miLista)
Puntos clave
1. Puedes usar el método sort() para ordenar los elementos de una lista, por ejemplo:
lst = [5, 3, 1, 2, 4]
print(lst) [Link] ()
print(lst) # salida: [1, 2, 3, 4, 5]
[Link]én hay un método de lista llamado reverse(), que puedes usar para invertir la lista, por
ejemplo:
lst = [5, 3, 1, 2, 4]
print(lst)
[Link]()
print (lst) # salida: [4, 2, 1, 3, 5]
Ejercicio 1
¿Cuál es la salida del siguiente fragmento de código?
lst = ["D", "F", "A", "Z"]
[Link] ()
print(lst)
['A', 'D', 'F', 'Z']
Ejercicio 2
¿Cuál es la salida del siguiente fragmento de código?
a = 3 b = 1 c = 2
lst = [a, c, b]
[Link] () print(lst)
[1, 2, 3]
Ejercicio 3
¿Cuál es la salida del siguiente fragmento de código?
a = "A" b = "B" c = "C" d = ""
lst = [a, b, c, d]
[Link] ()
print(lst)
['', 'C', 'B', 'A']
La parte sorprendente es el hecho de que el programa mostrará como resultado: [2], no [1], que
parece ser la solución obvia.
Las listas (y muchas otras entidades complejas de Python) se almacenan de diferentes maneras que las
variables ordinarias (escalares).
Se podría decir que:
Rodajas Poderosas
Afortunadamente, la solución está al alcance de su mano: su nombre es rodaja.
Una rodaja es un elemento de la sintaxis de Python que permite hacer una copia nueva de una lista, o
partes de una lista.
En realidad, copia el contenido de la lista, no el nombre de la lista.
Esto es exactamente lo que necesitas. Echa un vistazo al fragmento de código a continuación:
lista1 = [1]
lista2 = lista1
lista1[0] = 2
print(lista2)
Su salida es [1].
Esta parte no visible del código descrito como [:] puede producir una lista completamente nueva.
Como puedes ver, se asemeja a la indexación, pero los dos puntos en el interior hacen una gran
diferencia.
Una rodaja de este tipo crea una nueva lista (de destino), tomando elementos de la lista de origen:
los elementos de los índices desde el principio hasta el fin-1.
Nota: no hasta el fin, sino hasta fin-1. Un elemento con un índice igual a fin es el primer
elemento el cual no participa en la segmentación.
Es posible utilizar valores negativos tanto para el inicio como para el fin(al igual que en la indexación).
Echa un vistazo al fragmento:
miLista = [10, 8, 6, 4, 2] nuevaLista = miLista print(nuevaLista)
La lista nuevaLista contendrá inicio-fin (3-1=2) elementos, los que tienen índices iguales a 1
y 2 (pero no 3)
Para repetir:
Rodajas: continuación
Si omites inicio en tu rodaja, se supone que deseas obtener un segmento que comienza en el
elemento con índice 0.
Del mismo modo, si omites el fin en tu rodaja, se supone que deseas que el segmento termine en el
elemento con el índice len(miLista).
La instrucción del descrita anteriormente puede eliminar más de un elemento de la lista a la vez,
también puede eliminar rodajas:
miLista = [10, 8, 6, 4, 2] print(miLista)
El primero de ellos (in) verifica si un elemento dado(su argumento izquierdo) está actualmente
almacenado en algún lugar dentro de la lista(el argumento derecho) - el operador devuelve True en
este caso.
El segundo (not in) comprueba si un elemento dado (su argumento izquierdo) está ausente en una
lista - el operador devuelve True en este caso.
Observa el código en el editor. El fragmento muestra ambos operadores en acción. ¿Puedes adivinar su
salida? Ejecuta el programa para comprobar si tenías razón.
El código puede ser reescrito para hacer uso de la forma recién introducida del ciclo for:
miLista = [17, 3, 11, 5, 1, 9, 7, 15, 13]
mayor = miLista [0]
for i in miLista:
if i > mayor:
mayor = i
print(mayor)
El programa anterior realiza una comparación innecesaria, cuando el primer elemento se compara
consigo mismo, pero esto no es un problema en absoluto.
El código da como resultado el 17 también (nada inusual).
La pregunta es: ¿Cuál de estas dos acciones consume más recursos informáticos: solo una comparación
o partir casi todos los elementos de una lista?
miLista = [17, 3, 11, 5, 1, 9, 7, 15, 13]
mayor = miLista[0]
for i in range(1, len(miLista)):
if miLista [i]> mayor:
mayor = miLista[i]
print(mayor)
Nota:
Supongamos que has elegido los siguientes números en la lotería: 3, 7, 11, 42, 34, 49.
Los números que han salido sorteados son: 5, 11, 9, 42, 3, 49.
Nota:
LABORATORIO
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
• Indexación de listas.
• Utilizar operadoresin y not in.
Escenario
Imagina una lista: no muy larga ni muy complicada, solo una lista simple que contiene algunos
números enteros. Algunos de estos números pueden estar repetidos, y esta es la clave. No queremos
ninguna repetición. Queremos que sean eliminados.
Tu tarea es escribir un programa que elimine todas las repeticiones de números de la lista. El objetivo
es tener una lista en la que todos los números aparezcan no más de una vez.
Nota: Asume que la lista original está ya dentro del código, no tienes que ingresarla desde el teclado.
Por supuesto, puedes mejorar el código y agregar una parte que pueda llevar a cabo una conversación
con el usuario y obtener todos los datos.
Sugerencia: Te recomendamos que crees una nueva lista como área de trabajo temporal, no necesitas
actualizar la lista actual.
No hemos proporcionado datos de prueba, ya que sería demasiado fácil. Puedes usar nuestro esqueleto
en su lugar.
miLista = [1, 2, 4, 4, 1, 4, 2, 6, 2, 9]
nuevaLista = []
for numero in miLista: # Explorar todos los números de la lista
original.
if numero not in nuevaLista: # Si el número no aparece en la
nueva lista ...
[Link](numero) # ... adjúntalo aquí.
miLista = nuevaLista[:] # Hacer una copia de nuevalista.
print("La lista solo con elementos únicos: ")
print(miLista)
Puntos clave
1. Si tienes una lista l1, la siguiente asignación: l2 = l1 no hace una copia de la lista l1, pero hace
que las variables l1 y l2 apunten a la misma lista en la memoria . Por ejemplo:
vehiculosUno = ['carro', 'bicicleta', 'moto']
print(vehiculosUno) # salida: ['carro', 'bicicleta', 'moto']
vehiculosDos = vehiculosUno del vehiculosUno[0] # borra 'carro'
print(vehiculosDos) # salida: ['bicicleta', 'moto']
2. Si deseas copiar una lista o parte de la lista, puede hacerlo haciendo uso de rodajas(slicing):
colores = ['rojo', 'verde', 'naranja']
copiaTodosColores = colores[:] # copia la lista completa
copiaParteColores = colores[0:2] # copia parte de la lista
3. También puede utilizar índices negativos para hacer uso de rodajas. Por ejemplo:
listaMuestra = ["A", "B", "C", "D", "E"]
nuevaLista = listaMuestra[2:-1]
print(nuevaLista) # salida: ['C', 'D']
6. Puedes probar si algunos elementos existen en una lista o no utilizando las palabras clave in y not
in, por ejemplo:
miLista = ["A", "B", 1, 2]
print("A" in miLista) # salida: True
print("C" not in miLista) # salida: False
print(2 not in miLista) # salidas: False
Ejercicio 1
¿Cuál es la salida del siguiente fragmento de código?
l1 = ["A", "B", "C"]
l2 = l1
l3 = l2
del l1[0]
del l2[0]
print(l3)
['C']
Ejercicio 2
¿Cuál es la salida del siguiente fragmento de código?
l1 = ["A", "B", "C"]
l2 = l1
l3 = l2
del l1[0]
del l2
print(l3)
['B', 'C']
Ejercicio 3
¿Cuál es la salida del siguiente fragmento de código?
l1 = ["A", "B", "C"]
l2 = l1
l3 = l2
del l1[0]
del l2[:]
print(l3)
[]
Ejercicio 4
¿Cuál es la salida del siguiente fragmento de código?
l1 = ["A", "B", "C"]
l2 = l1[:]
l3 = l2[:]
del l1[0]
del l2[0]
print(l3)
['A', 'B', 'C']
Ejercicio 5
Inserte in o not in en lugar de ??? para que el código genere el resultado esperado.
miLista = [1, 2, "in", True, "ABC"]
print(1 ??? miLista) # salida True
print("A" ??? miLista) # salida True
print(3 ??? miLista) # salida True
print(False ??? miLista) # salida False
miLista = [1, 2, "in", True, "ABC"]
print(1 in miLista) # salidas True
print("A" not in miLista) # salida True
print(3 not in miLista) # salida True
print(False in miLista) # salida False
Supongamos que podemos usar los números seleccionados para representar cualquier pieza de ajedrez.
También podemos asumir que cada fila en el tablero de ajedrez es una lista.
Observa el siguiente código:
fila = [] for i in range(8): [Link](PEON_BLANCO)
Crea una lista que contiene ocho elementos que representan la segunda fila del tablero de ajedrez: la
que está llena de peones (supon que PEON_BLANCO es un símbolo predefinido que representa un
peón blanco).
El mismo efecto se puede lograr mediante una comprensión de lista, la sintaxis especial utilizada por
Python para completar o llenar listas masivas.
Una comprensión de lista es en realidad una lista, pero se creó sobre la marcha durante la ejecución
del programa, y no se describe de forma estática.
Echa un vistazo al fragmento:
fila = [PEON_BLANCO for i in range(8)]
El fragmento de código genera una lista de diez elementos y rellena con cuadrados de diez números
enteros que comienzan desde cero (0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
Ejemplo # 2:
dos = [2 ** i for i in range(8)]
El fragmento crea un arreglo de ocho elementos que contiene las primeras ocho potencias del numero
dos (1, 2, 4, 8, 16, 32, 64, 128)
Ejemplo # 3:
probabilidades = [x for x in cuadrados if x % 2 != 0]
El fragmento hace una lista con solo los elementos impares de la lista cuadrados.
Nota:
• La parte interior del bucle crea una fila que consta de ocho elementos(cada uno de ellos es igual
a EMPTY) y lo agrega a la lista del tablero.
• La parte exterior se repite ocho veces.
• En total, la lista tablero consta de 64 elementos (todos iguales a EMPTY).
Este modelo imita perfectamente el tablero de ajedrez real, que en realidad es una lista de elementos de
ocho elementos, todos ellos en filas individuales. Resumamos nuestras observaciones:
• Los elementos de las filas son campos, ocho de ellos por fila.
• Los elementos del tablero de ajedrez son filas, ocho de ellos por tablero de ajedrez.
La variable tablero ahora es un arreglo bidimensional. También se le llama, por analogía a los
términos algebraicos, una matriz.
Como las listas de comprensión puede ser anidadas, podemos acortar la creación del tablero de la
siguiente manera:
tablero = [[EMPTY for i in range(8)] for j in range(8)]
La parte interna crea una fila, y la parte externa crea una lista de filas.
Luego tomarás la decisión arbitraria de que las filas registrarán las lecturas cada hora exactamente (por
lo que la fila tendrá 24 elementos) y cada una de las filas se asignará a un día del mes (supongamos que
cada mes tiene 31 días, por lo que necesita 31 filas). Aquí está el par apropiado de comprensiones(h es
para las horas, dpara el día):
temps = [[0.0 for h in range (24)] for d in range (31)]
Toda la matriz está llena de ceros ahora. Puede suponer que se actualiza automáticamente utilizando
agentes de hardware especiales. Lo que tienes que hacer es esperar a que la matriz se llene con las
mediciones.
Ahora es el momento de determinar la temperatura promedio mensual del mediodía. Suma las 31
lecturas registradas al mediodía y divida la suma por 31. Puedes suponer que la temperatura de
medianoche se almacena primero. Aquí está el código:
temps = [[0.0 for h in range(24)] for d in range (31)] # # la matriz
se actualiza mágicamente aquí #
suma = 0.0
for day in temps:
suma += day[11]
promedio= suma / 31
print("Temperatura promedio al mediodía:", promedio)
Nota: La variable day utilizada por el bucle for no es un escalar: cada paso a través de la matriz
temps lo asigna a la siguiente fila de la matriz; Por lo tanto, es una lista. Se debe indexar con 11 para
acceder al valor de temperatura medida al mediodía.
Nota:
Arreglos tridimensionales
Python no limita la profundidad de la inclusión lista en lista. Aquí puedes ver un ejemplo de un arreglo
tridimensional:
Imagina un hotel. Es un hotel enorme que consta de tres edificios, de 15 pisos cada uno. Hay 20
habitaciones en cada piso. Para esto, necesitas un arreglo que pueda recopilar y procesar información
sobre las habitaciones ocupadas/libres.
Primer paso: El tipo de elementos del arreglo. En este caso, sería un valor booleano (True/False).
Paso dos: Análisis de la situación. Resume la información disponible: tres edificios, 15 pisos, 20
habitaciones.
Ahora puedes crear el arreglo:
habitaciones = [[[False for r in range(20)] for f in range(15)] for t
in range(3)]
El primer índice (0 a 2) selecciona uno de los edificios; el segundo(0 a 14) selecciona el piso, el
tercero (0 a 19) selecciona el número de habitación. Todas las habitaciones están inicialmente
desocupadas.
Ahora ya puedes reservar una habitación para dos recién casados: en el segundo edificio, en el décimo
piso, habitación 14:
habitaciones[1][9][13] = True
La variable vacante contiene 0 si todas las habitaciones están ocupadas, o en dado caso el número de
habitaciones disponibles.
¡Felicitaciones! Has llegado al final del módulo. ¡Sigue con el buen trabajo!
Puntos clave
1. La comprensión de listas te permite crear nuevas listas a partir de las existentes de una manera
concisa y elegante. La sintaxis de una lista de comprensión es la siguiente:
[expresión elemento lista condicional]
Este es un ejemplo de una lista de comprensión: el código siguiente crea una lista de cinco elementos
con los primeros cinco números naturales elevados a la potencia de 3:
cubos = [num ** 3 for num in range (5)]
print(cubos) # salidas: [0, 1, 8, 27, 64]
2. Puedes usar listas anidadas en Python para crear matrices (es decir, listas bidimensionales). Por
ejemplo:
3. Puedes anidar tantas listas en las listas como desee y, por lo tanto, crear listas n-dimensionales, por
ejemplo, arreglos de tres, cuatro o incluso sesenta y cuatro dimensiones. Por ejemplo:
# Cubo - un arreglo tridimensional (3x3x3)
cubo = [[[':(', 'x', 'x'],
[':)', 'x', 'x'],
[':(', 'x', 'x']],
• Valores booleanos para comparar diferentes valores y controlar las rutas de ejecución usando
las instrucciones if e if-else.
• La utilización de bucles (while y for) y cómo controlar su comportamiento utilizando las
instrucciones break y continue.
• La diferencia entre operaciones lógicas y bit a bit.
• El concepto de listas y procesamiento de listas, incluyendo la iteración proporcionada por el
bucle for, y break.
• La idea de arreglos multidimensionales.
Ahora estás listo para tomar la prueba del módulo e intentar el desafío final: la Prueba del Módulo 3,
que te ayudará a evaluar lo que has aprendido hasta ahora.
También se ha hecho uso de algunos métodos, las cuales también son funciones, pero declarados de
una manera muy especifica.
Ahora aprenderás a escribir tus propias funciones, y como utilizarlas. Escribiremos varias de ellas
juntos, desde muy sencillas hasta algo complejas. Se requerirá de tu concentración y atención.
Muy a menudo ocurre que un cierto fragmento de código se repite muchas veces en un programa. Se
repite de manera literal o, con algunas modificaciones menores, empleando algunas otras variables
dentro del programa. También ocurre que un programador ha comenzado a copiar y pegar ciertas partes
del código en más de una ocasión en el mismo programa.
Puede ser muy frustrante percatarse de repente que existe un error en el código copiado. El
programador tendrá que escarbar bastante para encontrar todos los lugares en el código donde hay que
corregir el error. Además, existe un gran riesgo de que las correcciones produzcan errores adicionales.
Definamos la primer condición por la cual es una buena idea comenzar a escribir funciones propias: si
un fragmento de código comienza a aparecer en más de una ocasión, considera la posibilidad de
aislarlo en la forma de una función invocando la función desde el lugar en el que originalmente se
encontraba.
Puede suceder que el algoritmo que se desea implementar sea tan complejo que el código comience a
crecer de manera incontrolada y, de repente, ya no se puede navegar por él tan fácilmente.
Se puede intentar solucionar este problema comentando el código, pero pronto te darás cuenta que esto
empeorará la situación - demasiados comentarios hacen que el código sea más difícil de leer y
entender. Algunos dicen que una función bien escrita debe ser comprensible con tan solo una
mirada.
Un buen desarrollador divide el código (o mejor dicho: el problema) en piezas aisladas, y codifica
cada una de ellas en la forma de una función.
Esto simplifica considerablemente el trabajo del programa, debido a que cada pieza se codifica por
separado y consecuentemente se prueba por separado. A este proceso se le llama comúnmente
descomposición.
Existe una segunda condición: si un fragmento de código se hace tan extenso que leerlo o
entenderlo se hace complicado, considera dividirlo pequeños problemas por separado e
implementa cada uno de ellos como una función independiente.
Esta descomposición continua hasta que se obtiene un conjunto de funciones cortas, fáciles de
comprender y probar.
Descomposición
Es muy común que un programa sea tan largo y complejo que no puede ser asignado a un solo
desarrollador, y en su lugar un equipo de desarrolladores trabajarán en el. El problema, debe ser
dividido entre varios desarrolladores de una manera en que se pueda asegurar su eficiencia y
cooperación.
Es inconcebible que más de un programador deba escribir el mismo código al mismo tiempo, por lo
tanto, el trabajo debe de ser dividido entre todos los miembros del equipo.
Este tipo de descomposición tiene diferentes propósitos, no solo se trata de compartir el trabajo, sino
también de compartir la responsabilidad entre varios desarrolladores.
Cada uno debe escribir un conjunto bien definido y claro de funciones, las cuales al ser combinadas
dentro de un módulo (esto se clarificara un poco mas adelante) nos dará como resultado el producto
final.
Esto nos lleva directamente a la tercera condición: si se va a dividir el trabajo entre varios
programadores, se debe descomponer el problema para permitir que el producto sea
implementado como un conjunto de funciones escritas por separado empacadas juntas en
diferentes módulos.
• De Python mismo: varias funciones (como print()) son una parte integral de Python, y
siempre están disponibles sin algún esfuerzo adicional del programador; se les llama a estas
funciones funciones integradas.
• De los módulos preinstalados de Python: muchas de las funciones, las cuales comúnmente son
menos utilizadas que las integradas, están disponibles en módulos instalados juntamente con
Python; para poder utilizar estas funciones el programador debe realizar algunos pasos
adicionales (se explicará acerca de esto en un momento).
• Directamente del código: tu puedes escribir tus propias funciones, colocarlas dentro del
código, y usarlas libremente.
• Existe una posibilidad más, pero se relaciona con clases, se omitirá por ahora.
Tu primer función
Observa el fragmento de código en el editor.
Es bastante sencillo, es un ejemplo de como transformar una parte de código que se esta repitiendo
en una función.
El mensaje enviado a la consola por la función print() es siempre el mismo. El código es funcional
y no contiene errores, sin embargo imagina tendrías que hacer si tu jefe pidiera cambiar el mensaje para
que fuese mas cortés, por ejemplo, que comience con la frase "Por favor,".
Tendrías que tomar algo de tiempo para cambiar el mensaje en todos los lugares donde aparece
(podrías hacer uso de copiar y pegar, pero eso no lo haría mas sencillo). Es muy probable que cometas
errores durante el proceso de corrección, eso traería frustración a ti y a tu jefe.
¿Es posible separar ese código repetido, darle un nombre y hacerlo reutilizable? Significaría que el
cambio hecho en un solo lugar será propagado a todos los lugares donde se utilice.
Para que esto funcione, dicho código debe ser invocado cada vez que se requiera.
Es posible, esto es exactamente para lo que existen las funciones.
print("Ingresa un valor: ")
a = int(input())
Tu primer función
¿Cómo es que se crea dicha función?
Se necesita definirla. Aquí, la palabra define es significativa.
Así es como se ve la definición más simple de una función:
cuerpoFuncion
La función es muy sencilla, pero completamente utilizable. Se ha nombrado mensaje, pero eso es
opcional, tu puedes cambiarlo. Hagamos uso de ella.
El código ahora contiene la definición de la función:
def mensaje():
print("Ingresa un valor: ")
print("Se comienza aquí.")
print("Se termina aquí.")
Esto significa que Python lee la definición de la función y la recuerda, pero no la ejecuta sin permiso.
• Cuando se invoca una función, Python recuerda el lugar donde esto ocurre y salta hacia dentro
de la función invocada.
• El cuerpo de la función es entonces ejecutado.
• Al llegar al final de la función, Python regresa al lugar inmediato después de donde ocurrió la
invocación.
Existen dos consideraciones muy importantes, la primera de ella es:
No se debe invocar una función antes de que se haya definido.
Recuerda: Python lee el código de arriba hacia abajo. No va a adelantarse en el código para determinar
si la función invocada esta definida mas adelante, el lugar correcto para definirla es antes de ser
invocada.
Se ha insertado un error en el código anterior - ¿Puedes notar la diferencia?
print("Se comienza aquí.")
mensaje()
print("Se termina aquí.")
def mensaje():
print("Ingresa un valor: ")
Se ha movido la función al final del código. ¿Podrá Python encontrarla cuando la ejecución llegue a la
invocación?
No, no podrá. El mensaje de error dirá:
NameError: name 'mensaje' is not defined
No intentes forzar a Python a encontrar funciones que no están definidas en el lugar correcto.
La segunda consideración es mas sencilla:
Una función y una variable no pueden compartir el mismo nombre.
El siguiente fragmento de código es erróneo:
def mensaje():
print("Ingresa un valor: ")
mensaje = 1
El asignar un valor al nombre "mensaje" causa que Python olvide su rol anterior. La función con el
nombre de mensaje ya no estará disponible.
Afortunadamente, es posible combinar o mezclar el código con las funciones - no es forzoso colocar
todas las funciones al inicio del archivo fuente.
Observa el siguiente código:
print("Se comienza aquí.")
def mensaje():
print("Ingresa un valor: ")
mensaje()
print("Se termina aquí.")
El modificar el mensaje de entrada es ahora sencillo: se puede hacer con solo modificar el código una
única vez - dentro del cuerpo de la función.
Abre Sandbox, e inténtalo tu mismo.
Puntos Clave
1. Una función es un bloque de código que realiza una tarea especifica cuando la función es llamada
(invocada). Las funciones son útiles para hacer que el código sea reutilizable, que este mejor
organizado y más legible. Las funciones contienen parámetros y pueden regresar valores.
2. Existen al menos cuatro tipos de funciones básicas en Python:
• Funciones integradas las cuales son partes importantes de Python (como lo es la función
print()). Puedes ver una lista completa de las funciones integradas de Python en la siguiente
liga: [Link]
• También están las que se encuentran en módulos pre-instalados (se hablará acerca de ellas en
el Módulo 5 de este curso).
• Funciones definidas por el usuario las cuales son escritas por los programadores para los
programadores, puedes escribir tus propias funciones y utilizarlas libremente en tu código.
• Las funciones lambda (aprenderás acerca de ellas en el Módulo 6 del curso).
3. Las funciones propias se pueden definir utilizando la palabra reservada def y con la siguiente
sintaxis:
def tuFuncion (parámetros opcionales):
# el cuerpo de la función
Se puede definir una función sin que haga uso de argumentos, por ejemplo:
def mensaje(): # definiendo una función
print("Hola") # cuerpo de la función
mensaje() # invocación de la función
También es posible definir funciones con argumentos, como la siguiente que contiene un solo
parámetro:
def hola(nombre): # definiendo una función
print("Hola,", nombre) # cuerpo de la función
nombre = input("Ingresa tu nombre: ")
hola(nombre) # invocación de la función
Ejercicio 3
¿Qué es lo que ocurrirá cuando se ejecute el siguiente código?
def hola():
print("hola")
hola(5)
Se genera una excepción (la excepción TypeError) - la función hola() no toma argumentos.
• Los parámetros solo existen dentro de las funciones en donde han sido definidos, y el único
lugar donde un parámetro puede ser definido es entre los paréntesis después del nombre de la
función, donde se encuentra la palabra reservada def.
• La asignación de un valor a un parámetro de una función se hace en el momento en que la
función se manda llamar o se invoca, especificando el argumento correspondiente.
def funcion(parametro):
###
Recuerda que:
• Los parámetros solo existen dentro de las funciones (este es su entorno natural).
• Los argumentos existen fuera de las funciones, y son los que pasan los valores a los
parámetros correspondientes.
Existe una clara división entre estos dos mundos.
Enriquezcamos la función anterior agregándole un parámetro, se utilizará para mostrar al usuario el
valor de un número que la función pide.
Se tendrá que modificar la definición def de la función, así es como se ve ahora:
def mensaje(numero):
###
Esta definición especifica que nuestra función opera con un solo parámetro con el nombre de numero.
Se puede utilizar como una variable normal, pero solo dentro de la función - no es visible en otro
lugar.
Ahora hay que mejorar el cuerpo de la función:
def mensaje(numero):
print("Ingresa el número:", numero)
Se ha hecho buen uso del parámetro. Nota: No se le ha asignado al parámetro algún valor. ¿Es
correcto?
Si, lo es.
Un valor para el parámetro llegará del entorno de la función.
Recuerda: especificar uno o mas parámetros en la definición de la función es un requerimiento, y se
debe de cumplir durante la invocación de la misma. Se debe proveer el mismo numero de
argumentos como haya parámetros definidos.
El no hacerlo provocará un error.
Esto significa que se esta invocando la función pero esta faltando el argumento.
Aquí esta ya de manera correcta:
def mensaje(numero):
print("Ingresa un número:", numero)
mensaje(1)
¿Puedes ver como funciona? El valor del argumento utilizado durante la invocación (1) ha sido pasado
a la función, dándole un valor inicial al parámetro con el nombre de numero.
Ejecuta el código, modifícalo, agrega mas parámetros y ve como esto afecta la salida.
Nota: el paso de parámetros posicionales es usado de manera intuitiva por las personas en muchas
situaciones. Por ejemplo, es generalmente aceptado que cuando nos presentamos mencionamos primero
nuestro nombre(s) y después nuestro apellido, por ejemplo, "Me llamo Juan Pérez."
Sin embargo, En Hungría se hace al revés.
Implementemos esa costumbre en Python. La siguiente función es utilizada para presentar a alguien:
def presentar(primerNombre, segundoNombre):
print("Hola, mi nombre es", primerNombre, segundoNombre)
presentar("Luke", "Skywalker") presentar("Jesse", "Quick")
presentar("Clark", "Kent")
El concepto es claro: los valores pasados a los parámetros son precedidos por el nombre del parámetro
al que se le va a pasar el valor, seguido por el signo de =.
La posición no es relevante aquí, cada argumento conoce su destino con base en el nombre utilizado.
Debes de poder predecir la salida. Ejecuta el código y verifica tu respuesta.
Inténtalo tu mismo.
El combinar argumentos
posicionales y de palabras clave
Es posible combinar ambos tipos si se desea, solo hay una regla inquebrantable: se deben colocar
primero los argumentos posicionales y después los de palabras clave.
Piénsalo por un momento y entenderás el porque.
Para mostrarte como funciona, se utilizara la siguiente función de tres parámetros:
def suma(a, b, c):
print(a, "+", b, "+", c, "=", a + b + c)
También, se puede reemplazar la invocación actual por una con palabras clave, como la siguiente:
suma(c = 1, a = 2, b = 3)
Vamos a analizarla:
Se cuidadoso, ten cuidado de no cometer errores. Si se intenta pasar mas de un valor a un argumento,
ocurrirá un error y se mostrará lo siguiente:
Observa la siguiente invocación, se le esta asignando dos veces un valor al parámetro a:
suma(3,a = 1 b = 2)
Observa el siguiente código. Es un código completamente correcto y funcional, pero no tiene mucho
sentido:
suma(4, 3, c = 2)
Todo es correcto, pero el dejar solo un argumento con palabras clave es algo extraño - ¿Qué es lo que
opinas?
Solo se tiene que colocar el nombre del parámetro seguido del signo de = y el valor por default.
o así:
presentar (primerNombre="Guillermo")
no habrá errores, ambas invocaciones funcionarán, la consola mostrará los siguientes resultados:
Hola, mi nombre es Enrique González Hola, mi nombre es Guillermo
González
Pruébalo.
Puedes hacerlo con mas parámetros, si te resulta útil. Ambos parámetros tendrán sus valores por
default, observa el siguiente código:
def presentar(primerNombre="Juan", segundoNombre="González"):
print("Hola, mi nombre es ", primerNombre, segundoNombre)
La salida es:
Hola, mi nombre es Juan Rodríguez
Pruébalo.
Felicidades, has aprendido las maneras básicas de comunicación con funciones.
Puntos Clave
1. Se puede pasar información a las funciones utilizando parámetros. Las funciones pueden tener tantos
parámetros como sean necesarios.
Un ejemplo de una función con un parámetro:
def hola(nombre):
print("Hola,", nombre)
hola("Greg")
Es importante recordar que primero se especifican los argumentos posicionales y después los de
palabras clave. Es por esa razón que si se intenta ejecutar el siguiente código:
def resta(a, b):
print(a - b)
resta(5, b=2) # salida: 3
resta() # Syntax Error
3. Se puede utilizar la técnica de argumentos con palabras clave para asignar valores predefinidos a los
argumentos:
def nombre(nombre, apellido="Pérez"):
print(nombre, apellido) nombre("Andy") # salida: Andy Pérez
nombre("Bety", "Rodríguez") # salida: Bety Johnson (el argumento de
palabra clave es reemplazado por " Rodríguez ")
Ejercicio 1
¿Cuál es la salida del siguiente código?
def intro(a="James Bond", b="Bond"):
print("Mi nombre es", b + ".", a + ".")
intro()
Mi nombre es Bond. James Bond.
Ejercicio 2
¿Cuál es la salida del siguiente código?
def intro(a="James Bond", b="Bond"):
print("Mi nombre es", b + ".", a + ".")
intro(b="Sergio López")
Mi nombre es Sergio López. James Bond.
Ejercicio 3
¿Cuál es la salida del siguiente fragmento de código?
def intro(a, b="Bond"):
print("Mi nombre es", b + ".", a + ".")
intro("Susan")
Mi nombre es Bond. Susan.
Ejercicio 4
¿Cuál es la salida del siguiente código?
def suma(a, b=2, c):
print(a + b + c)
suma(a=1, c=3)
Esta palabra nos da una idea completa de sus capacidades. Nota: es una palabra reservada de Python.
La instrucción return tiene dos variantes diferentes: considerémoslas por separado.
Vamos a investigarlo.
Analiza la siguiente figura:
La instrucción return, enriquecida con la expresión (la expresión es muy simple aquí), "transporta"
el valor de la expresión al lugar donde se ha invocado la función.
El resultado se puede usar libremente aquí, por ejemplo, para ser asignado a una variable.
También puede ignorarse por completo y perderse sin dejar rastro.
Ten en cuenta que no estamos siendo muy educados aquí: la función devuelve un valor y lo ignoramos
(no lo usamos de ninguna manera):
def funcion_aburrida():
print("'Modo aburrimiento' ON.")
return 123
print("¡Esta lección es interesante!)
funcion_aburrida()
print("Esta lección es aburrida ...")
Espera un segundo, ¿Significa esto que también hay resultados inútiles? Sí, en cierto sentido.
Unas pocas palabras acerca de None
Permítenos presentarte un valor muy curioso (para ser honestos, un valor que es ninguno) llamado
None.
Sus datos no representan valor razonable alguno; en realidad, no es un valor en lo absoluto; por lo
tanto, no debe participar en ninguna expresión.
print(None + 2)
Solo hay dos tipos de circunstancias en las que None se puede usar de manera segura:
valor = None
if valor == None:
print("Lo siento, no tienes ningún valor")
No olvides esto: si una función no devuelve un cierto valor utilizando una cláusula de expresión
return, se asume que devuelve implícitamente None.
Vamos a probarlo
def strangeFunction(n):
if(n % 2 == 0):
return True
print(strangeFunction(2)) print(strangeFunction(1))
True None
No te sorprendas la próxima vez que veas None como el resultado de la función, puede ser el síntoma
de un error sutil dentro de la función.
El primero es: ¿Se puede enviar una lista a una función como un argumento?
¡Por supuesto que se puede! Cualquier entidad reconocible por Python puede desempeñar el papel de
un argumento de función, aunque debes asegurarte de que la función sea capaz de hacer uso de él.
Entonces, si pasas una lista a una función, la función tiene que manejarla como una lista.
def sumaDeLista(lst):
sum = 0
for elem in lst:
sum += elem
return sum
y se invoca así:
print(sumaDeLista([5, 4, 3]))
Regresará 12 como resultado, pero habrá problemas si la invocas de esta manera riesgosa:
print(sumaDeLista(5))
Esto se debe al hecho de que el bucle for no puede iterar un solo valor entero.
¡Si, por supuesto! Cualquier entidad reconocible por Python puede ser un resultado de función.
def strangeListFunction(n):
strangeList = []
[Link](0, i)
return strangeList
print(strangeListFunction(5))
[4, 3, 2, 1, 0]
Vamos a profundizar un poco más en los problemas relacionados con las variables en las funciones.
Esto es esencial para crear funciones efectivas y seguras.
LABORATORIO
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
Nota: también hemos preparado un breve código de prueba, que puedes utilizar para probar tu función.
El código utiliza dos listas: una con los datos de prueba y la otra con los resultados esperados. El
código te dirá si alguno de tus resultados no es válido.
def isYearLeap(year):
if year % 4 != 0:
return False
elif year % 100 != 0:
return True
elif year % 400 != 0:
return False
else:
return True
testdata = [1900, 2000, 2016, 1987]
testresults = [False, True, True, False]
for i in range(len(testdata)):
yr = testdata[i]
print(yr,"-> ",end="")
result = isYearLeap(yr)
if result == testresults[i]:
print("OK")
else:
print("Error")
LABORATORIO
Tiempo estimado
15-20 minutos
Nivel de dificultad
Medio
Requisitos previos
LABORATORIO [Link]
Objetivos
Familiarizar al estudiante con:
Escenario
Tu tarea es escribir y probar una función que toma dos argumentos (un año y un mes) y devuelve el
número de días del mes/año dado (mientras que solo febrero es sensible al valor year, tu función
debería ser universal).
La parte inicial de la función está lista. Ahora, haz que la función devuelva None si los argumentos no
tienen sentido.
Por supuesto, puedes (y debes) utilizar la función previamente escrita y probada (LAB [Link]). Puede
ser muy útil. Te recomendamos que utilices una lista con los meses. Puedea crearla dentro de la
función; este truco acortará significativamente el código.
Hemos preparado un código de prueba. Amplíalo para incluir más casos de prueba.
def isYearLeap(year):
if year % 4 != 0:
return False
elif year % 100 != 0:
return True
elif year % 400 != 0:
return False
else:
return True
def daysInMonth(year,month):
# if statement
# ...
days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
res = days[month - 1]
if month == 2 and isYearLeap(year):
res = 29
return res
LABORATORIO
Tiempo estimado
20-30 minutos
Nivel de dificultad
Medio
Requisitos previos
LAB [Link]
LAB [Link]
Objetivos
Familiarizar al estudiante con:
Escenario
Tu tarea es escribir y probar una función que toma tres argumentos (un año, un mes y un día del mes) y
devuelve el día correspondiente del año, o devuelve None si cualquiera de los argumentos no es válido.
Debes utilizar las funciones previamente escritas y probadas. Agrega algunos casos de prueba al
código. Esta prueba es solo el comienzo.
def isYearLeap(year):
if year % 4 != 0:
return False
elif year % 100 != 0:
return True
elif year % 400 != 0:
return False
else:
return True
LABORATORIO
Tiempo estimado
15-20 minutos
Nivel de dificultad
Medio
Objetivos
• Familiarizar al estudiante con nociones y algoritmos clásicos.
• Mejorar las habilidades del estudiante para definir y usar funciones.
Escenario
Un número natural es primo si es mayor que 1 y no tiene divisores más que 1 y si mismo.
¿Complicado? De ningúna manera. Por ejemplo, 8 no es un número primo, ya que puedes dividirlo
entre 2 y 4 (no podemos usar divisores iguales a 1 y 8, ya que la definición lo prohíbe).
Por otra parte, 7 es un número primo, ya que no podemos encontrar ningún divisor para el.
La función:
• Se llama isPrime.
• Toma un argumento (el valor a verificar).
• Devuelve True si el argumento es un número primo, y False de lo contrario.
Sugerencia: intenta dividir el argumento por todos los valores posteriores (comenzando desde 2) y
verifica el resto: si es cero, tu número no puede ser un número primo; analiza cuidadosamente cuándo
deberías detener el proceso.
Si necesitas conocer la raíz cuadrada de cualquier valor, puedes utilizar el operador **. Recuerda: la
raíz cuadrada de x es la misma que x0.5
Datos de prueba
Salida esperada:
2 3 5 7 11 13 17 19
def isPrime(num):
for i in range(2, int(1 + num ** 0.5)):
if num % i == 0:
return False
return True
LABORATORIO
Tiempo estimado
10-15 minutos
Nivel de dificultad
Fácil
Objetivos
• Mejorar las habilidades del estudiante para definir, utilizar y probar funciones.
Escenario
El consumo de combustible de un automóvil se puede expresar de muchas maneras diferentes. Por
ejemplo, en Europa, se muestra como la cantidad de combustible consumido por cada 100 kilómetros.
En los EE. UU., se muestra como la cantidad de millas recorridas por un automóvil con un galón de
combustible.
Tu tarea es escribir un par de funciones que conviertan l/100km a mpg(milas por galón), y viceversa.
Las funciones:
Datos de prueba
Salida esperada:
60.31143162393162
31.36194444444444
23.52145833333333
3.9007393587617467
7.490910297239916
10.009131205673757
def l100kmtompg(litres):
gallons = litres / 3.785411784
miles = 100 * 1000 / 1609.344
return miles / gallons
def mpgtol100km(miles):
km100 = miles * 1609.344 / 1000 / 100
litres = 3.785411784
return litres / km100
print(l100kmtompg(3.9))
print(l100kmtompg(7.5))
print(l100kmtompg(10.))
print(mpgtol100km(60.3))
print(mpgtol100km(31.4))
print(mpgtol100km(23.5))
Puntos clave
1. Puedes emplear la palabra clave return para decirle a una función que devuelva algún valor. La
instrucción return termina la función, por ejemplo:
2. El resultado de una función se puede asignar fácilmente a una variable, por ejemplo:
def deseos():
return "¡Felíz Cumpleaños!"
d = deseos()
print(d) # salida: ¡Felíz Cumpleaños!
# Ejemplo 1
def deseos():
print("Mis deseos")
return "¡Felíz Cumpleaños!"
deseos() # salida: Mis deseos
# Ejemplo 2
def deseos():
print("Mis Deseos")
return "¡Feliz Cumpleaños!"
print(deseos()) # salidas: Mis Deseos
# ¡Feliz Cumpleaños!
3. Puedes usar una lista como argumento de una función, por ejemplo:
def HolaaTodos(myList):
for nombre in myList:
print("Hola,", nombre)
HolaaTodos(["Adam", "John", "Lucy"])
def createList(n):
myList = []
for i in range(n):
[Link](i)
return myList
print(createList(5))
Ejercicio 1
def hola():
return
print("¡Hola!")
hola()
Ejercicio 2
def isInt(data):
if type(data) == int:
return True
elif type(data) == float:
return False
print(isInt(5))
print(isInt(5.0))
print(isInt("5"))
True
False
None
Ejercicio 3
def evenNumLst(ran):
lst = []
for num in range(ran):
if num % 2 == 0:
[Link](num)
return lst
print(evenNumLst(11))
[0, 2, 4, 6, 8, 10]
Ejercicio 4
¿Cuál es la salida del siguiente fragmento de código?
def listUpdater(lst):
updList = []
for elem in lst:
elem **= 2
[Link](elem)
return updList
l = [1, 2, 3, 4, 5]
print(listUpdater(l))
El alcance de un nombre (por ejemplo, el nombre de una variable) es la parte del código donde el
nombre es reconocido correctamente.
Por ejemplo, el alcance del parámetro de una función es la función en si misma. El parámetro es
inaccesible fuera de la función.
def scopeTest():
x = 123
scopeTest()
print(x)
Vamos a conducir algunos experimentos para mostrar como es que Python define los alcances y como
los puedes utilizar para tu beneficio.
def miFuncion():
var = 1
miFuncion()
print(var)
¿Conozco a la variable? 1 1
La respuesta es: una variable que existe fuera de una función tiene alcance dentro del cuerpo de la
función.
def miFuncion():
var = 2 print("¿Conozco a la variable?", var)
var = 1
miFuncion()
print(var)
El resultado ha cambiado tambiénm el código arroja una salida con una ligera diferencia:
¿Conozco a la variable? 2 1
• La variable var creada dentro de la función no es la misma que la que se definió fuera de ella,
parece ser que hay dos variables diferentes con el mismo nombre.
• La variable de la función es una sombra de la variable fuera de la función.
También significa que el alcance de una variable existente fuera de una función solo se puede
implementar dentro de una función cuando su valor es leído. El asignar un valor hace que la
función cree su propia variable.
Existe un método especial en Python el cual puede extender el alcance de una variable incluyendo el
cuerpo de las funciones para poder no solo leer los valores de las variables sino también modificarlos.
El utilizar la palabra reservada dentro de una función con el nombre o nombres de las variables
separados por comas, obliga a Python a abstenerse de crear una nueva variable dentro de la función; se
empleará la que se puede acceder desde el exterior.
En otras palabras, este nombre se convierte en global (tiene un alcance global, y no importa si se esta
leyendo o asignando un valor).
def miFuncion():
global var
var = 2
print("¿Conozco a aquella variable?", var)
var = 1
miFuncion()
print(var)
Esto debe de ser suficiente evidencia para mostrar lo que la palabra reservada global puede hacer.
El código en editor nos enseña algo. Como puedes observar, la función cambia el valor de su
parámetro. ¿Este cambio afecta el argumento?
def miFuncion(n):
print("Yo obtuve", n)
n += 1
print("Yo ahora tengo", n)
var = 1
miFuncion(var)
print(var)
Yo obtuve 1
Yo ahora tengo 2
1
La conclusión es obvia - al cambiar el valor del parámetro este no se propaga fuera de la función
(más específicamente, no cuando la variable es un valor escalar, como en el ejemplo).
Esto también significa que una función recibe el valor del argumento, no el argumento en sí. Esto es
cierto para los valores escalares.
Vale la pena revisar cómo funciona esto con las listas (¿Recuerdas las peculiaridades de asignar rodajas
de listas en lugar de asignar la lista entera?)
def miFuncion(miLista1):
print(miLista1)
miLista1 = [0, 1]
miLista2 = [2, 3]
miFuncion(miLista2)
print(miLista2)
No se modifica el valor del parámetro miLista1 (ya se sabe que no afectará el argumento), en lugar de
ello se modificará la lista identificada por el.
[2, 3] [3]
Intentémoslo:
• Si el argumento es una lista, el cambiar el valor del parámetro correspondiente no afecta la lista
(Recuerda: las variables que contienen listas son almacenadas de manera diferente que las
escalares).
• Pero si se modifica la lista identificada por el parámetro (Nota: ¡La lista no el parámetro!), la
lista reflejará el cambio.
Puntos Clave
1. Una variable que existe fuera de una función tiene alcance dentro del cuerpo de la función. (Ejemplo
1) al menos que la función defina una variable con el mismo nombre. (Ejemplo 2, y Ejemplo 3), por
ejemplo:
Ejemplo 1:
var = 2
def multByVar(x):
return x * var
print(multByVar(7)) # salida: 14
Ejemplo 2:
def mult(x):
var = 5
return x * var
print(mult(7)) # salida: 35
Ejemplo 3:
def multip(x):
var = 7
return x * var
var = 3
print(multip(7)) # salida: 49
2. Una variable que existe dentro de una función tiene un alcance solo dentro del cuerpo de la función
(Ejemplo 4), por ejemplo:
Ejemplo 4:
def sum(x):
var = 7
return x + var
print(sum(4)) # salida: 11
print(var) # NameError
3. Se puede emplear la palabra reservada global seguida por el nombre de una variable para que el
alcance de la variable sea global, por ejemplo:
var = 2
print(var) # salida: 2
def retVar():
global var
var = 5
return var
print(retVar()) # salida: 5
print(var) # salida: 5
Ejercicio 1
def message():
alt = 1
print("Hola, mundo!")
print(alt)
Ejercicio 2
a = 1
def fun():
a = 2
print(a)
fun()
print(a)
Ejercicio 3
a = 1
def fun():
global a
a = 2 print(a)
fun()
a = 3
print(a)
Ejercicio 4
a = 1
def fun():
global a
a = 2
print(a)
a = 3
fun()
print(a)
La nueva función tendrá dos parámetros. Su nombre será imc, pero si prefieres utilizar otro nombre,
adelante.
Codifiquemos la función.
19.283746556473833
La función hace lo que deseamos, pero es un poco sencilla - asume que los valores de ambos
parámetros son significativos. Se debe comprobar que son confiables.
Primero, se asegura que los datos que sean ingresados sean correctos, de lo contrario la salida será:
None
Segundo, observa como el símbolo de diagonal invertida (\) es empleado. Si se termina una línea de
código con el, Python entenderá que la línea continua en la siguiente.
Esto puede ser útil cuando se tienen largas líneas de código y se desea que sean mas legibles.
Sin embargo, hay algo que omitimos: las medias en sistema inglés. La función no es útil para personas
que utilicen libras, pies y pulgadas.
Es bien conocido que 1 lb = 0.45359237 kg. Esto lo emplearemos en nuestra nueva función.
def lbakg(lb):
return lb * 0.45359237
print(lbakg(1))
0.45359237
Haremos lo mismo ahora con los pies y pulgadas: 1 pie = 0.3048 m, y 1 pulgada = 2.54 cm =
0.0254 m.
0.3302
print(piespulgam(6, 0))
Esta es la salida:
1.8288000000000002
Es muy posible que en ocasiones se desee utilizar solo pies sin pulgadas. ¿Python nos ayudará? Por
supuesto que si.
1.8288000000000002
Finalmente, el código es capaz de responder a la pregunta: ¿Cual es el IMC de una persona que tiene
5'7" de altura y un peso de 176 lbs?
def lbsakg(lb):
return lb * 0.45359237
La respuesta es:
27.565214082533313
No será algo difícil. La función tendrá tres parámetros - uno para cada lado.
Regresará True si todos los lados pueden formar un triángulo, y False de lo contrario. En este caso,
esUnTringulo es un buen nombre para dicha función.
True False
Se ha negado la condición (se invirtieron los operadores relacionales y se reemplazaron los ors con
ands, obteniendo una expresión universal para probar triángulos).
Coloquemos la función en un programa más grande. Se le pedirá al usuario los tres valores y se hará
uso de la función.
c2 = a2 + b2
Observa como se establece la relación entre la hipotenusa y los dos catetos. Se eligió el lado mas largo
y se aplico el Teorema de Pitágoras para verificar que todo estuviese en orden. Esto requiere tres
revisiones en total.
def esUnTriangulo(a, b, c):
return a + b > c and b + c > a and c + a > b
if esUnTriangulo(a, b, c):
print("Felicidades, puede ser un triángulo.")
else:
print("Lo siento, no puede ser un triángulo.")
Vamos a emplear el operador de exponenciación para calcular la raíz cuadrada - puede ser extraño,
pero funciona.
0.49999999999999983
No, no lo es. Son solo los cálculos de valores punto flotantes. Pronto se discutirá el tema.
if esUnTriangulo(a, b, c):
print("Felicidades, puede ser un triángulo.")
else:
print("Lo siento, no puede ser un triángulo.")
0! = 1 (¡Si!, es verdad.)
1! = 1
2! = 1 * 2
3! = 1 * 2 * 3
4! = 1 * 2 * 3 * 4
:
:
n! = 1 * 2 ** 3 * 4 * ... * n-1 * n
Se expresa con un signo de exclamación, y es igual al producto de todos los números naturales
previos al argumento o número dado.
Escribamos el código. Creemos una función con el nombre factorialFun. Aquí esta el código:
def factorialFun(n):
if n < 0:
return None
if n < 2:
return 1 producto = 1
for i in range(2, n + 1):
producto *= i
return producto
for n in range(1, 6): # probando
print(n, factorialFun(n))
Observa como se sigue el procedimiento matemático, y como se emplea el bucle for para encontrar el
producto.
1 1
2 2
3 6
4 24
5 120
Son una secuencia de números enteros los cuales siguen una regla sencilla:
fib1 = 1
fib2 = 1
fib3 = 1 + 1 = 2
fib4 = 1 + 2 = 3
fib5 = 2 + 3 = 5
fib6 = 3 + 5 = 8
fib7 = 5 + 8 = 13
def fib(n):
if n < 1:
return None
if n < 3:
return 1
elem1 = elem2 = 1
sum = 0
for i in range(3, n + 1):
sum = elem1 + elem2
elem1, elem2 = elem2, sum
return sum
for n in range(1, 10): # probando
print(n, "->", fib(n))
Analiza el codigo del bucle for cuidadosamente, descifra como se mueven las variables elem1 y
elem2 a través de los números subsecuentes de la serie Fibonacci.
1 -> 1
2 -> 1
3 -> 2
4 -> 3
5 -> 5
6 -> 8
7 -> 13
8 -> 21
9 -> 34
Este termino puede describir muchos conceptos distintos, pero uno de ellos, hace referencia a la
programación computacional.
Tanto el factorial como la serie Fibonacci, son las mejores opciones para ilustrar este fenómeno.
El número ith se refiere al número i-1, y así sucesivamente hasta llegar a los primeros dos.
¿Puede ser empleado en el código? Por supuesto que puede. Puede hacer el código mas corto y claro.
def fib(n):
if n < 1:
return None
if n < 3:
return 1
return fib(n - 1) + fib(n - 2)
n! = 1 × 2 × 3 × ... × n-1 × n
Es obvio que:
n! = (n-1)! × n
Aquí esta:
def factorialFun(n):
if n < 0:
return None
if n < 2:
return 1
return n * factorialFun(n - 1)
Nuestro viaje funcional esta por terminar. La siguiente sección abordara dos tipos de datos en Python:
tuplas y diccionarios.
def fib(n):
if n < 1:
return None
if n < 3:
return 1
elem1 = elem2 = 1
sum = 0
for i in range(3, n + 1):
sum = elem1 + elem2
elem1, elem2 = elem2, sum
return sum
for n in range(1, 10):
print(n, "->", fib(n))
Puntos Clave
1. Una función puede invocar otras funciones o incluso a sí misma. Cuando una función se invoca a si
misma, se le conoce como recursividad, y la función que se invoca a si misma y contiene una
condición de terminación (la cual le dice a la función que ya no siga invocándose a si misma) es
llamada una función recursiva.
2. Se pueden emplear funciones recursivas en Python para crear funciones limpias, elegantes, y
dividir el código en trozos más pequeños. Sin embargo, se debe tener mucho cuidado ya que es muy
fácil cometer un error y crear una función la cual nunca termine. También se debe considerar que
las funciones recursivas consumen mucha memoria, y por lo tanto pueden ser en ocasiones
ineficientes.
Al emplear la recursividad, se deben de tomar en cuenta tanto sus ventajas como desventajas.
print(factorial(4)) # 4 * 3 * 2 * 1 = 24
Ejercicio 1
def factorial(n):
return n * factorial(n - 1)
print(factorial(4))
La función no tiene una condición de terminación, por lo tanto Python arrojara una excepción
(RecursionError: maximum recursion depth exceeded)
Ejercicio 2
56
Un tipo de secuencia es un tipo de dato en Python el cual es capaz de almacenar mas de un valor
(o ninguno si la secuencia esta vacía), los cuales pueden ser secuencialmente (de ahí el nombre)
examinados, elemento por elemento.
Debido a que el bucle for es una herramienta especialmente diseñada para iterar a través de las
secuencias, podemos definirlas de la siguiente manera: una secuencia es un tipo de dato que puede
ser escaneado por el bucle for.
Hasta ahora, has trabajado con una secuencia en Python, la lista. La lista es un clásico ejemplo de una
secuencia de Python. Aunque existen otras secuencias dignas de mencionar, las cuales se presentaran a
continuación.
La segunda noción - la mutabilidad - es una propiedad de cualquier tipo de dato en Python que
describe su disponibilidad para poder cambiar libremente durante la ejecución de un programa. Existen
dos tipos de datos en Python: mutables e inmutables.
Los datos mutables pueden ser actualizados libremente en cualquier momento, a esta operación se
le denomina "in situ".
In situ es una expresión en Latín que se traduce literalmente como en posición, en el lugar o momento.
Por ejemplo, la siguiente instrucción modifica los datos "in situ":
[Link](1)
Imagina que una lista solo puede ser asignada y leída. No podrías adjuntar ni remover un elemento de
la lista. Si se agrega un elemento al final de la lista provocaría que la lista se cree desde cero.
Se tendría que crear una lista completamente nueva, la cual contenga los elementos ya existentes mas el
nuevo elemento.
El tipo de datos que se desea tratar ahora se llama tupla. Una tupla es una secuencia inmutable. Se
puede comportar como una lista pero no puede ser modificada en el momento.
Observa el ejemplo:
print(tupla1) print(tupla2)
Nota: cada elemento de una tupla puede ser de distinto tipo (punto flotante, entero, cadena, etc.).
tuplaVacia = ()
Si se desea crear una tupla de un solo elemento, se debe de considerar el hecho de que, debido a la
sintaxis (una tupla debe de poder distinguirse de un valor entero ordinario), se debe de colocar una
coma al final:
El quitar las comas no arruinará el programa en el sentido sintáctico, pero serán variables no tuplas.
Las similitudes pueden ser engañosas - no intentes modificar en contenido de la tupla ¡No es una
lista!
miTupla = (1, 10, 100, 1000) [Link](10000) del miTupla[0] miTupla[1] = -10
La salida es la siguiente:
9 (1, 10, 100, 1000, 10000) (1, 10, 100, 1, 10, 100, 1, 10, 100) True True
Una de las propiedades de las tuplas mas útiles es que pueden aparecer en el lado izquierdo del
operador de asignación. Este fenómeno ya se vio con anterioridad, cuando fue necesario encontrar
una manera de intercambiar los valores entre dos variables.
var = 123 t1 = (1, ) t2 = (2, ) t3 = (3, var) t1, t2, t3 = t2, t3, t1 print(t1, t2,
t3)
Muestra tres tuplas interactuando en efecto, los valores almacenados en ellas "circulan" entre ellas. t1
se convierte en t2, t2 se convierte en t3, y t3 se convierte en t1.
Nota: el ejemplo presenta un importante hecho mas: los elementos de una tupla pueden ser
variables, no solo literales. Además, pueden ser expresiones si se encuentran en el lado derecho del
operador de asignacion.
print(len(t2))
print(t1)
print(t2)
print(10 in miTupla)
print(-10 not in miTupla)
¿Qué es un diccionario?
El diccionario es otro tipo de estructura de datos de Python. No es una secuencia (pero puede
adaptarse fácilmente a un procesamiento secuencial) y además es mutable.
Para explicar lo que es un diccionario en Python, es importante comprender de manera literal lo que es
un diccionario.
Un diccionario en Python funciona de la misma manera que un diccionario bilingüe. Por ejemplo, se
tiene la palabra en español "gato" y se necesita su equivalente en francés. Lo que se haría es buscar en
el diccionario para encontrar la palabra "gato". Eventualmente la encontrarás, y sabrás que la palabra
equivalente en francés es "chat".
En el mundo de Python, la palabra que se esta buscando se denomina clave(key). La palabra que se
obtiene del diccionario es denominada valor.
• Cada clave debe de ser única. No es posible tener una clave duplicada.
• Una clave puede ser un tipo de dato de cualquier tipo: puede ser un número (entero o
flotante), o incluso una cadena.
• Un diccionario no es una lista. Una lista contiene un conjunto de valores numerados, mientras
que un diccionario almacena pares de valores.
• La función len() aplica también para los diccionarios, regresa la cantidad de pares (clave-
valor) en el diccionario.
• Un diccionario es una herramienta de un solo sentido. Si fuese un diccionario español-
francés, podríamos buscar en español para encontrar su contraparte en francés mas no
viceversa.
En este primer ejemplo, el diccionario emplea claves y valores las cuales ambas son cadenas. En el
segundo, las claves con cadenas pero los valores son enteros. El orden inverso (claves → números,
valores → cadenas) también es posible, así como la combinación número a número.
La lista de todos los pares es encerrada con llaves, mientras que los pares son separados por comas,
y las claves y valores por dos puntos.
Los diccionarios vacíos son construidos por un par vacío de llaves - nada inusual.
El diccionario entero se puede imprimir con una invocación a la función print(). El fragmento de
código puede producir la siguiente salida:
Primeramente, recordemos que los diccionarios no son listas - no guardan el orden de sus datos, el
orden no tiene significado (a diferencia de los diccionarios reales). El orden en que un diccionario
almacena sus datos esta fuera de nuestro control. Esto es normal. (*)
NOTA
(*) En Python 3.6x los diccionarios se han convertido en colecciones ordenadas de manera
predeterminada. Tu resultado puede variar dependiendo en la versión de Python que se este utilizando.
print(dict['gato']) print(numerosTelefono['Suzy'])
El obtener el valor de un diccionario es semejante a la indexación, gracias a los corchetes alrededor del
valor de la clave.
Nota:
• Si una clave es una cadena, se tiene que especificar como una cadena.
• Las claves son sensibles a las mayúsculas y minúsculas: 'Suzy' sería diferente a 'suzy'.
chat 5557654321
Ahora algo muy importante: No se puede utilizar una clave que no exista. Hacer algo como lo
siguiente:
print(numerosTelefono['presidente'])
Afortunadamente, existe una manera simple de evitar dicha situación. El operador in, junto con su
acompañante, not in, pueden salvarnos de esta situación.
No y si.
No, porque un diccionario no es un tipo de dato secuencial - el bucle for no es útil aquí.
Si, porque hay herramientas simples y muy efectivas que pueden adaptar cualquier diccionario a los
requerimientos del bucle for (en otras palabras, se construye un enlace intermedio entre el
diccionario y una entidad secuencial temporal).
El primero de ellos es un método denominado keys(), el cual es parte de todo diccionario. El método
retorna o regresa una lista de todas las claves dentro del diccionario. Al tener una lista de claves se
puede acceder a todo el diccionario de una manera fácil y útil.
La función sorted()
¿Deseas que la salida este ordenada? Solo hay que agregar al bucle for lo siguiente:
Nota la manera en que la tupla ha sido utilizada como una variable del bucle for.
También existe un método denominado values(), funciona de manera muy similar al de keys(), pero
regresa una lista de valores.
Como el diccionario no es capaz de automáticamente encontrar la clave de un valor dado, el rol de este
método es algo limitado.
cheval
chien
chat
Se va a reemplazar el valor "chat" por "minou", lo cual no es muy adecuado, pero funcionará con
nuestro ejemplo.
Observa:
dict = {"gato" : "chat", "perro" : "chien", "caballo" : "cheval"}
dict['gato'] = 'minou'
print(dict)
La salida es:
Nota: este es un comportamiento muy diferente comparado a las listas, las cuales no permiten asignar
valores a índices no existentes.
EXTRA
También es posible insertar un elemento al diccionario utilizando el método update(), por ejemplo:
Eliminado claves
¿Puedes deducir como eliminar una clave de un diccionario?
Nota: al eliminar la clave también se removerá el valor asociado. Los valores no pueden existir sin
sus claves.
A continuación un ejemplo:
EXTRA
En versiones anteriores de Python, por ejemplo, antes de la 3.6.7, el método popitem() elimina un
elemento al azar del diccionario.
• Línea 1: crea un diccionario vacío para ingresar los datos: el nombre del alumno es empleado
como clave, mientras que todas las calificaciones asociadas son almacenadas en una tupla (la
tupla puede ser el valor de un diccionario, esto no es un problema).
• Línea 3: se ingresa a un bucle "infinito" (no te preocupes, saldrémos de el en el momento
indicado).
• Línea 4: se lee el nombre del alumno.
• Línea 5-6: si el nombre es exit, nos salimos del bucle.
• Línea 8: se pide la calificación del alumno (un valor entero en el rango del 1-10).
• Línea 10-11: si el nombre del estudiante ya se encuentra en el diccionario, se alarga la tupla
asociada con la nueva calificación (observa el operador +=).
• Línea 12-13: si el estudiante es nuevo (desconocido para el diccionario), se crea una entrada
nueva, su valor es una tupla de un solo elemento la cual contiene la calificación ingresada.
• Línea 15: se itera a través de los nombres ordenados de los estudiantes.
• Línea 16-17: inicializa los datos necesarios para calcular el promedio (sumador y contador).
• Línea 18-20: Se itera a través de la tupla, tomado todas las calificaciones subsecuentes y
actualizando la suma junto con el contador.
• Línea 21: se calcula e imprime el promedio del alumno junto con su nombre.
grupo = {}
while True:
nombre = input("Ingresa el nombre del estudiante (o exit para
detenerse): ")
if nombre == 'exit':
break
if nombre in grupo:
grupo[nombre] += (calif,)
else:
grupo[nombre] = (calif,)
miTupla = (1, 2, True, "una cadena", (3, 4), [5, 6], None)
print(miTupla)
miLista = [1, 2, True, "una cadena", (3, 4), [5, 6], None]
print(miLista)
Cada elemento de la tupla puede ser de un tipo de dato diferente (por ejemplo, enteros, cadenas,
boleanos, etc.). Las tuplas pueden contener otras tuplas o listas (y viceversa).
tuplaVacia = ()
print(type(tuplaVacia)) # salida: <class 'tuple'>
miTup1 = 1,
print(type(miTup1)) # salida: <class 'tuple'>
miTup2 = 1
print(type(miTup2)) # salida: <class 'int'>
miTupla = (1, 2.0, "cadena", [3, 4], (5, ), True) print(miTupla[3]) # salida: [3,
4]
5. Las tuplas son inmutables, lo que significa que no se puede agregar, modificar, cambiar o quitar
elementos. El siguiente fragmento de código provocará una excepción:
miTupla = 1, 2, 3,
del miTupla
print(miTupla) # NameError: name 'miTupla' is not defined
6. Puedes navegar a través de los elementos de una tupla con un bucle (Ejemplo 1), verificar si un
elemento o no esta presente en la tupla (Ejemplo 2), emplear la función len() para verificar cuantos
elementos existen en la tupla (Ejemplo 3), o incluso unir o multiplicar tuplas (Ejemplo 4):
# Ejemplo 1
t1 = (1, 2, 3)
for elem in t1:
print(elem)
# Ejemplo 2
t2 = (1, 2, 3, 4)
print(5 in t2)
print(5 not in t2)
# Ejemplo 3
t3 = (1, 2, 3, 5)
print(len(t3))
# Ejemplo 4
t4 = t1 + t2
t5 = t3 * 2
print(t4)
print(t5)
EXTRA
También se puede crear una tupla utilizando la función integrada de Python tuple(). Esto es
particularmente útil cuando se desea convertir un iterable (por ejemplo, una lista, rango, cadena,
etcétera) en una tupla:
De la misma manera, cuando se desea convertir un iterable en una liste, se puede emplear la función
integrada de Python denominada list():
tup = 1, 2, 3,
lst = list(tup)
print(type(lst)) # outputs: <class 'list'>
Cada diccionario es un par de clave : valor. Se puede crear empleado la siguiente sintaxis:
miDictionario = {
clave1 : valor1,
clave2 : valor2,
clave3 : valor3,
}
2. Si se desea acceder a un elemento del diccionario, se puede hacer haciendo referencia a su clave
colocándola dentro de corchetes (ejemplo 1) o utilizando el método get() (ejemplo 2):
polEspDict = {
"kwiat" : "flor",
"woda" : "agua",
"gleba" : "tierra"
}
elemento1 = polEspDict["gleba"] # ejemplo 1
print(elmento1) # salida: tierra
elemento2 = [Link]("woda")
print(elemento2) # salida: agua
3. Si se desea cambiar el valor asociado a una clave especifica, se puede hacer haciendo referencia a la
clave del elemento, a continuación se muestra un ejemplo:
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
polEspDict["zamek"] = "cerradura"
item = polEspDict["zamek"] # salida: cerradura
4. Para agregar o eliminar una clave (junto con su valor asociado), emplea la siguiente sintaxis:
5. Se puede emplear el bucle for para iterar a través del diccionario, por ejemplo:
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
for item in polEspDict:
print(item) # salida: zamek
# woda
# gleba
6. Si deseas examinar los elementos (claves y valores) del diccionario, puedes emplear el método
items() por ejemplo:
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
for clave, valor in [Link]():
print("Pol/Esp ->", clave, ":", valor)
7. Para comprobar si una clave existe en un diccionario, se puede emplear la palabra reservada in:
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra" }
if "zamek" in polEspDict:
print("SI")
else:
print("NO")
8. Se puede emplear la palabra reservada del para eliminar un elemento, o un diccionario entero. Para
eliminar todos los elementos de un diccionario se debe emplear el método clear():
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
print(len(polEspDict)) # salida: 3
del polEspDict["zamek"] # elimina un elemento
print(len(polEspDict)) # salida: 2
[Link]() # elimina todos los elementos
print(len(polEspDict)) # salida: 0
del polEspDict # elimina el diccionario
polEspDict = {
"zamek" : "castillo",
"woda" : "agua",
"gleba" : "tierra"
}
copyDict = [Link]()
miTup = (1, 2, 3)
print(miTup[2])
El programa imprimirá 3 en pantalla.
Ejercicio 2
tup = 1, 2, 3
a, b, c = tup
print(a * b * c)
El programa imprimirá 6 en pantalla. Los elementos de la tupla tup han sido "desempaquetados" en las
variables a, b, y c.
Ejercicio 3
Completa el código para emplear correctamente el método count() para encontrar la cantidad de 2
duplicados en la tupla siguiente.
tup = 1, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9
duplicados = # tu código
print(duplicados) # salida: 4
tup = 1, 2, 3, 2, 4, 5, 6, 2, 7, 2, 8, 9
duplicates = [Link](2)
print(duplicado) # salida: 4
Ejercicio 4
Escribe un programa que "una" los dos diccionarios (d1 y d2) para crear uno nuevo (d3).
Solución Muestra:
d1 = {'Adam Smith':'A', 'Judy Paxton':'B+'}
d3 = {}
print(d3)
Ejercicio 5
Solución muestra:
l = ["carro", "Ford", "flor", "Tulipán"]
t = tuple(l)
print(t)
Ejercicio 6
Solución Muestra:
colores = (("verde", "#008000"), ("azul", "#0000FF"))
colDict = dict(colores)
print(colDict)
Ejercicio 7
colores = {
"blanco" : (255, 255, 255),
"gris" : (128, 128, 128),
"rojo" : (255, 0, 0),
"verde" : (0, 128, 0)
}
for col, rgb in [Link]():
print(col, ":", rgb)
rojo : (255, 0, 0)
PROYECTO
Tiempo estimado
30-60 minutos
Nivel de dificultad
Medio/difícil
Objetivos
• Perfeccionar las habilidades del estudiante al emplear Python para resolver problemas
complejos.
• La integración de técnicas de programación en un solo programa consistente de varias partes.
Escenario
Tu tarea es escribir un simple programa que simule jugar a tic-tac-toe (nombre en inglés) con el
usuario. Para hacerlo más fácil, Hemos decidido simplificar el juego. Aquí están nuestras reglas:
+-------+-------+-------+
| | | |
| 1 | 2 | 3 |
| | | | +-------+-------+-------+ | | | | | 4 | X | 6 | | | | | +-------+-------+--
-----+ | | | | | 7 | 8 | 9 | | | | | +-------+-------+-------+ Ingresa tu
movimiento: 1 +-------+-------+-------+ | | | | | O | 2 | 3 | | | | | +-------+----
---+-------+ | | | | | 4 | X | 6 | | | | | +-------+-------+-------+ | | | | | 7 |
8 | 9 | | | | | +-------+-------+-------+ +-------+-------+-------+ | | | | | O | X
| 3 | | | | | +-------+-------+-------+ | | | | | 4 | X | 6 | | | | | +-------+----
---+-------+ | | | | | 7 | 8 | 9 | | | | | +-------+-------+-------+ Ingresa tu
movimiento: 8 +-------+-------+-------+ | | | | | O | X | 3 | | | | | +-------+----
---+-------+ | | | | | 4 | X | 6 | | | | | +-------+-------+-------+ | | | | | 7 |
O | 9 | | | | | +-------+-------+-------+ +-------+-------+-------+ | | | | | O | X
| 3 | | | | | +-------+-------+-------+ | | | | | 4 | X | X | | | | | +-------+----
---+-------+ | | | | | 7 | O | 9 | | | | | +-------+-------+-------+ Ingresa tu
movimiento: 4 +-------+-------+-------+ | | | | | O | X | 3 | | | | | +-------+----
---+-------+ | | | | | O | X | X | | | | | +-------+-------+-------+ | | | | | 7 |
O | 9 | | | | | +-------+-------+-------+ +-------+-------+-------+ | | | | | O | X
| X | | | | | +-------+-------+-------+ | | | | | O | X | X | | | | | +-------+----
---+-------+ | | | | | 7 | O | 9 | | | | | +-------+-------+-------+ Ingresa tu
movimiento: 7 +-------+-------+-------+ | | | | | O | X | X | | | | | +-------+----
---+-------+ | | | | | O | X | X | | | | | +-------+-------+-------+ | | | | | O |
O | 9 | | | | | +-------+-------+-------+ ¡Has Ganado!
Requerimientos
Implementa las siguientes características:
• El tablero debe ser almacenado como una lista de tres elementos, mientras que cada elemento es
otra lista de tres elementos (la lista interna representa las filas) de manera que todos los cuadros
puedas ser accedidos empleado la siguiente sintaxis:
board[fila][columna]
• Cada uno de los elementos internos de la lista puede contener 'O', 'X', o un digito
representando el número del cuadro (dicho cuadro se considera como libre).
• La apariencia de tablero debe de ser igual a la presentada en el ejemplo.
• Implementa las funciones definidas para ti en el editor.
Para obtener un valor numérico aleatorio se puede emplear una función integrada de Python
denominada randrange(). El siguiente ejemplo muestra como utilizarla (El programa imprime 10
números aleatorios del 1 al 8).
Nota: La instrucción from-import provee acceso a la función randrange definida en un módulo
externo de Python denominado random.
def EnterMove(board):
ok = False # suposición falsa - lo necesitamos para entrar
en el bucle
while not ok:
move = input("Ingresa tu movimiento: ")
ok = len(move) == 1 and move >= '1' and move <= '9' # ¿es
valido lo que ingreso el usuario?
if not ok:
print("Movimiento erróneo, ingrésalo nuevamente") #
no, no lo es. Ingrésalo nuevamente.
continue
move = int(move) - 1 # numero de la celda, del 0 al 8
row = move // 3 # fila de la celda
col = move % 3 # columna de la celda
sign = board[row][col] # marca el cuadro elegido
ok = sign not in ['O','X']
if not ok: # esta ocupado, ingresa una posición
nuevamente
print("¡Campo ocupado, ingresa nuevamente!")
continue
board[row][col] = 'O' # colocar '0' al cuadro seleccionado
def MakeListOfFreeFields(board):
free = [] # la lista esta vacía inicialmente
for row in range(3): # itera a través de las filas
for col in range(3): # itera a través de las columnas
if board[row][col] not in ['O','X']: # ¿Está la celda
libre?
[Link]((row,col)) # si, agrega una nueva
tupla a la lista
return free
def VictoryFor(board,sgn):
if sgn == "X": # ¿Estamos buscando X?
who = 'yo' # Si, es la maquina
elif sgn == "O": # ... o estamos buscando O?
who = 'tu' # Si, es el usuario
else:
who = None # ¡No debemos de caer aquí!
cross1 = cross2 = True # para las diagonales
for rc in range(3):
if board[rc][0] == sgn and board[rc][1] == sgn and
board[rc][2] == sgn: # revisar filas rc
return who
if board[0][rc] == sgn and board[1][rc] == sgn and
board[2][rc] == sgn: # revisar columnas rc
return who
if board[rc][rc] != sgn: # revisar la primer diagonal
cross1 = False
if board[2 - rc][2 - rc] != sgn: # revisar la segunda
diagonal
cross2 = False
if cross1 or cross2:
return who
return None
def DrawMove(board):
free = MakeListOfFreeFields(board) # hace una lista de los
cuadros vacios o libres
cnt = len(free)
if cnt > 0: # si la lista no esta vacía, elegir un lugar para
'X' y colocarla
this = randrange(cnt)
row, col = free[this]
board[row][col] = 'X'
DisplayBoard(board)
if victor == 'tu':
print("¡Has ganado!")
elif victor == 'yo':
print("¡He ganado!")
else:
print("¡Empate!")
Ahora estas listo para tomar el quiz del módulo e intentar el desafío final: Examen del Módulo 4, el
cual te ayudará a determinar que tanto has aprendido hasta ahora.