Python 3

Logo JS

Última edición el día 2020-12-14 a las 20:52.

Esta es la documentación que he recopilado para trabajar con Python 3, el lenguaje de propósito general que me gusta utilizar en mis proyectos y en mi trabajo del día a dia.

Elementos básicos del lenguaje

Comentarios

Los comentarios se pueden realizar de dos tipos:

  • Comentarios de una sola línea:

# Comentario de una sola linea
  • Comentarios multilínea:

'''
Esto es un comentario multilínea
Aquí podemos establecer mas de
una linea
'''

Estructura en Python

La estructura de Python se presenta de un modo ligeramente distinto al de otros lenguajes de programación:

# Las variables se declaran sin usar palabra reservada como var:
variable = "contenido"   # python no utiliza ; para finalizar línea.

# En las estructuras de control, funciones y clases de python sustituye las llaves por ``:``, y la identación del contenido es obligatoria:
for n in numeros:
    print(numeros[n])

Extensión

La extensión utilizada por los archivos Python es py

Ejecución

Para ejecutar un script de python 3 lo hacemos del siguiente modo: python3 script.py

Preparación del script

Cuando creamos un nuevo script python tenemos que tener en cuenta un par de líneas, la primera es el interprete que es python y la segunda la codificación que utilizamos en España utf8.

Ejemplo:

#!/usr/bin/env python3
#_*_ coding: utf8 _*_

Repositorio de paquetes

Python además de contar con una biblioteca estandar también tiene un repositorio conocido como PyPI al cual podemos acceder en: pypi.org.

Palabras reservadas de Python 3

En Python existen las siguientes palabras reservadas:

  • and

  • as

  • assert

  • async

  • await

  • 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

  • while

  • with

  • yield

Variables y tipos de datos

Variables

Las variables se definene de forma dinámica, lo que significa que no se especifica su tipo de antemano y puede cambiar su valor en todo momento.

Ejemplo:

nombre = "Antonio"

Constantes

Las constantes no existen como tales en Python, pero si se utiliza la convención de declararlas en mayúsculas para recordar que es un dato que no debería ser mutable.

Ejemplo:

DNI = "23435324Z"

Tipos de datos primitivos

Los tipos de datos mas comunes son los siguientes:

Tipo de dato

Denominación

Ejemplo

str

Cadena de texto

“cadena”, «cadena»

int

Número Entero

20, 5, -3, 0

float

Número con decimales

20.53, 12.5, -18.353

bool

Verdadero o falso

True, False

list

Matriz de datos

[1, 5, «Hola», True]

tuple

Matriz de datos inmutable

(«hola», 15, False)

dict

Objeto con orden de tipo clave:valor

{“nombre”:”Pedro”, edad: 45}

Ejemplos:

cadena = "Dia de paga"
otraCadena = 'Cadena de comillas simples es lo mismo'
entero = 27
decimal = 22.83
booleano = True
lista = [1, 5, 13, "Papiro"]
tupla = (3, "guay", True)
diccionario = {'profesion': 'programador', 'hobbie':'DIY'}

Entrada y Salida de datos

En Python 3 la entrada y salida de datos se presenta de la siguiente forma:

  • Entrada de datos:

nombre = input('Escribe tu nombre: ')
  • Salida de datos:

# Cadena formateada:
print("Te llamas {}".format(nombre))
# Cadena concatenada:
print("Te llamas " + nombre)

Como vemos en el ejemplo anterior tenemos dos formas de imprimir, concatenando con + cada una de las cadenas y variables o bien utilizar el formato que funciona introduciendo dentro de la cadena unas llaves {} y luego justo despúes de la cadena la unimos con la función .format() en la cual iremos añadiendo cada una de las variables presentes:

print("Te llamas {}, tienes {} años y vives en {}.".format(nombre,edad,ciudad))

Operadores

Operadores Aritméticos

Los operadores aritméticos que se presentan en python son los mismos que en la mayoría de lenguajes, +, -, *, /, %

Estos podemos utilizarlos del siguiente modo:

# asignación:
suma = 2 + 2

# salida de datos:
print(3 - 2)

# si utilizamos + en cadenas las concatenamos:
cadenas = "cadena uno" + " y " + " cadena dos"

Operadores Relacionales

Los operadores relacionales en python son los mismos que en la mayoría de lenguajes de programación:

Operador

símbolo

Mayor que

>

Menor que

<

Igual que

==

Mayor igual que

>=

Menor igual que

<=

Cuando hablamos del uso de un solo = nos referimos a la asignación de un valor en una variable.

Como en muchos lenguajes, si imprimimos por consola la relación entre un valor y otro el resultado será True o False:

# Si decimos que 3 es mayor que 2
print(3 > 2)
# el resultado que sale por consola es True.

Operadores Lógicos

En Python se utilizan los mismos operadores lógicos que en la mayoría de lenguajes de programación, sin embargo presentan un aspecto diferente:

Operador

símbolo

condición

Y (and)

and

La condición se cumple si todos son verdaderos

O (or)

or

La condición se cumple si al menos uno es verdadero

NO (not)

!

La condición se cumple si es diferente a lo que se compara

Ejemplos:

# Resultado False:
print(5 > 7 and 3 < 6)
# Resultado True:
print(5 > 7 or 3 < 6)
# Resultado True
print(6 != 3)

Estructuras de control

En python disponemos de estructuras de control como if, for y while.

Condicional if

Las condiciones sencillas en python funcionan del siguiente modo:

saludo = input("Di hola: ")

if saludo == 'Hola':
    print('Hola a tí también')

También tenemos condiciones con una salida alternativa si no se cumple esta:

nacimiento = input('Dime tu nacimiento: ')

if nacimiento <= 2002:
    print('Eres mayor de edad')
else:
    print('Eres menor de edad')

Condicional if-elif

Las condiciones compuestas nos ofrecen varios caminos posibles:

edad = input('Dime tu edad: '):

if edad >= 18:
    print('Eres mayor de edad')
elif edad < 18:
    print('Eres menor de edad')
elif edad >= 65:
    print('Ya eres un anciano')
else:
    print('No es una edad correcta')

Bucle for

El bucle for en python se presenta de un modo muy similar al foreach de otros lenguajes:

  • Uso con rango definido:

mensaje = input("Escribe tu mensaje: ")
numero = int(input("¿cuántas veces lo repito? "))

for n in range(0, numero):
    print("{} : {}".format(n,mensaje))

Bucle while

El bucle While es similar a otros lenguajes, pero no se presenta la figura del bucle do-while.

Ejemplo:

numero = 10
juego = True

while juego == True:
    adivina = int(input('Adivinia el número >> '))
    print('Fallaste!')

    if adivina == numero:
        print('Acertaste!')
        juego = False

Ejemplo con bucle infinito:

numero = 10
# al añadir True hacemos un bucle infinito:
while True:
    adivina = int(input('Adivinia el número >> '))

    if adivina == numero:
        print('Acertaste!')
        // Con exit() finalizamos el programa
        exit()

    print('Fallaste!')

Estructuras de datos

Listas

Las listas son un tipo de dato mutable que agrupa un conjuto de valores de distintos tipos:

lista = [1, 15, -12, 3.81, "cadena", True]
  • Recorrer valores de una lista e imprimirlos con for:

lista = ["uno", "dos", "tres", "cuatro"]

for l in lista:
    print(l)
  • Ver cuantos elementos hay en una lista con len():

print(len(lista))
  • Imprime un elemento de la lista por su posición:

print(lista[2])
  • Muestra un rango de elementos de la lista:

print(lista[0:2])
  • Muestra el último elemento de la lista:

print(lista[len(lista)-1])
  • Borra el último elemento de la lista con pop():

lista.pop()
print(lista)
  • Borrar un elemento por su posición con del:

del lista[2]
print(lista)
  • Añadir un elemento a la lista con append():

lista.append("nuevo texto")
print lista
  • Convertir lista a cadena de texto con join():

lista = ['P','e','p','e']
lista = ''.join(lista)
print(lista)
  • Crear una lista a partir de un rango o una tupla con list():

numeros = range(0,30)
lista = list(numeros)
print(lista)
  • Ordenar elementos de listas por orden numérico o alfabético:

lista = ["gato", "nocilla", "avión", "leche"]

# Orden normal:
print(sorted(lista))

# Orden inverso:
print(sorted(lista, reverse=True))
  • Verificar si se encuentra un elemento en la lista:

lista = ["gato", "nocilla", "avión", "leche"]

'gato' in lista // esto devuelve true o false dependiendo de si la cadena existe o no en la lista.
'perro' not in lista // igual que antes pero preguntando si no existe

Tuplas

Las tuplas son similiares a las listas pero con la diferencia de que estas son inmutables.

Ejemplo de lista:

tupla = (1, 'palabra', True, 3.53)
  • Recorrer valores de una tupla e imprimirlos:

tupla = (1, 'palabra', True, 3.53)

for t in tupla:
    print(t)
  • Ver cuantos elementos hay en una tupla con len():

print(len(tupla))
  • Imprime un elemento de la tupla por su posición:

print(tupla[2])
  • Muestra un rango de elementos de la tupla:

print(tupla[0:2])
  • Muestra el último elemento de la tupla:

print(tupla[len(tupla)-1])
  • Convertir tupla a cadena de texto con join():

tupla = ('P','e','p','e')
tupla = ''.join(tupla)
print(tupla)
  • Crear una tupla a partir de un rango o lista con tuple():

lista = [10, "hola", 3.43]
tupla = tuple(lista)
print(tupla)
  • Ordenar elementos de tuplas por orden numérico o alfabético:

tupla = (9, 2, 3, 5, 1)

# Orden normal:
print(sorted(tupla))

# Orden inverso:
print(sorted(tupla, reverse=True))

Diccionarios

Los diccionarios en python se asemejan a los objetos literales en javascript u otros lenguajes de programación. Se construye por pares de datos que son clave y valor {'nombre':'Antonio'} y pueden anidar todo tipo de datos e incluso más diccionarios.

Ejemplo de uso:

diccionario = {'nombre':'Pepe', 'edad': 37, 'profesion':'agricultor'}
print(diccionario)
  • Imprimir un valor del diccionario:

print(diccionario['nombre'])
  • Convertir diccionario a tupla con items():

tupla = diccionario.items()
print(tupla)
  • Copiar un diccionario con copy():

otro = diccionario.copy()
print(otro)
  • Recuperar solo las claves del diccionario con keys():

claves = diccionario.keys()
print(claves)
  • Recuperar solo los valores del diccionario con values():

valores = diccionario.values()
print(valores)
  • Recorrer e imprimir todos los elementos del diccionario:

for d in diccionario:
    print(d + " Su valor es: " + diccionario[d])

Funciones Internas

Como en la mayoría de lenguajes de programación, en Python existen funciones predefinidas.

Funciones de cadenas

Aquí tenemos las funciones mas utilizadas para tratamiento de cadenas de texto:

  • Para saber la longitud de una cadena con len():

nombre = "Alba María"
print(len(nombre))
  • Convertir valor numérico a cadena con str():

numero = 27
numero = str(numero)
print(numero)
  • Convertir una cadena en una lista split():

lista = nombre.split()
print(lista)
  • Reemplazar una cadena por otra con replace():

frase = "Soy la persona mas afortunada"
print(frase.replace('Soy', 'Era'))
  • Convertir a mayúsculas la cadena con upper():

frase = "Hace buen día"
print(frase.upper())
  • Convertir a minúsculas la cadena con lower():

frase = "MI nombre Es Alfredo"
frase = frase.lower()
print(frase)

Funciones numéricas

Estas son las funciones numéricas mas comunes en python:

  • Convertir un valor a entero con int():

numero = int(input("introduce un número: "))
print(numero)
  • Convertir un valor a decimal con float():

numero = float(input("introduce un número: "))
print(numero)
  • Redondear un valor decimal con round():

numero = 13.583
print(round(numero))
  • Crear un rango de números con range():

rango = range(1,11)
print(list(rango))
  • Mostrar el valor mayor de un rango con max():

print(max(rango))
  • Mostrar el valor mínimo de un rango con min():

print(min(rango))
  • Sumar todos los valores de un rango con sum():

print(sum(rango))

Otras funciones comunes

Tenemos una serie de funciones de uso común en python:

  • Averiguar que tipo de dato contiene una variable con type():

variable = "cadena"
print(type(variable))

Funciones

Las funciones en Python se declaran con def en lugar de function como en muchos otros lenguajes:

# Creación:
def saludar():
    print('Hola mundo')

# Llamada:
saludar()
  • Recibir parametros en una función:

# Añadimos un nombre:
nombre = input('¿Cómo te llamas?: )

# Creamos la función que recibirá un valor que imprimimos:
saludar(persona):
    print("Hola {}".format(persona))

# y llamamos a la función pasándole la variable nombre:
saludar(nombre)
  • Recibir parametros infinitos añadiendo * a un parametro:

    def miFuncion(*unNombre):
    for persona in unNombre:
        print("Se llama {}".format(persona))
    
    miFuncion("Pepe", "Antonio", "Alfredo")
    

Clases

Las clases en python tienen una estructura similar al de otros lenguajes, la mayor diferencia reside en el encapsulamiento lo que normalmente utilizamos this pasa a ser self y tenemos que pasarlo a los métodos que vayan a utilizar atributos de la clase (osea practicamente siempre):

class Persona():
    # atributos de clase
    nombre = ""
    genero = ""
    peso = 0
    estatura = 0

    # Constructor
    def __init__(self):
        self.nombre = "Alfredo"
        self.genero = "Masculino"
        self.peso = 82
        self.estatura = 174

    # Métodos:
    def datos(self):
        print("Su nombre es {}, su género {}, pesa {} kilos y mide {}.".format(self.nombre, self.genero, self.peso, self.estatura))


# creacion del objeto:
antonio = Persona()
# Ejecutando metodo del objeto:
antonio.datos()
  • Implementación de clases que reciben parámetros:

class Persona():
        nombre = ""
        genero = ""
        peso = 0
        estatura = 0
        # Pasamos los parámetros por el constructor y los asignamos a los atributos:
        def __init__(self, para_nombre, para_genero, para_peso, para_estatura):
            self.nombre = para_nombre
            self.genero = para_genero
            self.peso = para_peso
            self.estatura = para_estatura

        def datos(self):
            print("Su nombre es {}, su género {}, pesa {} kilos y mide {}.".format(self.nombre, self.genero, self.peso, self.estatura))

# Al crear el objeto le enviamos los parámetros correspondientes:
antonio = Persona('Antonio', 'Masculino' ,79, 168)

antonio.datos()
  • Para heredar una clase en python lo hacemos como en la mayoría de lenguajes:

class Luis(Persona):
    def __init__(self):
        self.nombre = "Luis"
        self.genero = "Masculino"
        self.peso = 79
        self.estatura = 158

luis = Luis()
# y podemos acceder a los metodos del padre como a sus atributos:
luis.datos()
  • Acceso a atributos y metodos de otras clases:

class Animal:
    tipo = "perro"
    edad = 5

    def __init__(self):
        print("animal creado")

    def saberEdad(self):
        return self.edad



class Mascota:
    def __init__(self):
        # creamos el objeto y usamos self para poder manejarlo en toda la clase:
        self.animal = Animal()
        # y con un punto podemos recuperar atributos y metodos:
        print("Mi mascota es un {}".format(self.animal.tipo, self.animal.saberEdad()))

    def cumple(self, nuevaEdad):
        self.animal.edad = nuevaEdad
        print("Mi {} cumple {} años".format(self.animal.tipo, self.animal.saberEdad()))

mascota = Mascota()

mascota.cumple(6)

En este ejemplo se podía haber usado la herencia, pero lo he realizado de este modo para mostrar como se puede recuperar atributos y metodos de otro objeto cuando la herencia no encaja tanto.

Manejo de errores

El manejo de errores en Python se hace con try y except seguido opcionalmente por finally:

try:
    print(nombre)
except NameError:
    print('No has escrito un nombre')
finally KeyboardInterrupt:
    print('Fin de la ejecución')
  • Generar errores personalizados con raise:

try:
    raise IOError
except IOError:
    print('Ocurrió un error')
    exit()

Módulos Internos

Los módulos son archivos que proveen de ciertas funciones y clases para realizar determinadas tareas. En python los mas utilizados son:

  • Con os podemos navegar por el sistema de archivos:

import os

os.mkdir('prueba')
  • Podemos administrar archivos de forma mas detallada con shutil:

import shutil

shutil.copyfile('archivo.txt', 'nuevo.txt')

shutil.move('/carpeta/origen', '/carpeta/destino')
  • Si necesitamos trabajar con números aleatorios random es nuestro módulo:

import random

# Elegir un elemento al azar:
lista = ['galletas', 'tortitas', 'sandwich']
random.choice(lista)

# Dame un número al azar que puede ser decimal:
random.random()

# Y un número al azar basado en un rango de enteros:
random.randrange(15)
  • Y para trabajar con fechas y tiempo datetime:

    import datetime

    # fecha de hoy: fecha = datetime.date.today() # guardar una fecha: felizVeinte = datetime.date(2020, 1, 1)

    print(fecha) print(felizVeinte)

Módulos y paquetes

Podemos crear nuestros propios módulos en python para cortar partes del código específicas:

  • Lo primero es crear un nuevo archivo.py y guardar ahí por ejemplo una clase.

  • Luego creamos un segundo archivo que será el principal.py y para importarlo basta con escribir import archivo al comienzo del proyecto.

Si lo que queremos es guardar el módulo en una carpeta entonces estamos hablando de un Paquete:

  • Los paquetes son archivos.py que guardamos en una carpeta.

  • Dentro de esa carpeta creamos siempre un archivo llamado __init__.py para que el interprete lo considere un paquete.

  • Luego en el archivo principal.py lo importamos con la línea from carpeta import archivo

Y para poner un alias a un paquete o módulo de python ya sea estandar o personalizado utilizamos as:

from carpeta import archivo as traductor

Manejor de archivos

En python podemos crear y modificar archivos con la función open():

Cuando abrimos un archivo en python siempre asignamos un permiso:

Permiso

Nomenclatura

Escritura

w

Lectura

r

Actualización

a

  • En el caso de escritura:

# abrimos el archivo con escritura por ejemplo:
archivo = open('archivo.txt', 'w')

# Escribimos varias líneas:
archivo.write('Hola')
archivo.write('\n')
archivo.write('Lo de antes es un salto de línea')

# Y lo cerramos
archivo.close()
  • En caso de lectura:

archivo = open('archivo.txt', 'r')

# Y lo guardamos en una lista eliminando los saltos:
lista = archivo.read().split('\n')

for l in lista:
    print(l)

archivo.close()
  • En caso de actualización:

archivo = open('archivo.txt', 'a')

archivo.write('\n')
archivo.write('linea adicional')

archivo.close()