Está en la página 1de 49

Introducción a la programación

¿Cómo funciona un programa de computadora?

❖ Un programa hace que una computadora sea usable. Sin un programa, una computadora,
incluso la más poderosa, no es más que un objeto solo capaz de ejecutar operaciones
extremadamente simples.
❖ Un programa es un conjunto de acciones o comandos que una computadora puede realizar al
ser traducidos en un lenguaje comprensible.

Lenguajes naturales vs lenguajes de programación

❖ Un lenguaje es un medio (y una herramienta) para expresar y registrar pensamientos.

Las computadoras también tienen su propio lenguaje, llamado lenguaje máquina, que es muy
rudimentario. Una computadora, aunque sofisticada, carece de inteligencia y solo reconoce comandos
simples. Por ejemplo: "toma ese número, divide por otro y guarda el resultado".

❖ Lista de instrucciones (IL): conjunto completo de comandos.


❖ Lenguajes naturales: idiomas que evolucionan (crean nuevas palabras y desaparecen viejas).
❖ Código máquina: un programa escrito en lenguaje máquina.

¿Qué compone a un lenguaje?

❖ Alfabeto: conjunto de símbolos utilizados para formar palabras de un determinado lenguaje.


❖ Léxico (Diccionario): conjunto de palabras que el lenguaje ofrece a sus usuarios.
❖ Sintaxis: conjunto de reglas (formales o informales, escritas o interpretadas intuitivamente)
utilizadas para precisar si una determinada cadena de palabras forma una oración válida.
❖ Semántica: conjunto de reglas que determinan si una frase tiene sentido.

Lenguaje máquina vs. lenguaje de alto nivel

El IL es el alfabeto de un lenguaje máquina, la lengua materna de la computadora, porque es el


conjunto de símbolos más simple y primario que podemos usar para dar comandos a una computadora.
Tanto computadoras como humanos necesitan un lenguaje común (un puente) para comunicarse.
Necesitamos un lenguaje en el que los humanos puedan escribir sus programas y un lenguaje que las
computadoras pueden usar para ejecutar los programas, uno que es mucho más complejo que el
lenguaje de máquina y, sin embargo, mucho más simple que el lenguaje natural.

1
Se le denomina lenguajes de programación de alto nivel; con símbolos, palabras y convenciones
legibles para los humanos. Permiten a los humanos expresar comandos a las computadoras que son
mucho más complejos que los que ofrecen las IL.

❖ Código fuente: programa escrito en un lenguaje de programación de alto nivel.


❖ Archivo fuente: archivo que contiene el código fuente.

Compilación vs. Interpretación

La programación informática es el acto de componer los elementos del lenguaje de


programación seleccionado en el orden que provocará el efecto deseado. Un programa debe estar
escrito en un alfabeto reconocible, hay que dominar su diccionario, obedecer sus reglas y debe tener
sentido.

Cuando se ha escrito con éxito un programa, la computadora lo traduce a lenguaje máquina


mediante compilación o interpretación. Hay muy pocos lenguajes que puedan compilarse e
interpretarse.

❖ Compilación: el programa fuente se traduce una vez al obtener un archivo que contiene el
código máquina. Sin embargo, la traducción debe repetirse cada vez que se modifique el código
fuente. El programa que realiza la traducción se llama compilador o traductor.
❖ Interpretación: cualquier persona con el código puede traducir el programa fuente cada vez que
se debe ejecutar. El usuario final necesita de un intérprete para ejecutar el código fuente.
• Lenguajes de scripting: lenguajes diseñados para ser utilizados en la interpretación.
• Scripts: fuente de los programas codificados con lenguajes de scripting.

¿Qué hace el intérprete?

Un programa de computadora es en realidad un fragmento de texto, por lo que el código fuente


generalmente se coloca en archivos de texto puro (sin decoraciones como diferentes fuentes, colores,
imágenes incrustadas u otros medios). » Archivo de computadora

El intérprete lee el código fuente de arriba a abajo y de izquierda a derecha. En primer lugar, el
intérprete verifica si todas las líneas posteriores son correctas (utilizando los cuatro elementos del
lenguaje). Si el compilador encuentra un error, finaliza el trabajo inmediatamente. El intérprete te
informará dónde se encuentra el error y qué lo causó. Sin embargo, estos mensajes pueden ser
engañosos, ya que el intérprete puede detectar errores a cierta distancia de sus causas reales.

2
Si la línea se ve bien, el intérprete intenta ejecutarlo. Cada línea generalmente se ejecuta por
separado, por lo que el trío "leer-verificar-ejecutar" se puede repetir muchas veces. También es posible
que una parte significativa del código pueda ejecutarse con éxito antes de que el intérprete encuentra
un error.

Ventajas y desventajas

Compilación Interpretación
Ventajas Se ejecuta más rápido el código traducido. El código se puede ejecutar tan pronto
El usuario final puede tener el código sin esté completo.
necesidad del compilador. No hay fases adicionales de traducción.
El código traducido se almacena en El código se almacena en lenguaje de
lenguaje máquina, por lo que los trucos de programación, por lo que se puede
programación seguirán siendo secretos. ejecutar en computadoras con
diferentes lenguajes máquina.
Desventajas El proceso de compilación tarda mucho. La interpretación no vuelve más rápido
No se puede ejecutar un código el código.
inmediatamente después de hacer una Tanto el programador como el usuario
modificación. final deben tener el intérprete para
Se necesita tantos compiladores como ejecutar el código.
plataformas de hardware. Es más lento que la compilación.
Nota: Si deseas programar en Python, necesitarás el intérprete de Python.

3
Introducción a Python
¿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.

¿Quién creó Python?

Por lo general, los grandes lenguajes de programación son desarrollados y publicados por
grandes compañías que emplean a muchos profesionales, y debido a las normas de derechos de autor,
es muy difícil nombrar a cualquiera de las personas involucradas en el proyecto.

Python fue creado por Guido van Rossum, nacido en 1956 en Haarlem, Países Bajos. Por
supuesto, Guido van Rossum no desarrolló y evolucionó todos los componentes de Python.

Objetivos de Python

❖ 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.

¿Qué hace que Python sea tan especial?


¿Rivales de Python?
❖ Es fácil y rápido de aprender.
Perl » Un lenguaje de scripting
❖ Es fácil de enseñar.
originalmente escrito por Larry
❖ Es fácil de utilizar para escribir software nuevo. Wall.
❖ Es fácil de entender los códigos.
Ruby » Un lenguaje de
❖ Es fácil de obtener, instalar y desplegar. scripting originalmente escrito
❖ Python es gratuito, abierto y multiplataforma. por Yukihiro Matsumoto.

Usos de Python

❖ Servicios de Internet como motores de búsqueda, almacenamiento en la nube y herramientas,


redes sociales, etc.
❖ Escribir aplicaciones de uso diario.
❖ Laboratorios científicos.

4
❖ Muchos testers de proyectos de TI han comenzado a usar Python para llevar a cabo
procedimientos de prueba repetibles.

Nota: Aún no se usa para programación de bajo nivel ni aplicaciones para dispositivos móviles.

Versiones de Python

Python 2 es una versión anterior del Python original. Su desarrollo se ha estancado


intencionalmente, aunque eso no significa que no haya actualizaciones. Prefieren arreglar cualquier
error recién descubierto y agujeros de seguridad. La ruta de desarrollo de Python 2 ya ha llegado a un
callejón sin salida, pero Python 2 en sí todavía está muy vivo.

Python 3 es la versión más nueva (la actual) del lenguaje. Está atravesando su propio camino
de evolución, creando sus propios estándares y hábitos.

Estas dos versiones de Python no son compatibles entre sí. Las secuencias de comandos de
Python 2 no se ejecutarán en un entorno de Python 3 y viceversa, por lo que, si deseas que un
intérprete de Python 3 ejecute el código Python 2 anterior, la única solución posible es volver a
escribirlo.

Implementaciones de Python

CPython
Una implementación de Python se refiere a un programa o entorno que brinda soporte para la
ejecución de programas escritos en el lenguaje Python. La implementación tradicional de Python,
llamada CPython, es la versión de referencia del lenguaje informático Python de Guido van Rossum,
y se suele llamar simplemente "Python".

Están los Pythons que son mantenidos por la gente reunida alrededor de la Python Software
Foundation (PSF), una comunidad que tiene como objetivo desarrollar, mejorar, expandir y popularizar
Python y su entorno. Estos pythons se llaman canónicos. También se consideran Pythons de referencia,
ya que cualquier otra implementación del lenguaje debe seguir todos los estándares establecidos por
la PSF.

Todos los Pythons que provienen del PSF están escritos en el lenguaje "C". Gracias a él, Python
puede ser portado y migrado fácilmente a todas las plataformas con la capacidad de compilar y ejecutar
programas en lenguaje "C" (prácticamente todas las plataformas tienen esta función, lo que abre
muchas posibilidades de expansión).

5
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. 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).

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.

Jython
"J" es de "Java". 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 por lo 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
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.
Además, PyPy es compatible con el lenguaje Python 3.

MicroPython

6
MicroPython es una implementación eficiente de software de código abierto de Python 3 que
está optimizada para ejecutarse en microcontroladores. Incluye un pequeño subconjunto de la
biblioteca estándar de Python, pero está repleto de una gran cantidad de funciones, como mensajes
interactivos o números enteros de precisión arbitraria, así como módulos que dan acceso al
programador a hardware de bajo nivel.

7
Sintaxis y semántica
Funciones de Python

Una función de Python es una parte separada del código de computadora, el cual es capaz de
causar algún efecto (ej. enviar texto a la terminal, crear un archivo, dibujar una imagen, reproducir un
sonido), evaluar un valor (ej. la raíz cuadrada de un valor o la longitud de un texto) y devolverlo como
el resultado de la función. Muchas funciones de Python pueden ambas cosas al mismo tiempo.

❖ El nombre de una función debe ser significativo.


❖ La función print() imprime una línea de texto en la pantalla (consola).

¿De dónde provienen las funciones?

❖ Pueden venir de Python mismo, es decir, está integrada a Python y no es necesario hacer nada
espacial para usarla. » Ej. La función print().
❖ Pueden provenir de módulos de Python (llamados complementos) que pueden requerir una
instalación por separado.
❖ El programador puede escribirlas por sí mismo.

Argumentos de funciones

❖ Una función puede tener un efecto y un resultado.


❖ Las funciones de Python necesitan de un argumento, el cual depende de las necesidades
individuales.
❖ Las funciones pueden aceptar tantos argumentos como sea necesario para realizar sus tareas.
❖ El número 0 también sirve como argumento porque algunas funciones de Python no necesitan
ningún argumento.
❖ Los argumentos precisan de un par de paréntesis. »Todo lo que se abre, se debe cerrar.

Nota: Para distinguir las palabras comunes de los nombres de funciones, colocar un par de paréntesis
vacíos después de sus nombres.

Una cadena como el argumento de la función

Una cadena está delimitada por comillas, tanto simples como dobles. De hecho, las comillas
forman la cadena, recortan una parte del código y le asignan un significado diferente. Las comillas
señalan a la computadora que el texto entre ellos no es un código. No está diseñado para ser ejecutado

8
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.

Invocación de funciones

El nombre de la función junto con los paréntesis y los argumentos, forman la invocación de la
función. Python busca entre sus archivos si existe una función con ese nombre, si no, aborta el código.
También revisa entre los requisitos de esa función si posee la cantidad de argumentos necesarios para
ejecutarla.

La función print(): Efecto, argumentos y valores retornados

Print() es una función utilizada para ver los resultados de operaciones y evaluaciones, puede
operar con todos los tipos de datos (cadenas, números, caracteres, valores lógicos, objetos) y no
devuelve ningún valor.

print(“¡Hola, Mundo!”)

Instrucciones de Python

Una instrucción es un comando para realizar una tarea específica cuando se ejecuta. La
invocación de una función es uno de los muchos tipos posibles de instrucciones de Python. Python
requiere que no haya más de una instrucción por línea. Una línea puede estar vacía (por ejemplo,
puede no contener ninguna instrucción), pero no debe contener dos o más instrucciones. Esto está
estrictamente prohibido. No obstante, permite que una instrucción se extienda por más de una línea
(lo que puede ser útil cuando el código contiene construcciones complejas).

❖ Las instrucciones en el código se ejecutan en el mismo orden en el que se han colocado en el


archivo fuente.
❖ La invocación vacía de print() genera una línea vacía.

Caracteres de escape y nueva línea en Python

La barra invertida (\) tiene un significado muy especial cuando se usa dentro de cadenas: se
llama carácter de escape. La palabra escape significa que la serie de caracteres en la cadena se
escapa por un momento (un momento muy breve) para introducir una inclusión especial. En otras
palabras, la barra invertida no significa nada en sí misma, sino que es solo una especie de anuncio de
que el siguiente carácter después de la barra invertida también tiene un significado diferente.

9
La letra “n” colocada después de la barra invertida proviene de la palabra newline. El símbolo
\n se llama carácter de nueva línea e insta a la consola a iniciar una nueva línea de salida. Aparecen
dos nuevas líneas en los lugares donde se ha utilizado \n.

Nota 1: La invocación print(“\”) provocará un error; mientras que print(“\\”) solo mostrará una \.

Nota 2: La invocación print(“\/”) es inválida y solo muestra \/.

Usando múltiples argumentos

Para utilizar más de un argumentos en una función, se separan por comas y comillas.
Aparecerán como una sola línea en la pantalla.

❖ La forma posicional significa que el argumento está dictado por su posición; el segundo
argumento se mostrará después del primero, no al revés.

print(“Hace mucho calor”,”hoy”,”como para trabajar.”)

Argumentos de palabra clave

El nombre proviene del hecho de que el significado de estos argumentos se toma no de su


ubicación (posición), sino de la palabra especial (palabra clave) utilizada para identificarlos. El
argumento de palabra clave end=” ” permite que los argumentos de dos funciones se muestren en la
pantalla como una sola línea; contraria a \n.

Si el argumento end=” ” se ha establecido a nada, la función print() tampoco genera nada, una
vez que se han agotado sus argumentos posicionales.

Nota: end=”\n” se comporta como \n, mientras que end=”*\n” solo muestra un asterisco.

El argumento de palabra clave sep”-” (llamado separador) separa los argumentos con un guion
en lugar de un espacio. Asimismo, se puede utilizar la cadena vacía sep=” ” para separar los
argumentos con espacios en blanco. Ambos argumentos de palabra clave pueden mezclarse en una
invocación.

10
Literales de Python
Literales: Los datos en sí mismos

❖ Un literal se refiere a datos cuyos valores están determinados por el literal mismo.
❖ Los literales son notaciones para representar valores fijos en el código.
❖ No se puede elegir el valor correcto sin algo de conocimiento adicional.
❖ Se utilizan literales para codificar datos y ponerlos dentro del código.

Ejemplo:

print(“2”) » Una cadena.

print(2) » Un número entero.

La función print() los muestra exactamente de la misma manera. Sin embargo, internamente, la
memoria de la computadora los almacena de dos maneras completamente diferentes. La cadena
existe como eso: solo una cadena, una serie de letras. El número es convertido a una representación
máquina (una serie de bits). La función print() es capaz de mostrar ambos en una forma legible para
humanos.

Enteros (Literal numérico)

El sistema binario es el sistema que las computadoras utilizan para almacenar números y
realizar cualquier tipo de operaciones con ellos. Un número binario solo está compuesto por ceros y
unos. Todos los números manejados por las computadoras son enteros (int) o punto-flotantes
(flotantes). Ambos tipos difieren significativamente en cómo son almacenados en una computadora y
en el rango de valores que aceptan. Si se codifica un literal y se coloca dentro del código de Python,
la forma del literal determina la representación (tipo) que Python utilizará para almacenarlo en la
memoria.

❖ Números enteros: aquellos que no tienen una parte fraccionaria.


❖ Números punto-flotantes: contienen o son capaces de contener una parte fraccionaria.

¿Cómo Python reconoce un número entero?


Cuando un número es demasiado grande (tiene muchos dígitos), se suele escribir a lápiz con
puntos, comas o espacios para que sea más fácil de leer para un humano. Sin embargo, Python no

11
acepta esto; en cambio, se utiliza el guion bajo con los literales numéricos o se escriben todos los
números juntos.

Incorrecto: 11,111,111 11.111.111 11 111 111

Correcto: 11_111_111 11111111

Números octales y hexadecimales


❖ Si un número entero está precedido por un código 0O o 0o (cero-o), el número será tratado
como un valor octal. Esto significa que el número debe contener dígitos en el rango del [0...7]
únicamente.
❖ Si un número entero está precedido por un código 0X o 0x (cero-x), el número será tratado
como un valor hexadecimal. El sistema hexadecimal utiliza los números decimales más seis
letras adicionales.

print(0o123) = 83

print(0x123) = 291

Flotantes (Literal numérico)

Como los números flotantes contienen decimales, no se deben escribir con coma. Python no lo
aceptará o puede malinterpretar el número, debido a que la coma tiene su propio significado en Python.
No obstante, se puede omitir el cero cuando es el único dígito antes del punto decimal. El punto
decimal es esencialmente importante para reconocer números punto-flotantes en Python.

Por otro lado, se puede utilizar la letra e. Cuando se desea utilizar números que son muy
pequeños o grandes, se puede implementar la notación científica. La letra E significa “por diez elevado
a la n potencia”. Python siempre elige la presentación más corta del número al mostrarlo en pantalla.

Nota: El exponente (el valor después de la E) debe ser un valor entero; mientras que la base (el valor
antes de la E) puede ser un valor entero o flotante.

Cadenas

Así como los números flotantes necesitan de un punto decimal, las cadenas requieren de
comillas. Pero ¿cómo codificar una comilla dentro de una cadena que ya está delimitada por comillas?
¿Cómo decirle a Python que la comilla no es un delimitador de la cadena, sino una comilla, sin que se
genere un error?

12
1. Carácter de escape (\): La diagonal invertida puede también escapar de la comilla. Una comilla
después de una diagonal invertida cambia su significado. » print("Me gusta \"Monty Python\"")
2. Un apóstrofe (‘’): 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. No requiere de
carácter de escape. » print('Me gusta "Monty Python"')

Valores booleanos (Literal booleano)

❖ Se emplean para representar la veracidad.


❖ Para preguntar a Python si un número es más grande que otro, se utiliza un valor booleano.
❖ Álgebra Booleana: una parte del álgebra que hace uso de dos valores: True y False, denotados
como 1 y 0. » Respetar mayúsculas y minúsculas.
❖ Un programador escribe un programa, y el programa hace preguntas. Python ejecuta el
programa, y provee las respuestas. El programa debe ser capaz de reaccionar acorde a las
respuestas recibidas.

El literal None

❖ Este literal es llamado un objeto de NoneType, y puede ser utilizado para representar la
ausencia de un valor.

13
Operadores de Python
Operadores básicos

❖ Un operador es un símbolo del lenguaje de programación, el cual es capaz de realizar


operaciones con los valores.
❖ Cuando los datos y operadores se unen, forman juntos expresiones. La expresión más sencilla
es el literal.
❖ Cuando ambos ** argumentos son enteros, el resultado es entero: pero cuando al menos un **
argumento es flotante, el resultado también es flotante.

Símbolo Operación matemática ¿Aplica la regla “Entero vs Flotante”? Prioridad


+ Suma Sí 3
- Resta Sí 3
* Multiplicación Sí 2
/ División No, siempre muestra flotantes. 2
// División entera Sí 2
% Residuo (módulo) Sí 2
** Exponente Sí 1
Nota: El resultado de la división entera (floor division) siempre se redondea al valor entero inferior más
cercano del resultado de la división no redondeada.

Operadores y sus prioridades

❖ El fenómeno que causa que algunos operadores actúen antes que otros son conocido como la
jerarquía de prioridades.

Operadores y sus enlaces


El enlace de un operador determina el orden en que se computan las operaciones de los
operadores con la misma prioridad, los cuales se encuentran dentro de una misma expresión. La
mayoría de los operadores de Python tienen un enlazado hacia la izquierda, lo que significa que el
cálculo de la expresión es realizado de izquierda a derecha.

❖ Excepción: El operador exponente tiene un enlazado del lado derecho.

14
Variables de Python
¿Cómo almacenar los resultados intermedios y después utilizarlos de nuevo para producir

resultados subsecuentes?

❖ Python ofrece "cajas" (o "contenedores") especiales para almacenar resultados intermedios.


Estas cajas son llamadas variables.

Componentes de una variable en Python

❖ Un nombre (identificador).
❖ Un valor (contenido del contenedor).

Las variables no aparecen en un programa automáticamente. Los desarrolladores deciden cuántas


variables desea utilizar en el programa y las debe nombrar.

Reglas para nombrar una variables

1. Debe estar compuesto por mayúsculas, minúsculas, dígitos y guion bajo.


2. El nombre debe comenzar con una letra.
3. El guion bajo es considerado una letra.
4. Dos variables con el mismo nombre, pero escritos de diferente manera, serán tratados por
Python como dos variables distintas. » Ej. Alicia y ALICIA.
5. El nombre no debe ser igual a alguna de las palabras reservadas de Python.
6. No existe una restricción de longitud, aunque es mejor un nombre corto en vez de uno largo.
7. Se puede usar letras de alfabetos de otros idiomas.
8. El nombre no debe contener espacios.
9. Una variables es más legible si el nombre está en minúsculas y con guiones bajos.

Palabras clave reservadas

15
¿Cómo crear una variable?

❖ Cualquier cosa se puede poner dentro de una variable.


❖ El valor de la variable es lo que se ha puesto dentro de ella. » Entero, flotante, cadena.

Una variable se crea cuando se le asigna un valor. Si se le asigna cualquier valor a una variable no
existente, la variable será automáticamente creada. No se necesita hacer algo más.

PASOS
1. Darle un nombre.
2. Colocar el signo de igual.
3. Escribir un valor. » Si se escribe con comillas, la función los va a tratar como cadena.
4. Escribir la variable recién creada dentro de la función print(). » No usar comillas.

¿Cómo emplear una variable?

Se tiene permitido utilizar cuantas declaraciones de variables sean necesarias para lograr el
objetivo del programa. Sin embargo, no se permite utilizar una variable que no exista (que no se le ha
dado un valor / contenido).

¿Cómo asignar un nuevo valor a una variable ya existente?

De la misma manera. Solo se necesita el signo de igual. El signo de igual es de hecho un


operador de asignación. Asigna el valor del argumento de la derecha al de la izquierda, aun cuando el
argumento de la derecha sea una expresión arbitraria compleja que involucre literales, operadores y
variables definidas anteriormente.

❖ El signo igual significa “asigna un valor”, no “igual a”.


❖ La función siempre escogerá el último valor que se le ha asignado a esa variable.

Resolviendo problemas matemáticos simples

La función print() junto con las variables permite resolver problemas matemáticos simples. Los
datos matemáticos son variables, la operación es otra variable y la función muestra el resultado.

Ejemplo

Teorema de Pitágoras

a=3.0 b=4.0 c=(a**2+b**2)**0.5 print(“c= “, c)

16
Comentarios sobre comentarios
¿Por qué es importante dejar comentarios no dirigidos a Python?

❖ Explicar al usuario final cómo funciona el código.


❖ Describir cada pieza importante del código.
❖ Especificar el significado de las variables.
❖ Documentar quién fue el autor del programa y la fecha en que fue escrito.
❖ Deshabilitar aquellas partes del código que no son necesarias.

¿Cómo funciona un comentario?

El comentario sería el texto insertado en el programa que es omitido al ejecutarlo. Los


comentarios pueden ser utilizados para colocar información adicional en el código. Los comentarios
se deben colocar en el código de manera que Python no los interprete como parte del código; sino que
los verá como espacios en blanco.

En Python, un comentario es un texto que comienza con el símbolo # y se extiende hasta el


final de la línea. Si se desea colocar un comentario que abarca varias líneas, se debe colocar este
símbolo en cada línea.

Nota: Una variable es auto-comentable si su nombre explica por sí mismo para qué sirve esa variable,
sin necesidad de dejar un comentario explicativo.

Marcar fragmentos de código

Se pueden utilizar para marcar un fragmento de código que actualmente no se necesita en el


momento. Esto es frecuentemente realizado cuando se está probando un programa, con el fin de aislar
un fragmento de código donde posiblemente se encuentra un error.

Descomentar líneas de código

Si se desea eliminar el símbolo # de varias líneas para que dejen de ser comentarios,
seleccionar las líneas a modificar y utilizar CTRL + /.

17
Interacción con el usuario
La función input()

La función input() obtiene datos de la pantalla y regresa un valor muy utilizable. Todos los
programas leen y procesan datos. Un programa que no obtiene datos de entrada del usuario es un
programa sordo.

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. La función input() es invocada sin argumentos, pero es
asignada a una variable.

print("Dime lo que sea...")

anything=input()

print("Hmm...", anything, "...¿en serio?")

El programa solicita al usuario que inserte algún dato desde la consola y presionar Enter para
que los datos sean enviados al programa. Después se utiliza la función print() para mostrar los datos
que se obtuvieron, con algunas observaciones adicionales.

La función input() con un argumento

La función input() también puede avisar al usuario sin ninguna ayuda de print(). Simplifica el
código al ahorrarse un print() porque el argumento (la cadena) se puede colocar dentro de input() y se
mostrará en la pantalla antes de que el usuario ingrese algún dato.

El resultado de la función input() – Operaciones prohibidas

❖ El resultado de la función input() es una cadena, no es un entero ni un flotante.


❖ Esta función no se puede utilizar como un argumento para operaciones matemáticas.
❖ ¿Existe alguna solución?

Conversión de tipos

❖ La función int() toma un argumento (ejemplo, una cadena int(string)) e intenta convertirlo a un
valor entero; si llegase a fallar, el programa entero fallará también.

18
❖ La función float() toma un argumento (ejemplo, una cadena: float(string)) e intenta convertirlo
a flotante.

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.

El equipo input() – int() – float() permite 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 no
son capaces de reaccionar acorde a cada situación.

Operadores cadena

❖ Los operadores de suma y multiplicación son capaces también de manejar o manipular cadenas,
aunque, en una manera muy específica.
❖ El signo +, al ser aplicado a dos cadenas, se convierte en un operador de concatenación.
Simplemente concatena (junta) dos cadenas en una, pero no es conmutativo. Si se desea que
el signo + sea un concatenador, no un sumador, solo se debe asegurar que ambos argumentos
sean cadenas.
❖ El signo *, 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. Replica la cadena el número de veces indicado por el
número.

Nota: Un número menor o igual a cero produce una cadena vacía.

La función str()

❖ Así como int() y float() convierten una cadena a un número, la función str() convierte un número
a una cadena.

19
Toma de decisiones en Python
Preguntas y respuestas

Un programador escribe un programa y el programa hace preguntas. Una computadora ejecuta


el programa y proporciona las respuestas. El programa debe ser capaz de reaccionar de acuerdo con
las respuestas recibidas. Para hacer preguntas, Python utiliza un conjunto de operadores muy
especiales. » Una computadora solo puede responder SÍ o NO.

Comparación: Operador de igualdad

Para preguntar “¿son dos valores iguales?”, se utiliza el símbolo = dos veces. Es un operador
binario con enlazado del lado izquierdo. Necesita dos argumentos y verifica si son iguales. Python
responderá con “True” o “False”.

Nota: Si se compara un valor entero con uno flotante, Python convertirá el valor entero a flotante y
proseguiría a responder la pregunta.

Operadores de comparación

❖ Igual a (==)
❖ Diferente de (!=)
❖ Mayor que (>)
❖ Menor que (<)
❖ Mayor o igual que (>=)
❖ Menor o igual que (<=)

¿Qué se puede hacer con las respuestas de una operación de comparación?

❖ Memorizarlo / Almacenarlo en una variable para utilizarlo más tarde.


❖ Utilizarlo para tomar una decisión sobre el futuro del programa.

Condiciones y ejecución condicional

❖ La instrucción condicional (sentencia condicional) le permite a Python hacer algo si se cumple


una condición y no hacerlo si no se cumple.
❖ Una expresión sería True si su valor no es igual a cero.
❖ Las sentencias condicionales deben tener sangría, sino siempre se ejecutan.

20
Tipos de sentencias
Sentencia if if true_or_not:
do_this_if_true
do_this_no_matter_the_answer
Sentencia if – else if true_or_false_condition:
perform_if_condition_true
else:
perform_if_condition_false
Anidamiento La instrucción colocada después del if es otro if.
Sentencia elif (“else if”) Verificar más de una condición y detener cuando se encuentra la
primera sentencia verdadera.
Cascada: if – elif – else

Reglas
❖ No se puede usar else sin un if precedente.
❖ else siempre es la última rama de la cascada, independientemente de si se usó elif o no.
❖ else es una parte opcional de la cascada y puede omitirse.
❖ Si hay una rama else en la cascada, solo se ejecuta una de todas las ramas.
❖ Si no hay una rama else, es posible que no se ejecute ninguna de las opciones disponibles.

Pseudocódigo e introducción a los bucles

Permite escribir programas para encontrar el mayor de una amplia cantidad de números sin
tener que escribir demasiadas variables y funciones input(). El pseudocódigo es un algoritmo; no es
un lenguaje de programación real (no se puede compilar ni ejecutar). La ejecución de una determinada
parte del código más de una vez se denomina bucle.

largest_number = -999999999

number = int(input())

if number == -1:

print(largest_number)

exit()
21
if number > largest_number:

largest_number = number

# Ir a la línea 02

Las funciones max() y min()


❖ También se puede usar la función max() para sacar el número mayor entre múltiples argumentos.
❖ La función min() obtiene el número más pequeño dentro de un conjunto.

number1 = int(input("Ingresa el primer número: "))

number2 = int(input("Ingresa el segundo número: "))

number3 = int(input("Ingresa el tercer número: "))

largest_number = max(number1, number2, number3)

print("El número más grande es:", largest_number)

22
Bucles en Python
Bucles en el código con while

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 sentencias sólo una vez;
while repite la ejecución siempre que la condición se evalúe como True.

❖ Si se desea ejecutar más de una sentencia dentro de un while, usar sangría en todas las
instrucciones.
❖ Cuerpo de bucle: una instrucción o conjunto de instrucciones ejecutadas dentro del while.
❖ Si la condición es False, el bucle dejará de ejecutarse.
❖ Si la condición es True, el cuerpo del bucle debería poder cambiar el valor de la condición para
que no se repita infinitamente.

Un bucle infinito

❖ Un bucle infinito es una secuencia de instrucciones en un programa que se repite


indefinidamente (bucle sin fin).

Bucles en el código con for

A veces es más importante contar los “giros o vueltas” del bucle que verificar las condiciones.
El bucle for está diseñado para realizar tareas más complicadas, puede "explorar" grandes colecciones
de datos elemento por elemento.

❖ No necesita condiciones.
❖ Variable de control: cuenta los giros del bucle automáticamente.
❖ Función range(): genera todos los valores deseados de la variable de control. » Solo acepta
enteros.
❖ Palabra clave pass: instrucción vacía.

La función range() con dos argumentos


❖ Si se asignan dos argumentos a la función range(), se estaría generando un rango de valores
(“imprime en la consola de x a y, pero no muestres y”).

La función range() con tres argumentos


23
❖ El tercer argumento es un incremento: es un valor agregado para controlar la variable en cada
giro del bucle (el valor predeterminado del incremento es 1).
❖ El primer argumento es el número de inicio de la secuencia.
❖ El segundo argumento señala dónde detener la secuencia.
❖ El tercer argumento indica el paso, es decir, la diferencia entre cada número en la secuencia de
números generados por la función.
❖ Los primeros dos argumentos se ordenan de manera ascendente.

Ejemplo

for i in range(2, 8, 3): El valor de i es 2.

print(“El valor de i es”, i) El valor de i es 5.

El primer valor que muestra es 2 por ser el argumento inicial. Luego, al primer argumento le sumó
el tercer argumento, dando por resultado el número 5. Este número están dentro del rango 2 a 8
(segundo argumento). Finalmente, al resultado le suma de nuevo el tercer argumento, dando el número
8, el cual ya no forma parte del rango (8 es el argumento que detiene la secuencia).

Nota: Si el conjunto generado por la función range() está vacío, el bucle no ejecutará su cuerpo en
absoluto.

Las sentencias break y continue

A veces no es necesario continuar con el bucle en su totalidad, sino detenerlo e ir más allá;
cuando es necesario comenzar el siguiente giro del bucle sin completar la ejecución del turno actual.
La instrucción break sale del bucle inmediatamente y el programa termina la operación del bucle
para comenzar a ejecutar la instrucción más cercana después del cuerpo del bucle. La instrucción
continue se comporta como si el programa hubiera llegado repentinamente al final del cuerpo, inicia
el siguiente turno y la expresión de condición se prueba de inmediato.

❖ La instrucción break termina el bucle dónde la palabra if lo señala.


❖ La instrucción continue se brinca el número que señala if y continúa el resto del bucle.

El bucle while y el bloque else

Ambos bucles while y for, tienen una característica interesante (y rara vez se usa): tratar de
convencer al usuario si la función es valiosa y útil, o solo es azúcar sintáctica. Los bucles también
pueden tener la rama else, como los if. La rama else del bucle siempre se ejecuta una vez,
independientemente de si el bucle ha entrado o no en su cuerpo.
24
El bucle for y el bloque else

El bucle for va a contar los giros del bucle de acuerdo con lo establecido por la función range().
Al final, va a imprimir un “else” junto con el último valor en la pantalla. En cambio, si se asigna un valor
a la variable de control antes del bucle for, va a imprimir en la pantalla solo el valor que se le asignó.
Cuando el cuerpo del bucle no se ejecuta, la variable de control conserva el valor que tenía antes del
bucle. Si la variable de control no existe antes de que comience el bucle, no existirá cuando la ejecución
llegue a la rama else.

Nota: Existen variables que pueden almacenar muchos valores.

25
Operaciones lógicas y de bits
Lógica de computadoras

Las computadoras pueden ejecutar sentencias condicionales más complejas, que poseen
varias condiciones que se deben cumplir al mismo tiempo para que se haga algo. En el lenguaje de la
lógica, se utiliza la operador and (y) para realizar tal conexión de condiciones, denominado conjunción.
Por el contrario, se utiliza la operador or (o) para indicar que una sentencia se ejecuta si se cumple
al menos una de estas condiciones; llamado disyunción.

Operadores lógicos
and or not

Operador binario de conjunción. Operador binario de Operador unario de negación


Prioridad inferior a los operadores disyunción. lógica.
de comparación. Prioridad más baja que and. Convierte la verdad en falso y
Se usa sin paréntesis. La disyunción es True si al lo falso en verdad.
La conjunción solo es True si menos una de sus condiciones Prioridad más alta que los
todas las condiciones son True. es True. operadores de comparación.
Nota: Ninguno de estos operadores de dos argumentos se puede usar en la forma abreviada conocida
como op=.

Expresiones lógicas

❖ Ley de Morgan: La negación de una conjunción es la separación de las negaciones. La negación


de una disyunción es la conjunción de las negaciones.

Valores lógicos vs bits individuales

Los operadores lógicos toman sus argumentos como un todo, independientemente de cuantos
bits contengan. Los operadores solo conocen el valor: cero (cuando todos los bits se restablecen)
significa False; no cero (cuando se establece al menos un bit) significa True.

Operadores bit a bit

26
Sin embargo, hay cuatro operadores que le permiten a la computadora manipular bits de datos
individuales; se denominan operadores bit a bit. Los argumentos de estos operadores deben ser
números enteros, no flotantes.

❖ ^ : “o exclusivo” a nivel de bits.


❖ & : conjunción (and) a nivel de bits.
❖ | : disyunción (or) a nivel de bits.
❖ ~ : negación (not) a nivel de bits.

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 bit a bit son más estrictos: tratan con cada bit por separado. Si asumimos que la variable
entera ocupa 64 bits, se 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.

¿Cómo tratar con bits individuales?

❖ Máscara de bits: secuencia de ceros y unos con la tarea de tomar el valor o cambiar los bits
seleccionados.
❖ Se pueden utilizar los operadores bit a bit para manipular los bits de datos individuales.

Desplazamiento binario a la izquierda y desplazamiento binario a la derecha

❖ Python ofrece otra operación relacionada con los bits individuales: shifting. Esto se aplica solo
a los valores de número entero.

Ejemplos:

12345 * 10 = 123450 » Multiplicar por diez es de hecho un desplazamiento de todos


los dígitos a la izquierda y llenar el vacío resultante con cero.

12340 / 10 = 1234 » Dividir entre diez no es más que desplazar los dígitos a la
derecha.

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.

27
❖ Los operadores de cambio en Python son un par de dígrafos: < < y > >, sugiriendo claramente
en qué dirección actuará el cambio. A la izquierda se coloca el valor entero cuyos bits se
desplazan.

Ejemplo:

var = 17 R// 17, 68, 8

var_derecha = var >> 1

var_izquierda = var << 2 17 >> 1 = 17 // 21 = 8

17 << 2 = 17 // 22 = 68
print(var, var_izquierda, var_derecha)

28
Listas de Python
¿Por qué se necesitan las listas?

❖ Las listas permiten almacenar varios números (valores) en una sola variable sin escribirlas por
separado.
❖ Las variables que solo pueden almacenar un valor a la vez se llaman escalares.
❖ Las listas comienzan con un corchete abierto [ y terminan con un corchete cerrado ], con todos
los argumentos separados con comas.
❖ Las listas pueden tener enteros, flotantes, booleanos, cadenas u otras listas (anidar).
❖ Python siempre enumera los elementos de una lista empezando con el número cero.
❖ Una lista es una colección de elementos, pero cada elemento es un escalar.

Indexación de listas

❖ ¿Cómo se puede cambiar el valor de un elemento elegido en la lista? Si el primer elemento de


la lista es un 10 y se desea cambiarlo por un 111, se escribe en una línea nueva “number[0]=111”.
❖ ¿Cómo copiar el valor de un elemento a otro? Si se desea copiar el valor del quinto elemento
al segundo, se escribe “numbers[1]=numbers[4]”.
❖ Cada nuevo cambio en el contenido de la lista conserva los cambios anteriores.
❖ Índice: es el valor dentro de los corchetes que selecciona un elemento de la lista. » Cualquier
valor puede ser un índice.
❖ Indexación: es la operación de seleccionar un elemento de la lista.

Acceso al contenido de las listas

❖ Se puede acceder a cada uno de los elementos de la lista por separado utilizando
“print(numbers[0])”.

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. La función len() toma el nombre de la lista
como un argumento y devuelve el número de elementos almacenados actualmente dentro de la lista.

Eliminando elementos de la lista

29
Cualquier elemento de la lista puede ser eliminado en cualquier momento con la instrucción del
(eliminar). Hay que apuntar al elemento que quieres eliminar: desaparecerá de la lista y la longitud de
la lista se reducirá en uno.

Los índices negativos son legales

❖ Un elemento con un índice igual a -1 es el último en la lista.


❖ Un elemento con un índice igual a -2 es el anterior al último en la lista.

Funciones vs métodos

Un método es un tipo específico de función: se comporta como una función y se parece a una
función, pero difiere en la forma en que actúa y en su estilo de invocación. Una función no pertenece
a ningún dato: obtiene datos, puede crear nuevos datos y (generalmente) produce un resultado. Un
método hace todas estas cosas, pero también puede cambiar el estado de una entidad seleccionada.
Un método es propiedad de los datos para los que trabaja, mientras que una función es propiedad de
todo el código. 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.

Resultado = Función (argumento)

Resultado = data.method (argumento)

❖ El método se comportará como una función, pero puede cambiar el estado interno de los datos
a partir de los cuales se ha invocado.
❖ Para agregar nuevos elementos a una lista existentes, se utiliza los métodos propios de las
listas, no las funciones.

Agregando elementos a una lista: append() e insert()

❖ El método append() añade un nuevo elemento al final de la lista existente.


❖ El método insert() añade un nuevo elemento en cualquier lugar de la lista, no solo al final. El
primer argumento señala la ubicación y el segundo indica el elemento a insertar.
❖ Se puede crear una lista vacía y agregar nuevos elementos después con los métodos de una
lista.

Procesar listas con el bucle for

❖ El bucle for se puede utilizar también para calcular la suma de todos los valores almacenados
en una lista.

30
31
Ordenamiento de listas
Algoritmo de Ordenamiento Burbuja

❖ Sirve para ordenar los elementos de una lista.


❖ Compara los elementos adyacentes e intercambia algunos de ellos.
❖ Es simple y fácil de entender, pero no es muy eficiente para listas extensas.
❖ Ascendente: el algoritmo revisa si el primer elemento es menor que el segundo, sino los
intercambia de lugar.
❖ Descendente: el algoritmo revisa si el primer elemento es mayor que el segundo, sino los
intercambia.
❖ El algoritmo compara el primero con el segundo, el segundo con el tercero, el tercero con el
cuarto y así hasta el penúltimo con el último. Cuando el número mayor de la lista se encuentra
al final, repite todas las acciones con los elementos que faltan por ordenar.
❖ El nombre “Algoritmo Burbuja” proviene de imaginar la lista de manera vertical, donde los
números suben o “flotan” de lugar como burbujas en una copa de champán.

Ordenando una lista: Método sort()

Versión larga Versión simple


lista=[8, 10, 6, 2, 4] my_list = [8, 10, 6, 2, 4]
swapped=True my_list.sort()
while swapped: print(my_list)
swapped=False
for i in range(len(lista)-1): lst = ["D", "F", "A", "Z"]
if lista[i] > lista[i+1]: lst.sort()
swapped=True print(lst)
lista[i], lista[i+1]= lista[i+1], lista[i]
print(lista) Solo ordena la lista de manera ascendente.

Nota: Se puede revertir una lista (darle la vuelta) con el método reverse().

32
Operaciones con listas
La vida al interior de las listas

Las listas (y muchas otras entidades complejas de Python) se almacenan de diferentes maneras
que las variables ordinarias (escalares). El nombre de una variable ordinaria es el nombre de su
contenido y el nombre de una lista es el nombre de una ubicación de memoria donde se almacena la
lista.

La asignación: list_2 = list_1 copia el nombre del arreglo no su contenido. En efecto, los dos
nombres (list_1 y list_2) identifican la misma ubicación en la memoria de la computadora. Modificar
uno de ellos afecta al otro, y viceversa.

Rebanadas poderosas

Una rebanada 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. El
código [:] puede producir una lista completamente nueva. Una rebanada my_list[inicio:fin] crea una
nueva lista (de destino), tomando elementos de la lista de origen: los elementos de los índices desde
el “start” hasta el “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.
❖ “start” es el índice del primer elemento incluido en la rebanada.
❖ “end” es el índice del primer elemento no incluido en la rebanada.

Rebanadas e índices negativos

❖ Si el end tiene un índice negativo, va a incluir ese elemento en la rebanada.


❖ Si start especifica un elemento que se encuentra más allá del descrito por end (índice negativo),
la rebanada estará vacía.
❖ Si se omite el start en la rebanada, se supone que se desea obtener un segmento que comienza
en el elemento con índice 0.
❖ Si se omite el end en tu rebanada, se supone que se desea que el segmento termine en el
elemento con el índice len(my_list). » Termina hasta el final de la lista.
❖ Al omitir tanto start como end, se crea una copia de toda la lista.

33
Instrucción del en rebanadas

❖ La instrucción del puede eliminar más de un elemento de la lista a la vez; puede eliminar
rebanadas.
❖ La rebanada no produce ninguna lista nueva.
❖ Si se eliminan todos los elementos de una lista a la vez, la lista quedará vacía [ ].
❖ Si se elimina la rebanada [:] del código, la instrucción del eliminará la lista (no su contenido) y
aparecerá un error en la consola.

Los operadores in y not in

Python ofrece dos operadores capaces de revisar la lista para verificar si un valor específico
está almacenado dentro de la lista o no. El operador in verifica si un elemento dado (el argumento
izquierdo) está actualmente almacenado en algún lugar dentro de la lista (el argumento derecho) - el
operador devuelve True si es así. El operador not in comprueba si un elemento dado (el argumento
izquierdo) está ausente en una lista - el operador devuelve True si es así.

34
Listas en aplicaciones avanzadas
Listas dentro de listas

❖ Las listas pueden constar de escalares (números) y elementos de una estructura mucho más
compleja (cadenas, booleanos, etc.).
❖ Arreglos: cuando los elementos de una lista son listas.
❖ Comprensión de lista: sintaxis especial utilizada por Python para completar o llenar listas
masivas. 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. Permite crear nuevas listas a partir de las
existentes de una manera concisa y elegante.

Arreglos de dos dimensiones

❖ Una lista se puede arreglar para que cree filas y columnas. » Arreglo bidimensional.
❖ Las listas de comprensión pueden ser anidadas para crear matrices. La parte interna crea una fila,
y la parte externa crea una lista de filas.
❖ El acceso al campo seleccionado de un tablero de ajedrez requiere dos índices: el primero
selecciona la fila y el segundo selecciona el número de columna.

Naturaleza multidimensional de las listas: Aplicaciones avanzadas

❖ Para encontrar cualquier elemento de una lista bidimensional, hay que usar dos coordenadas:
una vertical (número de fila) y una horizontal (número de columna).
❖ Se pueden anidar tantas listas en las listas como se desee para crear listas multidimensionales.

35
Funciones en Python
¿Por qué se necesitan las funciones?

Las funciones son herramientas que simplifican tareas tediosas y repetitivas. 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.

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.
Si un fragmento de código comienza a aparecer en más de una ocasión, se puede aislar en la forma
de una función invocando la función desde el lugar en el que originalmente se encontraba.

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 (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. Esta descomposición continúa 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á en él. 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.

36
Cada uno debe escribir un conjunto bien definido y claro de funciones, las cuales al ser
combinadas dentro de un módulo nos dará como resultado el producto final. 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 dónde provienen las funciones?

En general, las funciones provienen de al menos tres lugares: de Python mismo (funciones
integradas » parte integral de Python), de módulos preinstalados de Python (el programador debe
realizar algunos pasos adicionales para usarlas), directamente del código (el programador las crea) y
funciones lambda.

¿Cómo transformar código repetido en funciones?

¿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.

❖ Palabra clave def: significa definir.


❖ Darle un nombre a la función. » Mismas reglas que con las variables.
❖ Paréntesis y dos puntos.
❖ Instrucciones anidadas. » La función termina dónde el anidamiento termina.

¿Cómo funcionan las funciones?

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.

No se debe invocar una función antes de que se haya definido. Python lee el código de arriba
hacia abajo. No va a adelantarse en el código para determinar si la función invocada está definida más
adelante, (el lugar "correcto" para definirla es "antes de ser invocada").

Una función y una variable no pueden compartir el mismo nombre. El asignar un valor al nombre
de una función causa que Python olvide su rol anterior. Afortunadamente, es posible combinar o
mezclar el código con las funciones; no es forzoso colocar todas las funciones al inicio del archivo
fuente.

37
Las funciones comunican con su entorno
Funciones parametrizadas

Se puede pasar información a las funciones utilizando parámetros. Las funciones pueden tener
tantos parámetros como sean necesarios. Un parámetro es una variable, pero solo existe dentro de la
función donde ha sido definido y 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. Los argumentos existen fuera de las
funciones y son los que pasan los valores a los parámetros correspondientes. Un valor para el
parámetro llegará del entorno de la función.

❖ Es posible tener una variable con el mismo nombre del parámetro de la función. En la pantalla
aparecerán ambas si se invocan. » Sombreado.

Nota: Se debe proveer el mismo número de argumentos como haya parámetros definidos. Una función
puede tener tantos parámetros como se desee, pero entre más parámetros, es más difícil memorizar
su rol y propósito.

Paso de parámetros posicionales

❖ La técnica que asigna cada argumento al parámetro correspondiente es llamada paso de


parámetros posicionales, los argumentos pasados de esta manera son llamados argumentos
posicionales.
❖ El orden en que se ingresen los parámetros dentro de la función definida es relevante.

Paso de argumentos de palabra clave

Python ofrece otra manera de pasar argumentos, donde el significado del argumento está
definido por su nombre, no su posición. 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.

Nota: No se debe de utilizar el nombre de un parámetro que no existe.

Mezclando argumentos posicionales y de palabras clave

❖ Es posible combinar ambos tipos si se desea, pero se deben colocar primero los argumentos
posicionales y después los de palabra clave.

38
Valores predefinidos

❖ Si a uno de los parámetros de la función se le predefine un valor y al invocar la función, no se


agrega uno de los parámetros, aparecerá en su lugar el valor predefinido.

def introduction(first_name, last_name="González"):

print("Hola, mi nombre es", first_name, last_name)

introduction("Jorge", "Pérez")

introduction("Enrique")

introduction(first_name="Guillermo")

Hola, mi nombre es Jorge Pérez

Hola, mi nombre es Enrique González

Hola, mi nombre es Guillermo González

def introduction(first_name="Juan", last_name="González"):

print("Hola, mi nombre es", first_name, last_name)

introduction()

introduction(last_name="Rodríguez")

Hola, mi nombre es Juan González

Hola, mi nombre es Juan Rodríguez

39
Devolviendo el resultado de una función
Efectos y resultados: La instrucción return

❖ Para que una función devuelva un valor, se utiliza la instrucción return (regresar o retornar).
❖ Es una palabra clave reservada de Python.
❖ Return sin una expresión: si la función no posee argumentos, la instrucción return provocará su
terminación justo antes de la última instrucción.
❖ Return con una expresión: puede provocar la terminación inmediata de la ejecución de la función
o devolver el valor de la expresión como resultado de la función. "Transporta" el valor de la
expresión al lugar donde se ha invocado la función.

La instrucción None

❖ Sus datos no representan valor razonable alguno porque no es un valor en lo absoluto; por lo
tanto, no debe participar en ninguna expresión.
❖ Es una palabra clave reservada.
❖ Se le puede asignar como el valor a una variable.
❖ Puede ser el resultado de una función.
❖ Se puede utilizar al compararla con una variable para diagnosticar su estado interno.

Nota: Si una función no devuelve un cierto valor utilizando una cláusula de expresión return, se asume
que devuelve implícitamente None.

Efectos y resultados: Listas y funciones

❖ Si se pasa una lista a una función, la función tiene que manejarla como una lista.
❖ La función puede utilizar una lista como argumento.
❖ Una función también puede devolver una lista como resultado.

40
Alcances en Python
Funciones y alcances

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 sí. El parámetro es inaccesible fuera de la función. Una variable que existe fuera de una
función tiene alcance dentro del cuerpo de la función, excluyendo a aquellas que tienen el mismo
nombre. 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.

Palabra clave global

¿Una función es capaz de modificar una variable que fue definida fuera de ella? No, pero 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 global 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. » Utilizará el primer valor que se
definió en la variable justo después de la palabra clave global.

¿Cómo interactúa la función con sus argumentos?

Al cambiar el valor del parámetro, este no se propaga fuera de la función (no cuando la variable
es un valor escalar). 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.

Si el argumento es una lista, el cambiar el valor del parámetro correspondiente no afecta la lista
(las variables que contienen listas son almacenadas de manera diferente que las escalares); pero si
se modifica la lista identificada por el parámetro, la lista reflejará el cambio.

Funciones multiparámetro: Recursividad

❖ La recursividad es una técnica donde una función se invoca a sí misma.


❖ Si no se considera una condición que detenga las invocaciones recursivas, el programa puede
entrar en un bucle infinito.

Tuplas y diccionarios 41
Tipos de secuencias y mutabilidad

❖ Tipos de secuencias: tipo de dato capaz de almacenar más de un valor (o ninguno), los cuales
pueden ser secuencialmente examinados. » Puede ser escaneado por el bucle for.
❖ Las listas son secuencias de Python.
❖ Mutabilidad: propiedad de un dato que describe su disponibilidad para poder cambiar libremente
durante la ejecución de un programa. » Tipos de datos: mutables e inmutables.
• Los datos mutables pueden ser actualizados libremente en cualquier momento.
• Los datos inmutables no pueden ser modificados.

Tuplas

❖ Una tupla es una secuencia inmutable y ordenada. Se puede comportar como una lista, pero
no puede ser modificada en el momento.
❖ Las tuplas utilizan paréntesis redondos ( ); las listas usan paréntesis cuadrados [ ].
❖ También se pueden crear tuplas solo separando los valores / elementos por comas.
❖ La consola imprime una lista entre paréntesis.
❖ Cada elemento de una tupla puede ser de distinto tipo: flotante, entero, cadena, booleano, listas,
otras tuplas, etc.

¿Cómo crear una tupla?


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 dos
variables, no tuplas.

Funciones tuple() y list()


La función tuple() permite crear tuplas o convertir un iterable (lista, rango, cadena, etc.) en una
tupla. De la misma manera, la función list() convierte una tupla o un iterable en una lista. Para que
ambas funciones tengan efecto, se deben insertar dentro de una variable; y la lista y la tupla resultantes
toman el nombre de esa variable como propia.

lista_a_tupla = tuple(lista)

42
tupla_a_lista = list(tupla)

¿Cómo utilizar una tupla?


❖ No se puede agregar elementos a una tupla con la instrucción append().
❖ No se puede eliminar elementos de una tupla.
❖ La función len() acepta tuplas.
❖ El operador + puede unir tuplas.
❖ El operador * puede multiplicar la cantidad de elementos en una tupla.
❖ Los operadores in e in not también funcionan en tuplas.
❖ Las tuplas pueden intercambiar su orden.
❖ Las variables también pueden ser elementos de una tupla.
❖ Se puede utilizar el método count() para contar el total de veces que aparece un elemento en
una tupla.

Diccionarios

❖ Un diccionario no es una secuencia y es mutable.

¿Cómo crear un diccionario?


❖ Los diccionarios utilizan corchetes { }.
❖ Se pueden combinar cadenas y números para las claves y los valores.
❖ 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.

Diccionario = { Clave: Valor }

Un diccionario en Python funciona de la misma manera que un diccionario bilingüe. En el mundo


de Python, la palabra que se está buscando se denomina key. La palabra que se obtiene del diccionario
es denominada value. No se puede duplicar una clave (cada una es única); y las claves no son listas
(no guardan en orden sus elementos). Un diccionario es una herramienta de un solo sentido: solo
puede buscar las claves, no los valores; pero la función len() puede regresar la cantidad total de pares
(clave – valor) en el diccionario. La función print() imprime los elementos del diccionario de manera
aleatoria.

Los métodos get() , clear() y copy()


43
El método get() se utiliza en diccionarios para acceder al valor de una clave / elemento del
diccionario. Para que funcione, se debe insertar dentro de una variable, cuyo nombre se debe colocar
en la función print() para que la consola imprima el valor del elemento. En cambio, el método clear()
elimina todos los elementos de un diccionario. Por otra parte, el método copy() permite copiar un
diccionario en otro diccionario nuevo para no tener que digitar su contenido de nuevo.

Variable = Diccionario.get[“Clave a buscar”]

print(Variable)

Diccionario.clear()

Diccionario_2 = Diccionario_1.copy()

La función dict()
La función dict() convierte una tupla, una lista o un iterable en un diccionario. Para que funcione,
se debe insertar dentro de una variable; y la lista o la tupla resultantes toman el nombre de esa variable
como propia.

Diccionario = dict(tupla)

Diccionario = dict(lista)

¿Cómo utilizar un diccionario?


❖ El obtener el valor de un diccionario es semejante a la indexación, gracias a los corchetes
alrededor del valor de la clave.
❖ Si una clave es una cadena, se tiene que especificar como una cadena.
❖ Las claves son sensibles a las mayúsculas y minúsculas.
❖ No se puede utilizar una clave que no exista.

print( diccionario[“clave”] )

Métodos y funciones de los diccionarios

Los métodos keys() e items()


Un diccionario no puede ser examinado por el bucle for porque no es un tipo de dato secuencial.
No obstante, el método keys() puede adaptar cualquier diccionario a los requerimientos del bucle for.
El método retorna o regresa una lista de todas las claves dentro del diccionario. Al tener una lista de
44
claves se puede acceder a todo el diccionario de una manera fácil y útil. Otra manera de hacerlo es
utilizar el método items(). Este método retorna una lista de tuplas, donde cada tupla es un par clave
– valor.

Modificar, agregar y eliminar valores


El asignar un nuevo valor a una clave existente es sencillo debido a que los diccionarios son
completamente mutables, no existen obstáculos para modificarlos. El agregar una nueva clave con su
valor a un diccionario es tan simple como cambiar un valor. Solo se tiene que asignar un valor a una
nueva clave que no haya existido antes (se agrega al final). También es posible insertar un elemento
al diccionario utilizando el método update(). La instrucción del puede eliminar una clave del
diccionario, pero también removerá el valor asociado. Los valores no pueden existir sin sus claves ni
se pueden eliminar claves que no existen. Otra manera de eliminar el último elemento de un diccionario
es el método popitem().

Diccionario[“Clave a modificar”] = Nuevo valor

Diccionario[“Nueva clave”] = Nuevo valor

Diccionario.update({“Nueva clave”: “Nuevo valor”})

del diccionario[“Clave a eliminar”]

Nota: Las listas no permiten asignar valores a índices no existentes.

La función sorted() y el método values()


La función sorted() permite que la salida del bucle for en el diccionario esté ordenada
alfabéticamente. El método 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.

45
Excepciones
Errores en los datos frente a errores en el código

A veces, aunque el código esté correcto, el usuario ingresa datos incorrectos. En otras, se
cometen errores al escribir el código. Este tipo de error se denomina comúnmente "bug", que es una
manifestación de una creencia bien establecida de que, si un programa funciona mal, esto debe ser
causado por bichos maliciosos que viven dentro del hardware de la computadora y causan
cortocircuitos u otras interferencias.

¿Cuándo los datos no son lo que deberían ser?

Todas las líneas que muestra Python son significativas e importantes, pero la última línea parece
ser la más valiosa. La primera palabra de esta línea es el nombre de la excepción la cual provoca que
el código se detenga: ValueError. El resto de la línea es solo una breve explicación que especifica con
mayor precisión la causa de la excepción ocurrida.

Es posible comprobar si la variable value es de tipo int. Python tiene un medio especial para
este tipo de comprobaciones: el operador is. Su resultado es True si el valor actual de la variable es
del tipo int.

La rama try – except

Es mejor manejar un error cuando ocurre que tratar de evitarlo. La palabra clave try permite
colocar un código que se sospecha que es riesgoso y podría terminar en error. Este tipo de error lleva
por nombre excepción, mientras que la ocurrencia de la excepción se le denomina generar. Mientras
tanto, la palabra clave except puede manejar la excepción.

La excepción confirma la regla

Cualquier fragmento de código colocado entre try y except se ejecuta de una manera muy
especial: cualquier error que ocurra aquí dentro no terminará la ejecución del programa. En cambio, el
control saltará inmediatamente a la primera línea situada después de la palabra clave reservada except
y no se ejecutará ninguna otra línea del bloque try.

El código en el bloque except se activa solo cuando se ha encontrado una excepción dentro del
bloque try. No hay forma de llegar por ningún otro medio. Cuando el bloque try o except se ejecutan

46
con éxito, el control vuelve al proceso normal de ejecución y cualquier código ubicado más allá en el
archivo fuente se ejecuta como si no hubiera pasado nada.

¿Cómo lidiar con más de una excepción?

Se puede agregar dos bloques try por separado: uno que incluya la invocación de la función
input() donde se puede generar la excepción ValueError y el segundo dedicado a manejar posibles
problemas inducidos por la división. Ambos bloques try tendrían su propio except y de esa manera, el
programador tendría un control total sobre dos errores diferentes. Es una buena solución, pero un poco
larga y habría que agregar código adicional.

Dos excepciones después de un try


En esta variante, cada una de las excepciones esperadas tiene su propia forma de manejar el
error y cada except tienen nombres de excepción específicos; pero debe enfatizarse en que solo una
de todas puede interceptar el control: si se ejecuta una, todas las demás permanecen inactivas. No
hay una cantidad limitada de except, pero ninguna de las excepciones se puede especificar más de
una vez.

La excepción predeterminada y cómo usarla

Un except sin nombre de excepción específico es anónimo o es el por defecto. Cuando se


genere una excepción y no haya un except dedicado a esa excepción, esta será manejada por la
excepción por defecto. El except por defecto debe ser el último except.

Las excepciones más comunes

❖ ZeroDivisionError: el divisor es cero o no se puede distinguir de cero.


❖ ValueError: cuando una función int() o float() recibe un argumento de un tipo adecuado, pero su
valor es inaceptable.
❖ TypeError: se intenta aplicar un dato cuyo tipo no se puede aceptar en el contexto actual.
❖ AttributeError: activar un método que no existe en un elemento con el que se está tratando.
❖ SyntaxError: cuando el control llega a una línea de código que viola la gramática de Python.
❖ KeyboardInterrupt: cuando el usuario presiona la tecla de interrupción (CTRL – C o Eliminar).

¿Por qué Python pasa por alto un error de desarrollador tan evidente?

47
Python es un lenguaje interpretado. Esto significa que el código fuente se analiza y ejecuta al
mismo tiempo. En consecuencia, es posible que Python no tenga tiempo para analizar las líneas de
código que no están sujetas a ejecución.

Error frente a depuración (Bug vs debug)


La medida básica que un desarrollador puede utilizar contra los errores es un depurador,
mientras que el proceso durante el cual se eliminan los errores del código se llama depuración. Un
depurador es un software especializado que puede controlar cómo se ejecuta el programa. Con el
depurador, se puede ejecutar el código línea por línea, inspeccionar todos los estados de las variables
y cambiar sus valores en cualquier momento sin modificar el código fuente, detener la ejecución del
programa cuando se cumplen o no ciertas condiciones, y hacer muchas otras tareas útiles.

Depuración interactiva (print debugging)

En la depuración interactiva, el proceso necesita de la interacción del desarrollador para que se


lleve a cabo. Esta forma de depuración se puede aplicar al código mediante cualquier tipo de depurador.

Si el desarrollador no desea utilizar un depurador, puede utilizar la táctica de depuración por


impresión, donde se insertan varias invocaciones print() adicionales dentro del código para generar
datos que ilustran la ruta que el código está negociando actualmente. Puede imprimir los valores de
las variables que pueden afectar la ejecución. Este tipo de depuración no es interactiva en lo absoluto.

Una vez que se encuentran y eliminan los errores, las impresiones adicionales pueden
comentarse o eliminarse. No se ejecutan en el código final; pueden confundir tanto a los probadores
como a los usuarios.

Pruebas unitarias: Un mayor nivel de codificación

No se trata solo de probar el software, sino también (y sobre todo) de cómo se escribe el código.
Las pruebas unitarias asumen que las pruebas son partes inseparables del código y la preparación de
los datos de prueba es una parte inseparable de la codificación. Esto significa que cuando se escribe
una función o un conjunto de funciones cooperativas, también el programador está obligado a crear
un conjunto de datos para los cuales el comportamiento del código es predecible y conocido.

Además, hay que equipar al código con una interfaz que pueda ser utilizada por un entorno de
pruebas automatizado. En este enfoque, cualquier enmienda realizada al código (incluso la menos
significativa) debe ir seguida de la ejecución de todas las pruebas unitarias que acompañan al código

48
fuente. Para estandarizar este enfoque y facilitar su aplicación, Python proporciona un módulo
dedicado llamado unittest.

49

También podría gustarte