Programación en Python: Funciones y Subrutinas
Programación en Python: Funciones y Subrutinas
Bloque : Programación
Programando en Python
1. Introducción
El curso anterior dimos nuestros primeros pasos dentro del mundo de la programación con
Python. Aprendimos a:
– Utilizar y operar con los distintos tipos de datos.
– Crear y utilizar variables y listas.
– Mostrar información por pantalla utilizando la función print.
– Pasar valores al programa a través de la función input.
– Utilizar bloques condicionales if.
– Realizar procesos en bucle con las funciones for y while.
Este curso vamos continuaremos introduciendo nuevos conceptos que nos ayudarán a realizar
nuevas y más complejas tareas.
Aprenderemos a trabajar con funciones y módulos, aprenderemos a manejar diccionarios y
archivos externos.
Como bloque final del tema introduciremos un nuevo paradigma de programación, al que
llamaremos Programación Orientada a Objetos, que constituye el modo de programación más
utilizado en la actualidad.
Aprender a programar es una tarea que nunca termina. Espero que estos apuntes te sirvan para
continuar aprendiendo y sobre todo que despierten en ti el interés por esta actividad de tal forma
que te animes a seguir aprendiendo por tu cuenta.
-1-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
2. Concepto de subrutina
A veces, en un determinado programa es necesario efectuar una misma tarea en distintos
puntos del código. En otras ocasiones, diferentes programas necesitan efectuar una misma tarea.
Para evitar tener que volver a escribir una y otra vez las mismas instrucciones, los lenguajes de
programación permiten agrupar porciones de código y reutilizarlas, ya sea en el mismo programa
donde se han definido o en otros distintos. Estos bloques se llaman subrutinas.
Subrutina: Bloque de instrucciones que puede ser llamado para su ejecución en un
programa por medio de una orden sencilla.
Ventajas:
- Ahorran trabajo: Una vez creadas, no es necesario volver a programar ese bloque de
código una y otra vez.
- Facilitan el mantenimiento: Si corregimos errores o implementamos mejores en una
subrutina, esta modificación afectará a todos los puntos donde se aplique, sin tener que
revisar todos los sitios en que utilicemos el algoritmo.
- Simplifican el código: La longitud y complejidad del programa se reducen porque las tareas
repetitivas ya no aparecen en el cuerpo del programa.
- Facilitan la creación de programas: el trabajo se puede dividir entre varios programadores
(unos escriben las subrutinas, otros el cuerpo principal del programa, etc.).
Las subrutinas se pueden definir y utilizar de dos formas diferentes:
- Subrutina a utilizar en un único programa: Se suele definir dentro del propio programa que
la va a utilizar. En Python se suelen llamar funciones.
- Subrutina a utilizar en varios programas: Normalmente se incluirá la subrutina en un
fichero aparte al que los programas que la necesiten pueden acceder. Estos ficheros
reciben el nombre de bibliotecas (del inglés library) o módulos.
-2-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
3. Funciones
Función: Bloque de instrucciones que al ser llamado por el programa principal realiza la
acción definida en su código.
-3-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
-4-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
2
5
La función subrutina asigna el valor 2 a la variable a y muestra su valor por pantalla.
El código principal asigna a la variable a el valor 5, llama a la función subrutina(), que escribirá
un 2 y por último escribe el valor de la variable a que al estar fuera de la función continúa
teniendo el valor 5 ya que el valor 2 sólo se mantiene dentro de la función.
Las variables locales sólo existen en la propia función, no son accesibles desde niveles
superiores.
Por ejemplo:
def subrutina():
a=2
print(a)
return
subrutina()
print(a)
La orden print(a) generará un mensaje de error ya que intenta escribir el valor de una variable
que no existe fuera de la subrutina.
2
Traceback (most recent call last):
File "D:\Code\8. Ejercicios while 2\src\[Link]", line 7, in <module>
print(a)
NameError: name 'a' is not defined
Si en el interior de una función se asigna valor a una variable que no se ha declarado como
global o no local, esa variable es local a todos los efectos. Por ello el siguiente programa da error:
def subrutina():
print(a)
a=2
print(a)
return
a=5
subrutina()
print(a)
Genera:
Traceback (most recent call last):
File "D:\Code\8. Ejercicios while 2\src\[Link]", line 8, in <module>
subrutina()
File "D:\Code\8. Ejercicios while 2\src\[Link]", line 2, in subrutina
print(a)
UnboundLocalError: local variable 'a' referenced before assignment
La primera instrucción de la función produce un mensaje de error debido a que quiere imprimir
el valor de la variable "a" definida como local dentro de la función (por el simple hecho de que en
-5-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
la línea siguiente se la va a asignar un valor), pero a la que todavía no se le ha dado valor dentro de
la función (el valor de la variable "a" del programa principal no cuenta pues se trata de variables
distintas, aunque se llamen igual).
3.2.3 Variables libres globales o no locales
Si a una variable no se le asigna valor en ninguna parte de una función, Python la considera
libre y busca su valor en los niveles superiores de esa función, empezando por el inmediatamente
superior y continuando hasta el programa principal. Si a la variable se le asigna valor en algún nivel
intermedio la variable se considera no local y si se le asigna en el programa principal la variable se
considera global.
En el siguiente ejemplo la variable libre "a" de la función subrutina() se considera
global porque obtiene su valor del programa principal:
def subrutina():
print(a)
return
a=5
subrutina()
print(a)
Produciendo el resultado:
5
5
En la función subrutina(), la variable "a" es libre puesto que no se le asigna valor. Su valor se
busca en los niveles superiores, por orden. En este caso, el nivel inmediatamente superior es el
programa principal. Como en él hay una variable que también se llama "a", Python coge de ella el
valor (en este caso, 5) y lo imprime. Para la función subrutina(), la variable "a" es una variable
global, porque su valor proviene del programa principal.
En el ejemplo siguiente, la variable libre "a" de la función sub_subrutina() se considera
no local porque obtiene su valor de una función intermedia:
def subrutina():
def sub_subrutina():
print(a)
return
a=3
sub_subrutina()
print(a)
return
a=4
subrutina()
print(a)
Mostrando:
3
3
-6-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
4
En la función sub_subrutina(), la variable "a" es libre puesto que no se le asigna valor. Su valor
se busca en los niveles superiores, por orden. En este caso, el nivel inmediatamente superior es la
función subrutina(). Como en ella hay una variable local que también se llama "a", Python coge de
ella el valor (en este caso, 3) y lo imprime. Para la función sub_subrutina(), la variable "a" es una
variable no local, porque su valor proviene de una función intermedia.
Si a una variable que Python considera libre (porque no se le asigna valor en la
función) tampoco se le asigna valor en niveles superiores, Python dará un mensaje de
error.
-7-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
subrutina()
print(a)
El resultado será:
3
1
4
Al declarar nonlocal la variable "a", Python busca en los niveles superiores, por orden, una
variable que también se llame "a", que en este caso se encuentra en la función subrutina(). Python
toma el valor de esa variable, es decir, 3.
La última instrucción del programa escribe el valor de la variable global "a", que sigue siendo 4,
puesto que ninguna función la ha modificado.
Si a una variable declarada global o nonlocal en una función no se le asigna valor en el
nivel superior correspondiente, Python dará un error de sintaxis.
-8-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
-9-
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
a, b, c = 3, 5, 10
media = calcula_media(a, b, c)
print("La media de", str(a)+",", b, "y", c, "es:", media)
print("Programa terminado")
La expresión *args indica que la función calcula_media admitirá una serie indefinida de
argumentos y que trabajará con ellos como si fuera una lista.
Ojo: args es el nombre de la lista y como tal podemos elegir el nombre que queramos.
Así esta función puede ser utilizada con más flexibilidad que las anteriores. El programador
puede elegir de cuántos valores hacer la media y qué hacer con el valor calculado por la función.
- 10 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 11 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
5. Módulos, bibliotecas
Todo lo que veamos sobre módulos está enfocado a funciones. Cuando veamos
programación orientada a objetos veremos que es aplicable a clases.
Hasta ahora hemos definido módulo como, cualquier archivo de texto que contiene ordenes en
Python. Vamos a profundizar un poco en este concepto. Ahora que ya comprendemos mucho
más de Python podemos realizar esta definición:
Módulo: Archivo con extensión .py o .pyc (Python compilado) que posee un espacio de
nombres y que puede contener variables, funciones, clases y submódulos.
Trabajar con módulos nos va a permitir modularizar (organizar) y reutilizar el código.
Modularizar quiere decir dividir el código total en bloques independientes. La aplicación
completa se convierte en una especie de puzle que necesita de todas las pequeñas piezas
independientes (módulos) para trabajar.
En ocasiones puede suceder que queramos reutilizar una función desde distintos programas.
Una solución sería copiar el código de la función en cada uno de nuestros programas, pero esto no
es práctico por muchas razones. Por ejemplo, si modificáramos más adelante la función sería
necesario realizar esa modificación en todas las ocasiones que hubiéramos utilizado la función.
Python permite poner definiciones de funciones en módulos externos. Cuando queramos
utilizar estas funciones sólo será necesario llamarlas desde el módulo principal del programa.
En el siguiente ejemplo creamos un módulo que contendrá una función que permite calcular un
número definido de términos de la serie de Fibonacci.
Serie de Fibonacci: Serie numérica en la que el siguiente término se obtiene sumando
el valor de los dos anteriores. Los dos primeros términos de la serie son el 0 y el 1.
En primer lugar, creamos un módulo que guardaremos con el nombre [Link]
# módulo de números Fibonacci
def fib(n): # escribe la serie Fibonacci hasta n
a, b = 0, 1
while b < n:
print (b,end=’’)
a, b = b, a+b
def fib2(n): # devuelve la serie Fibonacci hasta n
resultado = []
a, b = 0, 1
while b < n:
[Link](b)
a, b = b, a+b
return resultado
El módulo consta de dos funciones: fib(n) que al ser invocada mostrará por pantalla los
términos de la serie y fib2(n) que almacenará los elementos de la serie en una lista, sin mostrarlos.
A continuación, crearemos el programa principal. Para poder utilizar en él las funciones
anteriores será necesario importar el modulo [Link]. Para ello utilizaremos la orden:
- 12 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
import fibo
Para acceder a las funciones utilizaremos la forma nombre_del_modulo.fun(arg). Donde:
- nombre_del_modulo es el nombre del módulo que hemos importado.
- fun es el nombre de la función incluida en el módulo que vamos a utilizar.
- arg valores asignados a los argumentos de la función invocada.
En el caso anterior:
import fibo
[Link](1000)
print()
print(fibo.fib2(1000))
Daría como resultado:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
- 13 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 14 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
def redondear(numero):
print("El número redondeado es: ", round(numero))
Vamos a crear ahora un módulo dentro de la carpeta Python. Este módulo utilizará las
funciones que están incluidas en el módulo cálculos_generales.py, que está guardado en la
carpeta cálculos.
Para ello, creo este nuevo módulo al que llamaré uso_modulos.py:
Si queremos llamar a la función dividir del módulo cálculos_generales.py del paquete cálculos,
tendremos que importarlo utilizando la sintaxis:
from calculos.calculos_generales import dividir
Ya podremos llamar a la función:
from calculos.calculos_generales import dividir
dividir(6, 3)
Que dará el resultado:
El resultado de la división es: 2.0
También habría sido posible realizar la importación del módulo completo:
import calculos.calculos_generales
Pero la llamada a la función de esta forma es muy farragosa:
calculos.calculos_generales.dividir(6, 3)
Si vamos al administrador de archivos de Windows:
- 15 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Veremos que de forma automática se ha creado dentro del paquete una carpeta __pycache__
que contiene los elementos que Python necesita para utilizar estos módulos como paquetes.
Subpaquetes
De cara a aumentar el nivel de organización, es posible crear subpaquetes dentro de un
paquete.
Por ejemplo dentro de nuestro paquete calculos podríamos crear varias carpetas agrupando el
tipo de módulos en función de tipo cálculos que realicen sus funciones.
Crearemos una carpeta basicos y otra a la que llamaré redondeo_potencia. Cada una de ellas
deberá llevar en su interior un archivo __init__.py.
Quedaría una estructura como:
- 16 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Los paquetes que hemos creado en el apartado anterior tienen su carpeta raíz en el mismo
directorio que el módulo que los va a utilizar, pero eso no tiene porque se ser siempre así. En
ocasiones sería más útil que Python los pudiera utilizar en cualquier proyecto, aunque estuviera en
otro directorio raíz o equipo.
A modo de ejemplo continuaremos con el ejemplo del punto anterior. Vamos a copiar el
módulo uso_modulos.py, que hasta ahora funcionaba de forma correcta por compartir directorio
raíz con el paquete y lo voy a pegar en un directorio exterior al raíz (por ejemplo el escritorio).
Renombraremos el modulo como uso_modulos_fuera.py, para no confundirlo con el anterior.
Si ejecutamos el archivo uso_modulos.py funcionará de forma correcta:
El resultado de la división es: 2.0
Sin embargo, el archivo uso_modulos_fuera.py genera un error:
Traceback (most recent call last):
File "D:\Users\joses\Desktop\uso_modulos_fuera.py", line 1, in <module>
from [Link].operaciones_basicas import dividir
ModuleNotFoundError: No module named 'calculos'
Vamos a resolver este problema. Nuestro nuevo módulo, y cualquier otro, ha de ser capaz de
utilizar las funciones definidas en el paquete.
Para ello en primer lugar crearemos un paquete distribuible y a continuación lo instalaremos en
nuestro Python.
En realidad, lo que estamos haciendo es instalar el paquete dentro del propio Python.
Creación del paquete distribuible
Vamos a crear un paquete distribuible que incluya la función dividir. Al hacerlo, dicha función
se podrá utilizar desde cualquier proyecto, ya que estará instalada en el propio Python.
Creamos un archivo con el nombre [Link] en la raíz de la carpeta que contenga a nuestro
módulo (en el ejemplo: python).
Este archivo contendrá una descripción de paquete que vamos a distribuir. Incluiremos cosas
como: el nombre del paquete, versión, nombre del autor, descripción…:
from setuptools import setup
setup(
name="paquetecalculos",
version="1.0",
description="Paquete de división entre dos valores",
author="IESFGC",
author_email="josesallan@[Link]",
url="[Link]",
packages=["calculos", "[Link]"]
)
Los campos autor_email y url son opcionales.
El campo packages es fundamental, indica cual es la dirección del paquete y módulo a
empaquetar para distribuir).
Guardamos el archivo [Link].
- 17 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Abrimos ahora una consola de Windows (botón Inicio, cmd) o el PoweShell que instala
Windows (vamos con administrador de archivos al directorio que contiene el archivos [Link] y
pulasmos shift+botón derecho del ratón)… esta última forma de trabajar ya nos abrirá la posición
en la que está el archivo :
Se realiza la instalación:
En el directorio donde está el paquete que queremos distribuir se habrán creado dos carpetas:
- 18 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Nos interesa la carpeta dist (distribución), dentro tendremos un archivo comprimido con
formato [Link].
Introducimos la instrucción:
pip3 install [Link]:
- 19 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Abrimos una consola, igual da el directorio en que nos encontremos y tecleamos la instrucción:
pip3 uninstall nombreDelPaquete
En nuestro caso:
- 20 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Método Descripción
Devuelve un número entero aleatorio entre a y b (ambos
[Link](a, b)
incluidos).-
Devuelve de forma aleatoria un carácter de una variable
[Link](secuencia)
o cadena de caracteres (secuencia).
Reorganiza los elementos de una variable tipo lista. La
[Link](lista)
lista mantiene su nombre de variable.
Devuelve n elementos aleatorios de una variable o
[Link](secuencia, n)
cadena de caracteres
Para poder utilizar los métodos incluidos en este módulo solamente es necesario utilizar la
orden:
import random
A partir de ese instante si por ejemplo se quiere generar un número aleatorio entre 1 y 7 será
suficiente con escribir:
[Link](1,7)
Al igual que hacíamos con los módulos de nuestras bibliotecas personales podremos importar
directamente las funciones incluidas en el módulo. El siguiente ejemplo importaría los
procedimientos randint y simple del módulos random:
from random import randint, sample
- 21 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
A partir de ese momento para utilizar cualquiera de esos módulos es suficiente con nombrarlo
directamente y no usar la sintaxis nombre_modulo.procedimiento. Según lo anterior:
randint(1,7)
- 22 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
7. Excepciones y su gestión
Excepción: Error que ocurre durante la ejecución del programa. La sintaxis es correcta, pero
durante la ejecución ocurre “algo inesperado”.
Al llegar la excepción, Python genera un mensaje de error y la ejecución del programa se
detiene.
Aprenderemos a gestionar las posibles excepciones. El programa será capaz de reconocer la
excepción y generará una respuesta adecuada, permitiendo que el programa continúe.
- 23 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Observa la última parte de la pantalla del ejemplo anterior, recibe el nombre de pila de
llamadas:
Traceback (most recent call last):
File "..\src\[Link]", line 3, in <module>
c=a/b
ZeroDivisionError: division by zero
Se muestra la información relativa a las últimas líneas de código que se han ejecutado hasta
producirse el error. En este caso indica que la última línea que se ha intentado ejecutar es la
número 3 (c=a/b). También nos indica el tipo de error que se ha generado, en este caso
ZeroDivisionError, siendo este un error de división por cero. Utilizaremos el nombre del tipo de
error.
Para gestionar el posible error modificamos el código de la siguiente forma:
a=int(input("Introduce un número entero: "))
b=int(input("Introduce un número entero: "))
try:
c=a/b
print(a,"/",b," = ", c)
except ZeroDivisionError:
print("No se puede dividir entre 0")
print("Operación ejecutada")
En negrita se indica como se gestiona el error. La estructura es parecida a un bloque if…else:
- El programa intenta realizar las ordenes incluidas dentro del bloque try.
- Cuando no se pueda ejecutar el bloque incluido en try y solo si el error producido es del
tipo ZeroDivisionError se ejecutará el bloque de instrucciones incluidas en del apartado
except.
Es decir:
- Si no hay error de división por cero:
Introduce un número entero: 8
Introduce un número entero: 2
8 / 2 = 4.0
Operación ejecutada
- Si hay error de división por cero:
Introduce un número entero: 8
Introduce un número entero: 0
No se puede dividir entre 0
Operación ejecutada
En ese segundo caso se ha conseguido dos cosas:
- Se ha gestionado el error producido al intentar dividir por cero.
- El programa continúa su ejecución tras la línea que habría generado el problema.
- 24 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 25 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 26 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 27 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Más adelante veremos cómo crear nuestras propias excepciones con un nombre
específico.
Capturar una excepción
En el caso anterior el programa se detiene cuando generamos la excepción, veamos ahora
como la podemos capturar y gestionar.
Veamos otro ejemplo. Vamos a crear un programa que calcule la raíz cuadrada de un número.
Como recordarás necesitaremos importar el módulo math y el método sqrt.
import math
def calculaRaiz(num):
if num<0:
raise ValueError("El número no puede ser negativo")
else:
return [Link](num)
opt1=int(input("Introduce un número: "))
print(calculaRaiz(opt1))
print(“Programa finalizado”)
- 28 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
import math
def calculaRaiz(num):
if num<0:
raise ValueError("El número no puede ser negativo")
else:
return [Link](num)
opt1=int(input("Introduce un número: "))
try:
print(calculaRaiz(opt1))
except ValueError:
print("Error de Numero Negativo")
print("Programa finalizado")
Generará:
Introduce un número: -256
Error de Numero Negativo
Programa finalizado
- 29 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
8. Diccionarios
Diccionario: Lista no ordenada de términos. Cada uno de los términos queda definido por
una clave única y almacena uno o varios valores.
Un ejemplo de diccionario podría ser un horario escolar. El diccionario tendría cinco términos.
Cada uno de ellos quedaría identificado por una clave (el día de la semana) y cada uno de ellos
almacenaría el nombre de las asignaturas de las que tengamos clase en ese día.
- 30 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Cada elemento se define con un par clave:valor, pudiendo ser la clave y el valor de
cualquier tipo de dato (‘int’, ‘float’, ‘chr’, ‘str’, ‘bool’, ‘object’).
OJO: el diccionario no se muestra con el orden en que se han definido los términos.
- 31 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 32 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 33 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 34 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Esta aplicación no realizará ninguna acción en la ventana de Eclipse, es solo válida para
el trabajo con consola.
- 35 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
borrarPantalla()
Aplicación sencilla: Generar una pequeña animación
Vamos a mostrar un mensaje dinámico o simular movimiento.
Para entender a que nos referimos, veamos los siguientes ejemplos:
# Mensaje dinámico
import os
import time
if [Link] == "posix":
var = "clear"
elif [Link] == "ce" or [Link] == "nt" or [Link] == "dos":
var = "cls"
[Link](2)
[Link](var)
print("****************************************")
print("* *")
print("* ¡Bienvenidos a [Link]! *")
print("* *")
print("****************************************")
[Link](2)
[Link](var)
print("****************************************")
print("* *")
print("* Aquí aprenderas a programar con Python *")
print("* *")
print("****************************************")
[Link](2)
[Link](var)
print("****************************************")
print("* *")
print("* Es totalmente gratis *")
print("* *")
print("****************************************")
[Link](2)
- 36 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
En este caso la dirección del directorio que contiene el módulo es: D:\ejemplo
Vamos a la consola y nos movemos a esa dirección:
Ejecutamos ahora la orden pyinstaller seguida de un espacio y del nombre del módulo:
- 37 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Dentro de la carpeta dist se habrá creado una carpeta con el nombre del módulo (if01 en el
ejemplo). Dentro de ella encontraremos muchos archivos. Todos ellos son necesarios para hacer
funcionar el ejecutable.
El archivo ejecutable es el que tiene extensión .exe ([Link]) en el ejemplo. Si hacemos doble
clic sobre su icono el programa arrancará.
Empaquetar todos los archivos en un único .exe
Para compilar todos los archivos anteriores en un único archivo utilizamos un modificador en la
instrucción anterior:
pyinstaller --onefile [Link]
Se creará un único archivo con el siguiente icono:
Al hacer doble clic se ejecutará la aplicación (tardará un poco más que antes ya que ahora es
necesario leer todos los archivos que están contenidos dentro de nuestro .exe).
Sustituir el icono por uno personalizado
Antes de crear el ejecutable hay que guardar en el mismo directorio que hayamos ubicado el
módulo .py de la imagen con el logo en formato .ico.
Añadiremos un nuevo modificador en el momento de crear el ejecutable:
pyinstaller --onefile --icon=./[Link] [Link]
Aplicaciones gráficas sin consola
Si el módulo .py con el que trabajamos funciona con una interfaz gráfica (veremos algo de ello
al final del curso), cuando lo ejecutemos, tras la interfaz gráfica se verá la consola de Windows, lo
cual queda antiestético. Para que no se muestre la consola añade a la orden pyinstaller un
modificador:
pyinstaller --windowed [Link]
- 38 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Estas operaciones permiten conseguir algo que hasta hora no podíamos hacer,
conseguir la persistencia de los datos. Leer datos que utilicen nuestros módulos y
guardar datos que más adelante podremos recuperar.
- 39 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 40 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 41 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
'Nothing you can say but you can learn how to play the game.\n', "It's easy.\n", '\
n', "Nothing you can make that can't be made.\n", "No one you can save that
can't be saved.\n", 'Nothing you can do but you can learn how to be you in time.\
n', "It's easy.\n"]
Podremos manejar la información exactamente igual que cualquier otra lista. Así si queremos
imprimir la primera línea de la letra de la canción:
print(songLista[2])
Mostrará:
There's nothing you can do that can't be done.
Si queremos leer todas las líneas del archivo con su formato original, podemos utilizar un for:
fichero = open("[Link]", "r")
contenido = [Link]()
for i in contenido:
print(i)
[Link]()
La primera línea de código abre el archivo [Link] y lo asocia a un objeto archivo que
llamaremos fichero.
La segunda línea crea una lista con el nombre contenido. Cada elemento de esta lista será una
de las líneas de fichero.
La variable i del bucle va tomando en cada iteración como valor el contenido de una nueva
línea.
La última línea cierra el [Link].
Si ejecutamos el programa obtendremos:
All You Need Is Love - John Lennon/Paul McCartney
- 42 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
El método .stript() funciona de forma similar, pero elimina todos los espacios y en
blanco (y el retorno de carro) que tenga la cadena de texto al comienzo y al final.
- 43 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 44 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- El primer [Link]() da como resultado un 0 por ser la posición inicial del puntero.
- La orden [Link](7) lee siete caracteres desde la posición actual del puntero (All You).
- A continuación, llevamos el puntero a la posición 10 y mostramos el puntero de nuevo.
- La siguiente orden lee 5 caracteres, desde la posición actual (10): (ed Is).
- La posición final del puntero es 15.
- Si leemos 7 caracteres más, se leen desde la posición actual del puntero (15 – “Love – “.
También es posible modificar la posición del puntero de forma relativa a la posición actual.
Así:
fh = open("[Link]")
print([Link](15))
[Link]([Link]() -7) # fijamos la posición actual siete caracteres a la izquierda:
print([Link](7))
[Link]([Link]() + 25) # Avanzamos 25 caracteres a la derecha
- 45 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
print([Link](9))
Produce como resultado:
All You Need Is
Need Is
McCartney
Observa que una vez que definimos el punto en el que se quiere escribir, el nuevo
texto sustituye al anterior (no se produce inserción de texto sino sustitución).
El ejemplo anterior se podría realizar a partir de un archivo inicial con la información “Color
marrón”, sería necesario realizar la apertura en modo r+ para evitar eliminar la información inicial.
- 46 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 47 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
11.7.2Método load
Permite leer una cadena de bytes generada previamente por pickle y recuperar el objeto a
partir del cual se ha generado.
Antes de utilizar load debemos abrir el archivo en modo lectura de bytes para lo cual
es necesario que el segundo parámetro de open sea “br” o “rb”.
A modo de ejemplo vamos a crear el código necesario para leer el archivo [Link] que creamos en
el apartado anterior:
1 import pickle
2 file = open("[Link]", "br")
3 villas=[Link](file)
4 print(villas)
5 [Link]()
Analicemos cada línea de código.
1. Importamos el módulo pickle
2. Abrimos el archivo [Link] en modo lectura de bytes y lo asignamos al objeto archivo con
el nombre file.
3. Leemos el archivo y guardamos la información en una variable de nombre villas. Como el
contenido almacenado en file es una lista, villas tomará el formato de variable lista.
4. Escribimos el contenido de la lista villas.
5. Cerramos el archivo.
El objeto empaquetado podría ser todo lo complejo que yo quisiera. Por ejemplo, una
lista de objetos, cada uno de los cuales fuera a su vez una lista (nombre jugador,
número camiseta, posición en el campo, titular/suplente…)
- 48 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Recuerda que en un objeto shelve las claves de los valores han de ser cadenas de
texto.
- 49 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Nota: Intentar abrir un archivo que no existe, en modo lectura (r) genera un error; en
cambio si lo abrimos para escritura se crea un archivo (w, a, w+ o con a+).
Si no se especifica el modo, los archivos son abiertos en modo sólo lectura (r).
- 50 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 51 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 52 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Recuerda que un objeto quedará definido por sus propiedades, comportamientos y estados.
Vamos a ir añadiendo los mismos:
13.1.1Añadir propiedades y estados:
Solo es necesario definir el nombre de la propiedad y su valor, por ejemplo:
class Coche():
largoChasis = 250
anchoChasis = 120
ruedas = 4
enMarcha = False
En realidad, enMarcha sería un estado y no una propiedad, por ser un valor que
podremos cambiar. Es decir enMarcha (estado) podrá ser True en algún momento, sin
embargo el número de ruedas (propiedad) no cambiará.
Todos los objetos que, más adelante, creemos pertenecientes a la clase Coche tendrán en
común un chasis que medirá 250 cm de largo, 120 cm de ancho, cuatro ruedas e inicialmente no
estarán en marcha.
13.1.2Añadir comportamientos, procedimientos o métodos:
Un método va a ser un bloque de código, una “función”, perteneciente a una clase, que
permite hacer una o varias acciones.
Sintaxis
- Palabra reservada def (igual que haríamos con una función).
- Nombre del método, paréntesis y en su interior escribimos como parámetro la palabra self.
Terminamos la línea con dos puntos.
- Bloque de código que define que va a hacer el método (indentado).
self indica como parámetro que el método se refiere al propio objeto que creemos en
un futuro (es decir a sí mismo).
En nuestro ejemplo vamos a crear un método que permita arrancar a los coches que creemos
más adelante. Este método permitirá cambiar el valor del estado enMarcha en los objetos que
creemos en un futuro de False a True:
- 53 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
class Coche():
largoChasis = 250
anchoChasis = 120
ruedas = 4
enMarcha = False
def arrancar(self):
[Link] = True
- 54 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
A modo de práctica intenta añadir un procedimiento que nos diga si nuestro coche está en marcha
o está parado:
class Coche():
largoChasis = 250
anchoChasis = 120
ruedas = 4
enMarcha = False
def arrancar(self):
[Link] = True
def estado(self):
if ([Link] == True):
return "El coche está en marcha"
else:
return "El coche está parado"
miCoche = Coche()
print("La longitud de mi coche es:", [Link])
# Llamo al método que arranca mi coche
[Link]()
# Muestro por pantalla el estado del coche a través de un método
print([Link]())
miCoche = Coche()
print("La longitud de mi coche es:", [Link])
# Llamo al método que arranca mi coche
[Link]()
# Muestro por pantalla el estado del coche a través de un método
print([Link]())
- 55 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 56 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
A modo de ejemplo vamos a modificar el código anterior de tal forma que el método arrancar no
se encargue solamente de arrancar el coche, si no que informe también del estado. Por otro lado,
cambiaremos la función del método estado para que nos informe del número de ruedas, ancho y
largo de cada uno de los dos objetos del ejemplo anterior.
La idea es llamar al método arrancar, pero pasándole un parámetro que indique si estamos
arrancando o no.
class Coche():
largoChasis=250
anchoChasis=120
ruedas=4
enMarcha=False
def arrancar(self,arrancamos):
[Link]=arrancamos
if ([Link]==True):
return "El coche está en marcha"
else:
return "El coche está parado"
def estado(self):
print("El coche tiene ", [Link], "ruedas. Un ancho de ", [Link],
" y un largo de ", [Link])
miCoche=Coche()
print([Link](True))
[Link]()
- 57 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 58 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Para que esta orden tenga sentido, será necesario haber modificado previamente la definición
de la clase y su constructor. Quedaría:
class Coche():
def __init__(self, parametro):
[Link]=250
[Link]=120
[Link]=4
[Link]=False
[Link]=parametro
Observa la última línea. Cuando se cree el objeto le asignará un valor a la propiedad color. Este
valor no será el mismo para todos los coches. Será definido por el valor que enviamos como
parámetro al realizar la creación del objeto.
miCoche = Coche()
Se genera el error:
miCoche = Coche()
TypeError: Coche.__init__() missing 1 required positional argument: 'parametro'
process is terminated with return code 1.
La razón es que el método constructor está esperando un valor para el parámetro “parametro”
y no está recibiendo ninguno.
A veces puede ser muy útil asignar un valor por defecto al parámetro en la orden __init__ del
constructor. En caso de que no enviemos ningún valor en la orden de ejecución, el parámetro
tomará dicho valor.
La sintaxis es muy sencilla, es suficiente con escribir el signo = seguido del valor por defecto tras
el nombre del parámetro. Observa el ejemplo:
class Coche():
def __init__(self, parametro="Azul"):
[Link] = 250
[Link] = 120
[Link] = 4
[Link] = False
[Link] = parametro
- 59 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
miCoche = Coche()
print([Link])
La llamada Coche() crea un objeto de la clase Coche, la propiedad color toma el valor por
defecto (Azul):
Azul
- 60 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 61 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
self.__enMarcha=arrancamos
if (self.__enMarcha==True):
return "El coche está en marcha"
else:
return "El coche está parado"
def estado(self):
print("El coche tiene ", self.__ruedas, "ruedas. Un ancho de ",
self.__anchoChasis, " y un largo de ", self.__largoChasis)
miCoche=Coche()
print([Link](True))
[Link]()
- 62 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 63 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- En función de que el valor enviado sea True o False, arrancamos el coche o no.
Modifiquemos este código teniendo en cuenta que debemos realizar la llamada al método de
chequeo. En primer lugar, hay que tener en cuenta que el chequeo solamente se realizará
cuando el método arrancar esté enviando como parámetro el valor True (es decir cuando
estamos intentando arrancar). Una posible opción sería:
def arrancar(self,arrancamos):
if arrancamos== True:
chequeo=self.chequeo_interno()
if (chequo==True):
self.__enMarcha= True
return "El coche está en marcha"
else:
return " Algo ha ido mal en el chequeo. No es posible arrancar "
else:
return " El coche está parado "
En primer lugar, comprobamos que valor toma el parámetro del método arrancamos. Si es
True (queremos arrancar) comprobamos si el coche puede arrancar a través del método
chequeo_interno. Si este método genera True, arrancamos, si no lo hace, informamos de la
imposibilidad de realizar el arranque. En caso de que hayamos enviado el valor False como
parámetro en el método arrancar, el coche estará parado.
Juntándolo todo, la clase coche quedaría:
class Coche():
def __init__(self):
self.__largoChasis=250
self.__anchoChasis=120
self.__ruedas=4
self.__enMarcha=False
def arrancar(self,arrancamos):
if arrancamos== True:
chequeo=self.chequeo_interno()
if (chequo==True):
self.__enMarcha= True
return "El coche está en marcha"
else:
return " Algo ha ido mal en el chequeo. No es posible arrancar "
else:
return " El coche está parado "
def estado(self):
print("El coche tiene ", self.__ruedas, "ruedas. Un ancho de ",
self.__anchoChasis, " y un largo de ", self.__largoChasis)
def chequeo_interno(self):
print("Realizando chequeo interno")
[Link]="ok"
[Link]="ok"
if([Link]=="ok" and [Link]=="ok"):
return True
else:
return False
- 64 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 65 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
[Link]()
print(miCoche2.chequeo_interno())
Generaría:
----Creamos un nuevo objeto: miCoche2---
El coche está parado
El coche tiene 4 ruedas. Un ancho de 120 y un largo de 250
Realizando chequeo interno
True
Para evitar estos problemas encapsularemos el método. Su uso quedará restringido al interior
de la clase.
La sintaxis es sencilla:
- Comenzar con dos guiones bajos su nombre en la definición.
En nuestro ejemplo:
class Coche():
def __init__(self):
self.__largoChasis=250
self.__anchoChasis=120
self.__ruedas=4
self.__enMarcha=False
def arrancar(self,arrancamos):
if arrancamos== True:
chequeo=self.__chequeo_interno()
if (chequo==True):
self.__enMarcha= True
return "El coche está en marcha"
else:
return " Algo ha ido mal en el chequeo. No es posible arrancar "
else:
return " El coche está parado "
def estado(self):
print("El coche tiene ", self.__ruedas, "ruedas. Un ancho de ",
self.__anchoChasis, " y un largo de ", self.__largoChasis)
def __chequeo_interno(self):
print("Realizando chequeo interno")
[Link]="ok"
[Link]="ok"
if([Link]=="ok" and [Link]=="ok"):
return True
else:
return False
Si intentamos ahora ejecutar el método desde los objetos:
miCoche=Coche()
print([Link](True))
[Link]()
print(miCoche.chequeo_interno())
- 66 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Obtendremos:
Realizando chequeo interno
El coche está en marcha
El coche tiene 4 ruedas. Un ancho de 120 y un largo de 250
Traceback (most recent call last):
File "…Ensayos curos\src\[Link]", line 31, in <module>
print(miCoche.__chequeo_interno())
AttributeError: 'Coche' object has no attribute '__chequeo_interno'
El programa detecta que estamos intentando ejecutar el método encapsulado desde fuera de la
definición de clase y por lo tanto da un error.
Si retiramos las llamadas al método chequeo_interno desde los objetos todo funcionará de
forma correcta.
- 67 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 68 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
18. Herencia
Herencia: Procedimiento mediante el cual una clase adquiere características y
comportamientos de otra clase de un nivel jerárquico superior.
Sea el ejemplo una serie de cinco clases relacionadas según la siguiente jerarquía de herencia.
La clase 1, ocupa el primer nivel en la escala jerárquica, recibe el nombre clase padre o
superclase.
La clase 2 heredará propiedades de la clase 1 por lo que es subclase de esta.
Por otro lado, las clases 3, 4 y 5 heredarán propiedades de la clase 2. Por la tanto la clase 2 es
superclase de ellas y 3, 4 y 5 son subclases de 2.
- 69 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
le añadiremos a cada una las peculiaridades de ese tipo de vehículo (por ejemplo, número
de ruedas).
18.2 Sintaxis
Guarda todo el código que veamos en este punto en un módulo con nombre
[Link], lo reutilizaremos más adelante.
Superclase
En primer lugar, crearemos la superclase, la llamamos Vehículos, seguimos las normas
habituales:
class Vehiculos():
def __init__(self, marca, modelo):
[Link]=marca
[Link]=modelo
[Link]=False
[Link]=False
[Link]=False
def arrancar(self):
[Link]=True
def acelerar(self):
[Link]=True
def frenar(self):
[Link]=True
def estado(self):
print("Marca:", [Link],"\nModelo:", [Link],"\nEn Marcha:",
[Link],"\nAcelerando:", [Link],"\nFrenando:", [Link])
La superclase contiene:
- Un constructor que ha de recibir por parámetros (además de self) marca y modelo.
- Dentro del constructor se definirá la propiedad marca y modelo según los valores que
introduzcamos al llamar al constructor y además agregamos tres propiedades (enMarcha,
acelera y frena) cuyos valores por defecto son False (al construir el objeto está quieto).
- Tres métodos que permiten arrancar, acelerar y frenar.
- Un método que permite mostrar el estado del vehículo.
Clase moto que hereda propiedades y métodos de la clase Vehiculo
Definimos la clase igual que hasta ahora pero dentro de los paréntesis incluimos el nombre de
la superclase de la cual la nueva clase tiene que heredar. En nuestro ejemplo:
class Moto(Vehiculos):
pass
(pass se correspondería con el código particular de la clase Moto, de momento no añado nada).
Si ahora creamos un objeto de la clase Moto (ten en cuenta que hay que pasarle los parámetros
marca y modelo) y a continuación ejecutamos el método estado:
miMoto=Moto("Honda", "Special")
[Link]()
- 70 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
El resultado será:
Marca: Honda
Modelo: Special
En Marcha: False
Acelerando: False
Frenando: False
- 71 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
def caballito(self):
[Link]="Voy haciendo el caballito"
def estado(self):
print("Marca:", [Link],"\nModelo:", [Link],"\nEn Marcha:",
[Link],"\nAcelerando:", [Link],"\nFrenando:", [Link],"\n",
[Link])
Nos dará como resultado:
Marca: Honda
Modelo: Special
En Marcha: False
Acelerando: False
Frenando: False
Voy haciendo el caballito
- 72 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 73 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
En este caso queremos llamar al método constructor de la clase padre Persona. La sintaxis sería:
class Empleado(Persona):
def __init__(self, nombre, edad, lugar_residencia, salario, antiguedad):
super().__init__(Persona, nombre, edad, lugar_residencia)
[Link] = salario
[Link] = antiguedad
Mostrar el estado completo utilizando la función super():
Sí aplicamos el método descripcion que creamos para la clase Persona a un objeto de la sublase
Empelado, no mostrará sus cinco propiedades, si no que solo mostrará las tres primeras. Tal y
como vimos en el punto anterior, es necesario sobreescribir el método descripcion heredado por
uno nuevo que podría tener la forma:
def descripcion(self):
print("Nombre:", [Link], "Edad:", [Link], "Resiencia:",
self.lugar_residencia)
print("Salario:", [Link],"Antigüedad:",[Link])
Sin embargo, si observas la línea en rojo, esa información ya es mostrada por el método
descripcion de la superclase, por lo tanto podemos utilizar la función super():
def descripcion(self):
super().descripcion()
print("Salario:", [Link],"Antigüedad:",[Link])
Simplificando el código y aprovechando lo que ya hemos creado en un bloque anterior.
En conjunto:
class Persona():
def __init__(self,nombre,edad, lugar_residencia):
[Link]=nombre
[Link]=edad
self.lugar_residencia=lugar_residencia
def descripcion(self):
print("Nombre:",[Link], "Edad:", [Link],
"Residencia:",self.lugar_residencia)
class Empleado(Persona):
def __init__(self,salario,antiguedad, nombre_empleado, edad_empleado,
residencia_empleado):
super().__init__(nombre_empleado, edad_empleado, residencia_empleado)
[Link]=salario
[Link]=antiguedad
def descripcion(self):
super().descripcion()
print("Salario:", [Link],"Antigüedad:",[Link])
Antonio=Empleado(1500,15,"Antonio",17,"Zaragoza")
[Link]()
Dando como resultado:
Nombre: Antonio Edad: 17 Residencia: Zaragoza
Salario: 1500 Antigüedad: 15
- 74 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
objeto = MiClase()
print(type(objeto))
Obtenemos la respuesta:
<class '__main__.MiClase'>
- 75 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
20.1 Sintaxis
Basta con definir la nueva clase por su nombre y entre paréntesis llamar a todas aquellas clases
de las cuales vaya a heredar. En este caso:
class BicicletaElectrica(Vehiculos,VElectricos):
pass
Puedo ahora crear objetos de la clase BicicletaElectrica con una llamada del tipo:
miBici=BicicletaElectrica(“Yamaha”,HC098”)
El orden en el que pongamos el nombre de las clases padre a la hora definir la clase
hijo es muy importante ya que se da prioridad a la clase que se indica en primer lugar.
Así:
- Si ambas clases tienen un método con el mismo nombre, se heredará el método de la
clase padre que se escriba en primer lugar en la definición de la clase hijo.
- El número de parámetros que tengo que definir para crear el objeto hijo será igual al
número de parámetros que tenga la primera de las funciones padre (en nuestro
ejemplo he llamado primero a Vehiculos, por lo tanto hay que definir sus dos
parámetro, si hubiera llamado primero a VElectricos no habría que poner ninguno.
- 76 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
21. Polimorfismo
Polimorfismo: Un objeto puede cambiar de forma (propiedades y comportamientos) en
función de cuál sea el contexto en el que se utilice.
Siguiendo con el ejemplo de los vehículos, sería hacer que objeto coche pase a ser un camión…
Veamos un nuevo ejemplo:
class Coche():
def desplazamiento(self):
print("Me desplazo utilizando cuatro ruedas")
class Moto():
def desplazamiento(self):
print("Me desplazo utilizando dos ruedas")
class Camion():
def desplazamiento(self):
print("Me desplazo utilizando seis ruedas")
Hemos creado tres clases. Cada una de ellas tiene un método al que hemos llamado
desplazamiento, pero el texto generado por cada uno de ellos es diferente.
Crearemos ahora un objeto moto y ejecutemos el método desplazamiento:
miVehiculo=Moto()
[Link]()
El resultado por pantalla será:
Me desplazo utilizando dos ruedas
Si ahora queremos que nuestro objeto pase a ser de la clase Coche habrá que hacer lo
siguiente:
Creamos una función que va a recibir por parámetro el nombre del tipo de clase
correspondiente al tipo de vehículo que queremos crear:
def desplazamientoVehiculo(vehiculo):
[Link]()
Esta función llama al método desplazamiento de la clase asociada a la clase definida por el
parámetro vehiculo. Así para llamar a la función, en el caso de que el objeto sea una moto:
miVehiculo=Moto()
desplazamientoVehiculo(miVehiculo)
La respuesta será:
Me desplazo utilizando dos ruedas
Si queremos que este objeto pase a comportarse como un coche bastaría con volver a definir su
clase:
miVehiculo=Moto()
desplazamientoVehiculo(miVehiculo)
miVehiculo=Camion()
desplazamientoVehiculo(miVehiculo)
- 77 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 78 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Método Descripción
capitalize() La primera letra de la cadena pasa a ser mayúscula, el resto serán minúsculas.
Existen muchos métodos más para la clase String. Explicarlos todos aquí, carece de sentido. De
forma similar alguno de los métodos que aparecen en la lista anterior tienen alguna peculiaridad
sintáctica que no es necesario saber de memoria. Es mucho mejor saber dónde buscar.
Si buscamos en Google “Documentación de Python” el primer enlace debería de ser el sitio
[Link] Haciendo clic en el vínculos “Referencia de bibliotecas”,
llegaremos a una tabla de contenidos desde la que podemos obtener información sobre todos los
elementos incluidos en la biblioteca de Python.
En este caso la información sobre los métodos de cadenas está incluida en punto 2.1.5 Tipos
secuenciales. Bajando al final de la página, tenemos el punto [Link] que nos habla sobre los
métodos de las cadenas.
- 79 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Este punto nos dará una descripción de cada uno de los métodos y de los parámetros que son
necesario pasar al método para que funcionen de forma correcta.
Así por ejemplo queremos utilizar el método count, obtenemos la siguiente información:
- 80 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Hasta ahora resolvíamos este problema utilizando el concatenador “+” en lugar de la coma.
Esta forma de trabajar puede crear otros problemas. Por ejemplo en este caso, si sustituimos las
comas por el concatenador, el código sería:
print("Hola " + nombre + " tienes " + edad + " años.")
Esta línea va a generar un error. ¿Puedes identificarlo?
La variable edad es un número entero. Por lo tanto el operador + no sabe si tiene que actuar
como un concatenador o como símbolo suma:
Introduce tu nombre: Andrés
Introduce tu edad: 17
Traceback (most recent call last):
print("Hola " + nombre + ", tienes" + edad + " años.")
TypeError: can only concatenate str (not "int") to str
Para evitar este error necesitaríamos transforma el objeto edad que es un entero en un objeto
de tipo string, utilizando la función str:
print("Hola " + nombre + ", tienes " + str(edad) + " años.")
Además de esto, hay que tener en cuenta los espacios en blanco que deberíamo añadir dentro
de los segmentos de texto.
Poco a poco vamos generando una expresión complicada y difícil de entender.
En lugar de hacer esto vamos a utilizar el método format.
El método format() en Python permite crear cadenas compuestas por partes estáticas y partes
variables, donde los valores de estas variables se insertan en la cadena en posiciones específicas
definidas por marcadores de posición.
Sintaxis básica:
cadena_formateada = cadena_original.format(valor1, valor2, ...)
Donde cadena_original es una cadena de texto que contiene marcadores de posición, y valor1,
valor2, etc., son los valores que se insertarán en lugar de los marcadores de posición.
Los marcadores de posición se indican mediante llaves {}.
Lo entenderás mejor estudiando el siguiente código:
nombre = input("Introduce tu nombre: ")
edad = int(input("Introduce tu edad: "))
cadena_original = "Hola {}, tienes {} años."
cadena_formateada = cadena_original.format(nombre, edad)
print(cadena_formateada)
La tercera línea crea el objeto String "Hola {}, tienes {} años.".
En la cuarta línea ejecutamos el método format sobre el objeto tipo String y utilizamos como
parámetros los valores almacenados en las variables nombre y edad.
La función format genera una nueva cadena de texto en la que los marcadores de posición {}
son sustituidos por cada uno de los parámetros.
El resultado será:
- 81 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 82 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
class VElectricos():
def __init__(self):
[Link]=100
def cargarEnergía(self):
[Link]=True
class Moto(Vehiculos):
hcaballito=""
def caballito(self):
[Link]="Voy haciendo el caballito"
def estado(self):
print("Marca:", [Link],"\nModelo:", [Link],"\nEn Marcha:",
[Link],"\nAcelerando:", [Link],"\nFrenando:", [Link],"\n",
[Link])
class BicicletaElectrica(Vehiculos,VElectricos):
pass
- 83 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 84 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 85 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 86 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Otras recomendaciones
Escribir un espacio antes y después de los operadores: asignación (=), asignación aumentada (+=, -
= etc.), comparaciones (==, <, >, !=, <>, <=, >=, in, not in, is, isnot), booleanos (and, or, not).
Si se utilizan operadores con distintas prioridades, se aconseja utilizar espacios en los operadores
de menor prioridad. Nunca escriba más de un espacio y escriba los mismos espacios antes y
después de cada operador.
Sí:
i=i+1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
No:
i=i+1
submitted +=1
x=x*2-1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
Se recomienda que el nombre del programa no contenga espacios sino guiones o subrayados. Por
ejemplo, aritmeticas_1.py.
Comentarios en los programas
Es importante añadir comentarios a los programas para que sean más comprensibles para los
humanos (el ordenador ignora completamente el contenido de los comentarios). En Python un
comentario empieza por el carácter almohadilla (#) y acaba al final de la línea. No es necesario
comentar todas las líneas, sino sólo aquellas que lo necesiten. Por ejemplo:
ep = 166.386 # Factor de conversión de euros a pesetas
- 87 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
25. Funciones
Listado de las funciones más habituales.
Función Descripción
str() Transforma un número en cadena de caracteres.
int() Transforma una cadena de caracteres en un número entero.
float() Transforma una cadena de caracteres en un número decimal.
round(a,b) Redondea el número a con b decimales.
chr(num) Devuelve el carácter correspondiente al valor “num” en código ASCII.
ord(‘x’) Devuelve el código ASCII del carácter ‘x’.
# Separador de miles:
print(format(numero, ','))
print(format(numero, '0,.1f'))
# Notación científica:
print(format(numero, 'e'))
print(format(numero, '0.2E'))
- 88 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
26. Métodos
Listado de métodos de interés.
Función Descripción
[Link]() Devuelve la cadena de caracteres o variable en letras minúsculas.
[Link]() Devuelve la cadena de caracteres o variable en letras mayúsculas.
- 89 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
Tabla de contenido
1. Introducción................................................................................................................................... 1
2. Concepto de subrutina................................................................................................................... 2
3. Funciones....................................................................................................................................... 3
3.1 Definición de una función.........................................................................................................3
3.2 Utilizando variables en funciones.............................................................................................4
3.2.1 Conflictos de nombres de variables..............................................................................4
3.2.2 Variables locales............................................................................................................4
3.2.3 Variables libres globales o no locales............................................................................6
3.2.4 Variables declaradas global o nonlocal.........................................................................7
4. Funciones: Argumentos y devolución de valores...........................................................................9
4.1 Función con argumentos.......................................................................................................... 9
4.2 Utilizando return. Devolviendo valores..................................................................................10
4.3 Número variable de argumentos............................................................................................10
4.4 Funciones que devuelven más de un valor.............................................................................11
4.5 Paso por valor o paso por referencia......................................................................................11
5. Módulos, bibliotecas.................................................................................................................... 12
5.1 Importando directamente las funciones.................................................................................13
5.2 Más sobre los módulos...........................................................................................................14
5.3 El camino de búsqueda de los módulos - Organización..........................................................14
5.3.1 Uso de paquetes......................................................................................................... 14
5.3.2 Paquetes distribuibles.................................................................................................16
6. Biblioteca estándar – Módulo random.........................................................................................21
6.1 Módulo [Link].................................................................................................................21
6.2 Información sobre módulos de la biblioteca estándar...........................................................23
7. Excepciones y su gestión.............................................................................................................. 23
7.1 Gestión del error división por cero.........................................................................................23
7.2 Gestión del error tipo de dato – While, break........................................................................25
7.3 Clausula finally........................................................................................................................ 26
7.4 Lanzar excepciones. Instrucción raise.....................................................................................27
8. Diccionarios.................................................................................................................................. 30
8.1 Crear un diccionario................................................................................................................30
8.2 Función get()...........................................................................................................................31
8.3 Acceder a todos los elementos de un diccionario..................................................................32
8.4 Funciones y métodos a utilizar con diccionarios.....................................................................34
8.5 Usos de diccionarios............................................................................................................... 34
9. Módulo [Link]() – Borrar pantalla de consola........................................................................35
10. Crear archivos ejecutables..........................................................................................................37
11. Manejo de archivos con Python................................................................................................. 39
11.1 Abrir en modo lectura y cerrar archivos...............................................................................39
11.1.1 Sublime y posición relativa de los ficheros................................................................40
11.2 Leer un archivo..................................................................................................................... 41
11.2.1 Método read(). Leer un archivo como cadena de caracteres....................................41
11.2.2 Método readlines(). Leer un fichero como lista........................................................41
- 90 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 91 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
26. Métodos..................................................................................................................................... 89
27. Materiales referencia................................................................................................................. 93
- 92 -
TIC 2º BTO IES Grande Covián
Informática II Zaragoza
- 93 -