Python Tarea
Python Tarea
PYTHONICO
GUIA BASICA DE PYTHON
Universidad de El Salvador
Facultad de Ingenieria y Arquitectura
Sistemas Digitales
Nuestra guía “Pythonico" te enseñará lo básico del lenguaje con todo lujo de
detalles durante todo el curso.
02
Modulos
03
Módulo 1
Características básicas del lenguaje
Introduccion a Python
Caracteristicas del lenguaje
El intérprete de Python
04
¿Cómo saber qué versión de Python tengo instalada?
05
Tambien puedes probar ejecutar la instrucción print('¡Hola mundo!'):
No obstante, aunque esta forma de escribir código puede ser útil para aprender y
en casos muy puntuales, no es la habitual a la hora de escribir un programa o
script en Python.
Vamos a verlo con un ejemplo. Crea con un editor de texto un fichero llamado
suma.py con el siguiente contenido:
06
Operadores, expresiones y sentencias
en Python
Operador
Un operador es un carácter o conjunto de caracteres que actúa sobre una, dos o
más variables y/o literales para llevar a cabo una operación con un resultado
determinado.
Ejemplos de operadores comunes son los operadores aritméticos + (suma), -
(resta) o * (producto), aunque en Python existen otros operadores.
Expresión
Una expresión es una unidad de código que devuelve un valor y está formada por
una combinación de operandos (variables y literales) y operadores. Los siguientes
son ejemplos de expresiones (cada línea es una expresión diferente):
Sentencia
Por su parte, una sentencia o declaración es una instrucción que define una
acción. Una sentencia puede estar formada por una o varias expresiones, aunque
no siempre es así.
Ejemplos de sentencias son la asignación = o las instrucciones if, if ... else ..., for o
while entre otras.
07
Sentencias de más de una línea
Sin embargo, aquellas sentencias que son muy largas pueden ocupar más de una
línea.
Para dividir una sentencia en varias líneas se utiliza el carácter \. Por ejemplo:
Además de la separación explícita (la que se realiza con el carácter \), en Python la
continuación de línea es implícita siempre y cuando la expresión vaya dentro de
los caracteres (), [] y {}. Por ejemplo, podemos inicializar una lista del siguiente
modo:
08
Palabras reservadas de Python
Python tiene una serie de palabras clave reservadas, por tanto, no pueden usarse
como nombres de variables, funciones, etc.
Estas palabras clave se utilizan para definir la sintaxis y estructura del lenguaje
Python.
and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for,
from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return,
True, try, yield, while y with
Constantes en Python
A diferencia de otros lenguajes, en Python no existen las constantes.
Entendemos como constante una variable que una vez asignado un valor, este no
se puede modificar. Es decir, que a la variable no se le puede asignar ningún otro
valor una vez asignado el primero.
No obstante, sí que es cierto que el propio Python define una serie de valores
constantes en su propio namespace. Los más importantes son:
09
Variables
Variables en Python
Una variable es una forma de identificar, de forma sencilla, un dato que se
encuentra almacenado en la memoria del ordenador.
Ejemplo:
# Asigna a la variable <a> el valor 1
a=1
10
Si intentamos usar una variable que no ha sido definida/inicializada previamente,
el intérprete nos mostrará un error:
Un tipo de dato define una serie de características sobre esos datos y las variables
que los contienen como, por ejemplo, las operaciones que se pueden realizar con
ellos. En Python, los tipos de datos son los numéricos (enteros, reales y
complejos), los boolenaos (True, False) y las cadenas de caracteres.
Se dice que Python (el intérprete) infiere el tipo de dato al que pertenece una
variable en tiempo de ejecución, es decir, es cuando se ejecuta el programa,
cuando conoce su tipo de dato y qué operaciones pueden llevarse a cabo con él.
11
Modificar el valor de una variable en Python
Para modificar el valor de una variable en Python, basta con asignarle un nuevo
valor en cualquier momento y lugar después de la definición.
Ejemplo:
Literales
Un literal no es más que un dato en crudo que se puede asignar directamente a
una variable o formar parte de una expresión.
12
Asignar un valor a múltiples variables
Ahora vamos a descubrir cómo asignar un mismo valor a múltiples variables a la
vez. Si se tiene que definir varias variables con un mismo dato, puedes usar la
siguiente estructura:
13
Tipos de datos basicos
Los tipos de datos definen un conjunto de valores que tienen una serie de
características y propiedades determinadas. Establece qué valores puede tomar
una variable y qué operaciones se pueden realizar sobre la misma.
Los tipos de datos básicos de Python son los booleanos, los numéricos (enteros,
punto flotante y complejos) y las cadenas de caracteres.
Python también define otros tipos de datos, entre los que se encuentran:
Secuencias: Los tipos list, tuple y range
Mapas: El tipo dict
Conjuntos: El tipo set
Iteradores
Clases
Instancias
Excepciones
En fin, no tiene que haber preocupaciones con tanto tipo ni tanto concepto
nuevo. Tómatelo con calma que estás aprendiendo. Comencemos por lo fácil
revisando los tipos de datos básicos de Python.
14
Tipos numéricos
Python define tres tipos de datos numéricos básicos: enteros, números de punto
flotante y los números complejos.
Números enteros
El tipo de los números enteros es int. Este tipo de dato comprende el conjunto de
todos los números enteros en Python el conjunto está limitado realmente por la
capacidad de la memoria disponible.
Ejemplo:
Ejemplo:
15
Números complejos
El último tipo de dato numérico básico que tiene Python es el de los números
complejos o como su sintaxis es en python “complex” .
16
Tipo booleano
En Python la clase que representa los valores booleanos es bool. Esta clase solo
se puede instanciar con dos valores: True para representar verdadero y False para
representar falso.
Para crear un string, simplemente tienes que encerrar entre comillas simples '' o
dobles "" una secuencia de caracteres.
Ejemplos:
>>> print(hola)
Hola "Pythonico"
>>> print(hola_2)
Hola 'Pythonico'
>>> print(hola_3)
Hola 'Pythonico'
17
Otros tipos
Además de los tipos básicos, otros tipos fundamentales de Python son las
secuencias (list y tuple), los conjuntos (set) y los mapas (dict).
Todos ellos son tipos compuestos y se utilizan para agrupar juntos varios valores.
Las listas son secuencias mutables de valores.
Las tuplas secuencias inmutables de valores.
Los conjuntos se utilizan para representar conjuntos únicos de elementos, es
decir, en un conjunto no pueden existir dos objetos iguales.
Los diccionarios son tipos especiales de contenedores en los que se puede
acceder a sus elementos a partir de una clave única.
18
Conversión de tipos
Imagina que tienes una variable edad de tipo string cuyo valor es '25'. Se podría
decir que edad, aunque realmente es una cadena de caracteres, contiene un
número. Sin embargo, si intentas sumar 10 a edad, el intérprete te dará un error
porque edad es de tipo str y 10 un tipo numérico.
19
Operadores en Python
Operadores de concatenacion de cadenas de caracteres
Una de las operaciones más básicas cuando se trabaja con cadenas de caracteres es la
concatenación. Esto consiste en unir dos cadenas en una sola, siendo el resultado un
nuevo string.
La forma más simple de concatenar dos cadenas en Python es utilizando el operador
de concatenación +.
Ejemplo:
>>> hola = 'Hola'
>>> python = 'Pythonico'
>>> hola_python = hola + ' ' + python # concatenamos 3 strings
>>> print(hola_python)
Hola Pythonico
20
Operadores de comparación
Los operadores de comparación se utilizan, como su nombre indica, para comparar dos
o más valores. El resultado de estos operadores siempre es True o False.
21
Operadores aritméticos
Los operadores de comparación se utilizan, como su nombre indica, para comparar dos
o más valores. El resultado de estos operadores siempre es True o False.
22
Operadores de asignación
Además del operador de asignación “=”, existen otros operadores de asignación
compuestos que realizan una operación básica sobre la variable a la que se le asigna el
valor.
23
Operadores de pertenencia
Los operadores de pertenencia se utilizan para comprobar si un valor o variable se
encuentran en una secuencia (list, tuple, dict, set o str).
Ejemplos:
Operadores de identidad
Por último, los operadores de identidad se utilizan para comprobar si dos variables son,
o no, el mismo objeto.
24
Ejemplo:
Operadores de identidad
Al igual que ocurre en las matemáticas, los operadores en Python tienen un orden de
prioridad. Este orden es el siguiente, de menos prioritario a más prioritario: asignación;
operadores booleanos; operadores de comparación, identidad y pertenencia.
Este orden de prioridad se puede alterar con el uso de los parentesis ():
25
Módulo 2
Estructuras de control de flujo
Sentencia if
if - Sentencia basica
En Python, la sentencia if se utiliza para ejecutar un bloque de código si, y solo si,
se cumple una determinada condición. Por tanto, if es usado para la toma de
decisiones.
La estructura básica de esta sentencia if es la siguiente:
Aquí, condición puede ser un literal, el valor de una variable, el resultado de una
expresión o el valor devuelto por una función.
26
Otro ejemplo:
Sentencia if … else
Hay ocasiones en que la sentencia if básica no es suficiente y es necesario
ejecutar un conjunto de instrucciones o sentencias cuando la condición se evalúa
a False.
Para ello se utiliza la estructura if ... else... Esta es estructura es como sigue:
27
if … elif … else
También es posible que te encuentres situaciones en que una decisión dependa
de más de una condición.
En estos casos se usa una sentencia if compuesta, cuya estructura es como se
indica a continuación:
Ejemplo:
Sentencias if anidadas
Para terminar, añadir que en cualquiera de los bloques de sentencias anteriores se
puede volver a incluir una sentencia if, o if … else … o if … elif … else …
28
Sentencia While
La sentencia o bucle while en Python es una sentencia de control de flujo que se
utiliza para ejecutar un bloque de instrucciones de forma continuada mientras se
cumpla una condición determinada.
Su estructura es la siguiente:
Veamos un ejemplo:
El resultado del script anterior es el siguiente (la tabla de multiplicar del número 3):
29
Bucle While - Otro Ejemplo
A continuación mostramos un escenario típico de uso de bucle while:
Comprobar si existe un elemento en una secuencia.
Imagina que tienes la siguiente lista de valores [5, 1, 9, 2, 7, 4] y quieres saber
si el número 2 está contenido en dicha lista. La estructura típica de bucle
while para ello es como sigue:
Por tanto, el bucle finaliza bien cuando se haya encontrado el elemento, bien
cuando se haya evaluado el último elemento de la lista. Si se ha encontrado
el número 2, se muestra un mensaje indicando el índice en el que está. En
caso contrario, se muestra un mensaje indicando que el número 2 no se
encuentra en la lista.
30
Bucle While - Else
Al igual que sucede con el bucle for, podemos alterar el flujo de ejecución del
bucle while con las sentencias break y continue:
break se utiliza para finalizar y salir el bucle, por ejemplo, si se cumple alguna
condición.
Por su parte, continue salta al siguiente paso de la iteración, ignorando todas
las sentencias que le siguen y que forman parte del bucle.
Veamos el ejemplo de la sección anterior modificado, añadiendo la sentencia
break:
Por otro lado, al bucle while le podemos añadir la sentencia opcional else. El
bloque de código del else se ejecutará siempre y cuando la condición de la
sentencia while se evalúe a False y no se haya ejecutado una sentencia break.
31
Sentencia for
El bucle for se utiliza para recorrer los elementos de un objeto iterable (lista,
tupla, conjunto, diccionario, …) y ejecutar un bloque de código.
Su sintaxis es la siguiente:
Ejemplo:
32
Bucle for en diccionarios
3- Iterar a la vez sobre la clave y el valor de cada uno de los elementos del
diccionario
33
Bucle for - range
Para estos casos, Python pone a nuestra disposición la clase range. El
constructor de esta clase, range(max), devuelve un iterable cuyos valores
van desde 0 hasta max - 1.
El tipo de datos range se puede invocar con uno, dos e incluso tres
parámetros:
Por ejemplo, para mostrar por pantalla los números pares del 0 al 10
podríamos usar la función range del siguiente modo:
34
Bucle for ... else
35
Módulo 3
Tipos de datos complejos
Tipo list
Que es una lista? Cómo acceder a los elementos
de una lista en Python
Las listas en Python son un tipo contenedor,
Para acceder a un elemento de una lista se
compuesto, que se usan para almacenar
utilizan los índices. Un índice es un número
conjuntos de elementos relacionados del
entero que indica la posición de un elemento
mismo tipo o de tipos distintos.
en una lista. El primer elemento de una lista
siempre comienza en el índice 0.
Ejemplo una lista del numero 1 al 10:
Ejemplo:
36
Acceso a los elementos Acceso a un subconjunto de
usando un indice negativo elementos
En Python está permitido usar índices También es posible acceder a un subconjunto
negativos para acceder a los elementos de una de elementos de una lista utilizando rangos en
secuencia. En este caso, el índice -1 hace los índices. Esto es usando el operador [:]:
referencia al último elemento de la secuencia,
el -2 al penúltimo y así, sucesivamente:
37
Modificar elementos de una
lista
Es posible modificar un elemento de una lista
en Python con el operador de asignación =.
Para ello, lo único que necesitas conocer es el
índice del elemento que quieres modificar o el
rango de índices:
38
Longitud (len) de una lista
Como cualquier tipo secuencia, para conocer la longitud de una lista en Python se
hace uso de la función len(). Esta función devuelve el número de elementos de
una lista:
39
Tipo tupla
Qué es una tupla? Acceso a los elementos
usando un índice negativo
Es como una lista previamente enseñadas con
sus mismas caracteristicas con la diferencia Al igual que ocurre con las listas (y todos los
que una vez creadas no se pueden editar. tipos secuenciales), está permitido usar índices
negativos para acceder a los elementos de una
tupla
40
Tipo range
Clase range Ventajas de usar range
range es un tipo de dato que representa una La principal ventaja de usar range sobre list o
secuencia de números inmutable. tuple es que es un iterable que genera los
Para crear un objeto de tipo range, se elementos solo en el momento en que
pueden usar dos constructores : realmente los necesita. Esto implica que usa
range(fin): Crea una secuencia numérica una cantidad de memoria mínima.
que va desde 0 hasta fin - 1.
range(inicio, fin, [paso]): Crea una
secuencia numérica que va desde inicio
hasta fin - 1. Si además se indica el
parámetro paso, la secuencia genera los
números de paso en paso.
numerica
range en Python es un tipo que se utiliza para
representar una secuencia inmutable de
números
41
Tipo set
Qué es el tipo set? Cómo acceder a los
La principal característica de este tipo de
elementos de un conjunto
datos es que es una colección cuyos Dado que los conjuntos son colecciones
elementos no guardan ningún orden y que desordenadas, en ellos no se guarda la posición
además son únicos. en la que son insertados los elementos como
ocurre en los tipos list o tuple. Es por ello que
no se puede acceder a los elementos a través
de un índice.
Sin embargo, sí se puede acceder y/o recorrer
todos los elementos de un conjunto usando un
bucle for:
set vs Frozenset
La principal diferencia es que set es mutable,
por lo que después de ser creado, se pueden
añadir y/o eliminar elementos del conjunto. Por
su parte, frozenset es inmutable y su contenido
Añadir elementos a un
no puede ser modificado una vez que ha sido
inicializado. conjunto (set)
Para añadir un elemento a un conjunto se utiliza
el método add(). También existe el método
update(), que puede tomar como argumento
una lista, tupla, string, conjunto o cualquier
objeto de tipo iterable.
42
Eliminar un elemento de un
conjunto
La clase set ofrece cuatro métodos para eliminar elementos de un conjunto. Son: discard(),
remove(), pop() y clear().
pop() es un tanto peculiar. Este método devuelve un elemento aleatorio del conjunto y lo
elimina del mismo. Si el conjunto está vacío, lanza la excepción KeyError.
43
Tipo dict
¿Qué es el tipo dict? ¿Como acceder a los
Es como una lista previamente enseñadas con
elementos de un dict?
sus mismas caracteristicas con la diferencia Acceder a un elemento de un diccionario es
que una vez creadas no se pueden editar. una de las principales operaciones por las que
existe este tipo de dato. El acceso a un valor se
Otras características a resaltar de los realiza mediante indexación de la clave. Para
diccionarios: ello, simplemente encierra entre corchetes la
Es un tipo mutable, es decir, su contenido clave del elemento d[clave]. En caso de que la
se puede modificar después de haber sido clave no exista, se lanzará la excepción
creado. KeyError.
Es un tipo ordenado. Preserva el orden en
que se insertan los pares clave: valor
44
Añadir elementos a un dict
Para añadir un nuevo elemento a un diccionario existente, se usa el operador de
asignación =. A la izquierda del operador aparece el objeto diccionario con la
nueva clave entre corchetes [] y a la derecha el valor que se asocia a dicha clave.
En el apartado anterior svisto que para actualizar el valor asociado a una clave,
simplemente se asigna un nuevo valor a dicha clave del diccionario..
45
Eliminar un elemento de un dict
En Python existen diversos modos de eliminar un elemento de un diccionario. Son
los siguientes:
pop(clave [, valor por defecto]): Si la clave está en el diccionario, elimina el
elemento y devuelve su valor; si no, devuelve el valor por defecto. Si no se
proporciona el valor por defecto y la clave no está en el diccionario, se lanza la
excepción KeyError.
popitem(): Elimina el último par clave: valor del diccionario y lo devuelve. Si el
diccionario está vacío se lanza la excepción KeyError. (NOTA: En versiones
anteriores a Python 3.7, se elimina/devuelve un par aleatorio, no se garantiza
que sea el último).
del d[clave]: Elimina el par clave: valor. Si no existe la clave, se lanza la
excepción KeyError.
clear(): Borra todos los pares clave: valor del diccionario.
46
Tipo str
Qué es el tipo str? Cómo acceder a los
La clase str en Python se utiliza para caracteres de una cadena
representar texto, más conocido en el mundo
Como el resto de tipos secuencia, podemos
de la programación como string o cadena de
acceder a los caracteres de una cadena a
caracteres.
través de un índice numérico. Un índice es un
número entero que indica la posición de un
carácter en la cadena. Siempre el primer
carácter de la secuencia tiene como índice 0.
Cómo crear una cadena
Ejemplo:
Crear una cadena de texto en Python es muy >>> s = 'Hola Pythonico'
sencillo. Simplemente encierra una secuencia # Primer carácter de la cadena
de caracteres entre comillas simples '' o dobles >>> s[0]
"". 'H'
# Sexto carácter de la cadena
Ejemplo: >>> s[5]
'P'
>>> s = 'Hola Pythonico'
>>> s
'Hola Pythonico' for str – Recorrer los
>>> type(s)
<class 'str'> caracteres de una cadena
>>> s2 = "Me gusta Python" En Python es posible recorrer todos los
>>> s2 caracteres de una cadena usando la sentencia
'Me gusta Python' for. Para ello, lo más fácil es seguir la siguiente
>>> type(s2) plantilla:
<class 'str'>
47
Comprobar si un caracter esta
en una cadena
Para comprobar si un carácter está contenido en una cadena, utiliza el operador
de pertenencia in. Esto nos devolverá True si al menos hay una ocurrencia del
carácter en el string o False en caso contrario.
48
Módulo 4
Division de la logica de un programa
Funciones en Python
Qué son las funciones?
Una función es un grupo de instrucciones que constituyen unidades lógicas de un
programa y tienen un doble objetivo:
Dividir y organizar el código en partes más sencillas.
Encapsular el código que se repite a lo largo de un programa para ser
reutilizado.
49
Como definir una funcion
Para definir una función en Python se utiliza la palabra reservada def. A
continuación viene el nombre o identificador de la función que es el que se
utiliza para invocarla. Después del nombre hay que incluir los paréntesis y
una lista opcional de parámetros. Por último, la cabecera o definición de la
función termina con dos puntos.
50
La función multiplica_por_5() define un parámetro llamado numero que es el
que se utiliza para multiplicar por 5. El resultado del programa anterior sería
el siguiente:
Sentencia return
Anteriormente se indicaba que cuando acaba la última instrucción de una
función, el flujo del programa continúa por la instrucción que sigue a la
llamada de dicha función. Hay una excepción: usar la sentencia return.
return hace que termine la ejecución de la función cuando aparece y el
programa continúa por su flujo normal.
51
Ámbito y ciclo de vida de las variables
Los parámetros y variables definidos dentro de una función tienen un ámbito
local, local a la propia función. Por tanto, estos parámetros y variables no pueden
ser utilizados fuera de la función porque no serían reconocidos.
Ejemplo:
52
Espacios de nombres, módulos y
paquetes
Nombres y espacios de nombres
Un nombre o identificador es la forma que existe en Python de referenciar a un
objeto concreto. Equivaldría al concepto de variable.
53
Qué es un módulo?
Un módulo no es más que un fichero que contiene instrucciones y
definiciones (variables, funciones, clases). El fichero debe tener extensión
.py y su nombre se corresponde con el nombre del módulo.
>>> hola('Pythonico')
Hola Pythonico
54
Ejecutar módulos como scripts
Un módulo puede ser ejecutado como un script o como punto de entrada de
un programa cuando se pasa directamente como parámetro al intérprete de
Python:
Esto hace realmente interesante añadir al final del módulo las siguientes
líneas de código, que solo se ejecutarán en caso de que dicho módulo se
haya ejecutado como el principal:
if __name__ == '__main__':
hola('Pythonico')
55
Programación orientada a objetos
(POO)
Clases y objetos en Python
una clase es una entidad que define una serie de elementos que determinan un
estado (datos) y un comportamiento (operaciones sobre los datos que modifican
su estado).
Una clase engloba datos y funcionalidad. Cada vez que se define una clase en
Python, se crea a su vez un tipo nuevo (tipo int, float, str, list, tuple).
56
Constructor de una clase
Para crear un objeto de una clase determinada, es decir, instanciar una clase, se
usa el nombre de la clase y a continuación se añaden paréntesis.
Ejemplo:
obj = MiClase()
Una vez que sabemos qué es un objeto, tengo que decirte que la única operación
que pueden realizar los objetos es referenciar a sus atributos por medio del
operador .
Como habrás podido apreciar, un objeto tiene dos tipos de atributos: atributos de
datos y métodos.
Los atributos de datos definen el estado del objeto. En otros lenguajes son
conocidos simplemente como atributos o miembros.
Los métodos son las funciones definidas dentro de la clase.
57
Atributos de datos
A diferencia de otros lenguajes, los atributos de datos no necesitan ser declarados
previamente. Un objeto los crea del mismo modo en que se crean las variables en
Python, es decir, cuando les asigna un valor por primera vez.
Métodos
Los métodos son las funciones que se definen dentro de una clase y que, por
consiguiente, pueden ser referenciadas por los objetos de dicha clase. Sin
embargo, realmente los métodos son algo más.
Se ha observado que las funciones acelera() y frena() definen un parámetro self.
58
Atributos de clase y atributos de instancia
Una clase puede definir dos tipos diferentes de atributos de datos: atributos de
clase y atributos de instancia.
Los atributos de clase son atributos compartidos por todas las instancias de
esa clase.
Los atributos de instancia, por el contrario, son únicos para cada uno de los
objetos pertenecientes a dicha clase.
59
Herencia
En programación orientada a objetos, la herencia es la capacidad de reutilizar una
clase extendiendo su funcionalidad. Una clase que hereda de otra puede añadir
nuevos atributos, ocultarlos, añadir nuevos métodos o redefinirlos.
60
Las funciones isinstance() e issubclass()
La función incorporada type() devuelve el tipo o la clase a la que pertenece un
objeto. En nuestro caso, si ejecutamos type() pasando como argumento un objeto
de clase Coche o un objeto de clase CocheVolador obtendremos lo siguiente:
Sin embargo, Python incorpora otras dos funciones que pueden ser de utilidad
cuando se quiere conocer el tipo de una clase. Son: isinstance() e issubclass().
61
Herencia múltiple
Python es un lenguaje de programación que permite herencia múltiple. Esto
quiere decir que una clase puede heredar de más de una clase a la vez.
a
b
c
62
Encapsulación: atributos privados
Encapsulación (o encapsulamiento), en programación orientada a objetos, hace
referencia a la capacidad que tiene un objeto de ocultar su estado, de manera que
sus datos solo se puedan modificar por medio de las operaciones (métodos) que
ofrece.
Bien, por defecto, en Python, todos los atributos de una clase (atributos de datos
y métodos) son públicos. Esto quiere decir que desde un código que use la clase,
se puede acceder a todos los atributos y métodos de dicha clase.
Ejemplo:
63
Polimorfismo
Polimorfismo es la capacidad de una entidad de referenciar en tiempo de
ejecución a instancias de diferentes clases.
Aunque este concepto suene raro ahora mismo, se compredera con un ejemplo.
Imagina que tenemos las siguientes clases que representan animales:
64
Gracias Pythonico!
Nos vemos