Python

Nomenclatura básica

Hola mundo!

Escribamos nuestro primer programa de Python, “¡Hola, mundo!”. Es un programa simple que imprime Hello World! en el dispositivo de salida estándar (pantalla).

# imprimir "Hola Mundo!"
print("Hola Mundo!");
Hola Mundo!

Variables

Una variable es una ubicación con nombre utilizada para almacenar datos en la memoria. Aquí hay un ejemplo:

# crear e imprimir variables
a = 5
print("a =", 5)
a = "cinco"
print("a =", a)
a = 5
a = cinco

Operadores básico

Los operadores son símbolos especiales que realizan operaciones en operandos (variables y valores). Hablemos de operadores aritméticos y de asignación en esta parte.

# operaciones basicas

x = 14
y = 4

# suma
print('x + y =', x+y) # Output: x + y = 18

# resta
print('x - y =', x-y) # Output: x - y = 10

# multiplicacion
print('x * y =', x*y) # Output: x * y = 56

# division
print('x / y =', x/y) # Output: x / y = 3.5

# cuociente
print('x // y =', x//y) # Output: x // y = 3

# resto
print('x % y =', x%y) # Output: x % y = 2
x + y = 18
x - y = 10
x * y = 56
x / y = 3.5
x // y = 3
x % y = 2

Operadores de asignación

Los operadores de asignación se utilizan para asignar valores a las variables. Ya has visto el uso de operador = . Probemos algunos operadores de asignación más.

# operadores de asignacion

x = 5

# x += 5 ----> x = x + 5
x +=5
print(x) # Output: 10

# x /= 5 ----> x = x / 5
x /= 5
print(x) # Output: 2.0
10
2.0

Inputs por el usuario

En Python, puede usar la función input() para tomar la entrada del usuario. Por ejemplo:

# inputs por el usuario
inputString = input('Escriba una oracion:')
print('Su oracion es:', inputString)

Conversión de tipo

The process of converting the value of one data type (integer, string, float, etc.) to another is called type conversion. Python has two types of type conversion.

Implícita

# correcto
num_int = 123  # integer type
num_flo = 1.23 # float type

num_new = num_int + num_flo

print("Valor de num_new:",num_new)
print("tipo de datos de  num_new:",type(num_new))
Valor de num_new: 124.23
tipo de datos de  num_new: <class 'float'>
# incorrecto
num_int = 123     # int type
num_str = "456"   # str type

print(num_int+num_str)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-ffb727203912> in <module>
      3 num_str = "456"   # str type
      4 
----> 5 print(num_int+num_str)

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Explícito

num_int = 123  # int type
num_str = "456" # str type

# explicitly converted to int type
num_str = int(num_str) 

print(num_int+num_str)
579

Python tipos numéricos

Python admite enteros, números de coma flotante y números complejos. Se definen como int, float y clase compleja en Python. Además de eso, los booleanos: verdadero y falso son un subtipo de enteros.

print(type(5))

# Output: <class>
print(type(5.0))

# <class>
c = 5 + 3j
print(type(c))
<class 'int'>
<class 'float'>
<class 'complex'>

Manejo de excepciones de Python

Los errores que se producen en tiempo de ejecución se denominan excepciones. Ocurren, por ejemplo, cuando un archivo que intentamos abrir no existe FileNotFoundError, dividiendo un número por cero ZeroDivisionError, etc.

Si no se manejan las excepciones, se escupe un mensaje de error y nuestro programa se detiene repentinamente e inesperadamente.

En Python, las excepciones se pueden manejar usando la declaración try. Cuando se detectan excepciones, depende de usted qué operador realizar.

# importar modulo sys
import sys

lista_random = ['a', 0, 2]

for elemento in lista_random:
    try:
        print("La entrada es ", elemento)
        r = 1/int(elemento)
        break
    except:
        print("Oops! ocurrio un",sys.exc_info()[0])
        print("Siguiente entrada.")
        print()
        
print("El reciproco de",elemento,"es",r)
La entrada es  a
Oops! ocurrio un <class 'ValueError'>
Siguiente entrada.

La entrada es  0
Oops! ocurrio un <class 'ZeroDivisionError'>
Siguiente entrada.

La entrada es  2
El reciproco de 2 es 0.5

Algunas Excepciones Comunes

  • NameError: Esta excepción es levantada cuando el programa no puede encontrar un nombre local o global. El nombre que podría no ser encontrado está incluido en el mensaje de error.

  • TypeError: Esta excepción es levantada cuando una función se le pasa un objeto del tipo inapropiado como su argumento. Más detalles sobre el tipo incorrecto son proporcionados en el mensaje de error.

  • ValueError: Esta excepción ocurre cuando un argumento de función tiene el tipo correcto pero un valor inapropiado.

  • NotImplementedError: Esta excepción es levantada cuando se supone que un objeto apoye una operación pero no ha sido implementado aún. No deberías usar este error cuando la función dada no deba apoyar al tipo de argumento de entrada. En esas situaciones, levantar una excepción TypeError es más apropiado.

  • ZeroDivisionError: Esta excepción es levantada cuando proporcionas el segundo argumento para una operación de división o módulo como cero.

  • FileNotFoundError: Esta excepción es levantada cuando el archivo o diccionario que el programa solicitó no existe.

Aserciones en python

Las aserciones son expresiones booleanas que comprueban si las condiciones devuelven verdaderas o no. Si es cierto, el programa no hace nada y pasa a la siguiente línea de código. Sin embargo, si es falso, el programa se detiene y arroja un error.

Las aserciones son importantes al momento de realizar tests unitarios o asegurar que un resultado siempre sea el mismo.

https://cdn.programiz.com/sites/tutorial2program/files/Python%20Assert%20Statement.jpg
# definir funcion
def suma(x,y):
    return x+y
# ejemplo correcto
assert suma(1,1)==2, "ejemplo invalido"
# ejemplo incorrecto
assert suma(1,1)==3, "ejemplo invalido"
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-12-e3b3e004fc0f> in <module>
      1 # ejemplo incorrecto
----> 2 assert suma(1,1)==3, "ejemplo invalido"

AssertionError: ejemplo invalido

Estructura de datos

Listas

Se crea una lista colocando todos los elementos (elementos) dentro de un corchete [] separados por comas.

# lista vacia
lista = []
# lista de enteros
lista = [1, 2, 3]
# lista mixta
lista = [1, "hola", 3.4]

También, se pueden acceder a cada uno de sus eleentos

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

# acceder al primer elemento
print(numeros[0])


# acceder al cuarto elemento
print(numeros[1:3])
uno
['dos', 'tres']

Tuplas

La tupla es similar a una lista, excepto que no puede cambiar los elementos de una tupla una vez que está definida. Mientras que en una lista, los elementos se pueden modificar.

numeros = ("uno", "dos", "tres", "cuatro")
print(numeros)
('uno', 'dos', 'tres', 'cuatro')
numeros = ("uno", "dos", "tres", "cuatro")

print(numeros[1]) #Output: dos
print(numeros[3]) #Output: cuatro
print(numeros[-1]) # Output: cuatro
dos
cuatro
cuatro

Conjuntos

Un conjunto es una colección desordenada de elementos donde cada elemento es único (sin duplicados).

# conjunto de enteros
conjunto = {1, 2, 3}
print(conjunto)

# conjunto mixto
conjunto = {1.0, "hola", (1, 2, 3)}
print(conjunto)
{1, 2, 3}
{1.0, 'hola', (1, 2, 3)}
# conjunto de enteros
conjunto = {1, 2, 3}

conjunto.add(4)
print(conjunto) # Output: {1, 2, 3, 4}

conjunto.add(2)
print(conjunto) # Output: {1, 2, 3, 4}

conjunto.update([3, 4, 5])
print(conjunto) # Output: {1, 2, 3, 4, 5}

conjunto.remove(4)
print(conjunto) # Output: {1, 2, 3, 5}
{1, 2, 3, 4}
{1, 2, 3, 4}
{1, 2, 3, 4, 5}
{1, 2, 3, 5}

Diccionarios

Los diccionarios en Python son un tipo de estructuras de datos que permite guardar un conjunto no ordenado de pares clave-valor, siendo las claves únicas dentro de un mismo diccionario (es decir que no pueden existir dos elementos con una misma clave)

# diccionario vacio
dct = {}

# diccionario de enteros
dct = {1: 'apple', 2: 'ball'}

# diccionario dde llaves mixtas
dct = {'name': 'John', 1: [2, 4, 3]}
dct = {'nombre':'Jack', 'edad': 26, 'salario': 4534.2}
print(dct['edad']) # Output: 26
26
dct = {'nombre':'Jack', 'edad': 26}

# cambiar edad
dct['edad'] = 36 
print(dct) # Output: {'name': 'Jack', 'age': 36}

# adherir llave salario
dct['salario'] = 4342.4
print(dct) # Output: {'name': 'Jack', 'age': 36, 'salary': 4342.4}


# borrar llave edad
del dct['edad']
print(dct) # Output: {'name': 'Jack', 'salary': 4342.4}

# borrar diccionario
del dct
{'nombre': 'Jack', 'edad': 36}
{'nombre': 'Jack', 'edad': 36, 'salario': 4342.4}
{'nombre': 'Jack', 'salario': 4342.4}

Python range()

range() devuelve una secuencia inmutable de números entre el entero de inicio dado al entero de parada.

print(range(1, 10)) # Output: range(1, 10)
range(1, 10)

El resultado es iterable y puede convertirlo en list, tuple, set, etc. Por ejemplo:

numeros = range(1, 6)

print(list(numeros)) # Output: [1, 2, 3, 4, 5]
print(tuple(numeros)) # Output: (1, 2, 3, 4, 5)
print(set(numeros)) # Output: {1, 2, 3, 4, 5}

# Output: {1: 99, 2: 99, 3: 99, 4: 99, 5: 99} 
print(dict.fromkeys(numeros, 99))
[1, 2, 3, 4, 5]
(1, 2, 3, 4, 5)
{1, 2, 3, 4, 5}
{1: 99, 2: 99, 3: 99, 4: 99, 5: 99}

Hemos omitido el parámetro de step opcional para range() en los ejemplos anteriores. Cuando se omite, el paso predeterminado es 1. Probemos algunos ejemplos con el parámetro de paso.

numero1 = range(1, 6 , 1)
print(list(numero1)) # Output: [1, 2, 3, 4, 5]

numero2 = range(1, 6, 2)
print(list(numero2)) # Output: [1, 3, 5]

numero3 = range(5, 0, -1)
print(list(numero3)) # Output: [5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
[1, 3, 5]
[5, 4, 3, 2, 1]

Control de Flujo

if, elif,…, else

La instrucción if … else se usa si desea realizar una acción diferente (ejecutar un código diferente) en diferentes condiciones. Por ejemplo:

num = -1

if num > 0:
    print("numero positivo")
elif num == 0:
    print("cero")
else:
    print("numero negativo")
    
# Output: numero negativo
numero negativo

Puede haber cero o más partes elif, y la parte else es opcional. La mayoría de los lenguajes de programación usan {} para especificar el bloque de código. Python usa sangría.

Un bloque de código comienza con sangría y termina con la primera línea sin sangría. La cantidad de sangría depende de usted, pero debe ser consistente a lo largo de ese bloque. En general, se utilizan cuatro espacios en blanco para la sangría y se prefieren a las pestañas.

Probemos con otro ejemplo:

if False:
    print("Hola")
    print("mundo")
print("!!!")

# Output: !!!
!!!

While Loop

Al igual que la mayoría de los lenguajes de programación, el loop se usa para iterar sobre un bloque de código siempre que la expresión de prueba (condición) sea verdadera. Aquí hay un ejemplo para encontrar la suma de números naturales:

n = 100

# inicializar contador
sum = 0
i = 1

while i <= n:
    sum = sum + i
    i = i+1    # actualizar contador

print("La suma es", sum)

# Output: La suma es
La suma es 5050

For Loop

En Python, for loop se usa para iterar sobre una secuencia (lista, tupla, cadena) u otros objetos iterables. Iterar sobre una secuencia se llama transversal.

Aquí hay un ejemplo para encontrar la suma de todos los números almacenados en una lista.

numbers = [6, 5, 3, 8, 4, 2]

sum = 0

# iterar sobre la lista
for val in numbers:
    sum = sum+val

print("La suma es", sum) # Output: La suma es 28
La suma es 28

Break

La declaración break termina el ciclo que lo contiene. El control del programa fluye a la declaración inmediatamente después del cuerpo del bucle. Por ejemplo:

for val in "string":
    if val == "r":
        break
    print(val)

print("Fin")
s
t
Fin

Continue

La instrucción continue se usa para omitir el resto del código dentro de un bucle solo para la iteración actual. El bucle no termina pero continúa con la siguiente iteración. Por ejemplo:

for val in "string":
    if val == "r":
        continue
    print(val)

print("Fin")
s
t
i
n
g
Fin

Pass

Supongamos que tiene un bucle o una función que aún no está implementada, pero desea implementarla en el futuro. No pueden tener un cuerpo vacío. El intérprete se quejaría. Por lo tanto, utiliza la instrucción pass para construir un cuerpo que no hace nada.

sequence = {'p', 'a', 's', 's'}
for val in sequence:
    pass

Funciones

Una función es un grupo de declaraciones relacionadas que realizan una tarea específica. Utiliza la palabra clave def para crear funciones en Python.

def imprimir_lineas():
    print("linea 1")
    print("linea 2")
    
# llamar funcion
imprimir_lineas()
linea 1
linea 2

Una función puede aceptar argumentos.

def sumar(a, b):
    sum = a + b
    return sum

resultado = sumar(4, 5)
print(resultado)

# Output: 9
9

Recursion

Una función que se llama a sí misma se conoce como función recursiva y este proceso se llama recursividad. Cada función recursiva debe tener una condición base que detenga la recursividad o, de lo contrario, la función se llama a sí misma infinitamente.

# funcion factorial (recursivo)

def factorial(x):

    if x == 1:
        return 1
    else:
        return (x * factorial(x-1))

num = 6
print("El factorial de ", num, "es", factorial(num)) 

# Output: El factorial de  6 es 720
El factorial de  6 es 720

Lambda

En Python, puede definir funciones sin nombre. Estas funciones se denominan lambda o función anónima. Para crear una función lambda, se utiliza la palabra clave lambda.

cuadrado = lambda x: x ** 2
print(cuadrado(5))

# Output: 25
25

Módulos

Los módulos se refieren a un archivo que contiene declaraciones y definiciones de Python. Un archivo que contiene código Python, por ejemplo: modulo_01.py, se llama módulo y su nombre de módulo sería un ejemplo.

Permítanos crearlo y guardarlo como modulo_01.py.

%%writefile modulo_01.py
def sumar(a, b):
    return a + b
Overwriting modulo_01.py

Para usar este módulo, usamos la palabra clave import.

# importar modulo 
import modulo_01 
# acceder a las funciones del modulo
modulo_01.sumar(4, 5.5) 
9.5

También se pueden exportar módulos nativos de python.

import math

resultado = math.log2(5) # retorna logaritmo base 2
print(resultado) # Output: 2.321928094887362
2.321928094887362

Python tiene una tonelada de módulos estándar fácilmente disponibles para su uso. Por ejemplo:

from math import pi
print("El valor de pi es", pi)

# Output: The value of pi is 3.141592653589793
El valor de pi es 3.141592653589793

Programación orientada a objetos (OOP)

Todo en Python es un objeto que incluye enteros, flotantes, funciones, clases y Ninguno. No nos centremos en por qué todo en Python es un objeto. Para eso, visite esta página. Más bien, esta sección se enfoca en crear sus propias clases y objetos.

Clase y objetos

El objeto es simplemente una colección de datos (variables) y métodos (funciones) que actúan sobre los datos. Y, la clase es un modelo para el objeto.

Tan pronto como defina una clase, se crea un nuevo objeto de clase con el mismo nombre. Este objeto de clase nos permite acceder a los diferentes atributos, así como crear instancias de nuevos objetos de esa clase.

class Mi_clase:
    "Esta es mi clase"
    a = 10
    def func(self):
        print('hola')

# Output: 10
print(Mi_clase.a)

# Output: <function 0x0000000003079bf8="" at="" myclass.func="">
print(Mi_clase.func)

# Output: 'Esta es mi clase'
print(Mi_clase.__doc__)
10
<function Mi_clase.func at 0x7f4c0f256f70>
Esta es mi clase

Es posible que haya notado el parámetro self en la definición de la función dentro de la clase, pero llamamos al método simplemente como ob.func() sin ningún argumento. Aún funcionó.

Esto se debe a que, cada vez que un objeto llama a su método, el objeto mismo se pasa como primer argumento. Entonces, ob.func() se traduce en Mi_clase.func(ob).

Creando objetos

También puede crear objetos de la clase usted mismo.

class Mi_clase:
    "Esta es mi clase"
    a = 10
    def func(self):
        print('hola')

obj1 = Mi_clase()
print(obj1.a)        # Output: 10
 
obj2 = Mi_clase()
print(obj1.a + 5)    # Output: 15
10
15

Constructores de Python

En Python, un método con el nombre __init () __ es un constructor. Este método se llama automáticamente cuando se instancia un objeto.

class NumerosComplejos:
    def __init__(self,r = 0,i = 0):  # constructor
        self.real = r
        self.imag = i

    def obtener_datos(self):
        print("{0}+{1}j".format(self.real,self.imag))


c1 = NumerosComplejos(2,3) # crear el objeto NumerosComplejos
c1.obtener_datos() # Output: 2+3j

c2 = NumerosComplejos() # crear un nuevo objeto NumerosComplejos
c2.obtener_datos() # Output: 0+0j
2+3j
0+0j

Herencia de Python

La herencia se refiere a definir una nueva clase con poca o ninguna modificación a una clase existente. Tomemos un ejemplo:

class Mamifero:
    def caracteristicas(self):
        print ('Mamífero es un animal de sangre caliente')

Derivemos una nueva clase Perro de esta clase Mamifero.

class Mamifero:
    def caracteristicas_mamifero(self):
        print ('Mamífero es un animal de sangre caliente')

class Perro(Mamifero):
    def caracteristicas_perro(self):
        print('El perro ladra')

d = Perro()
d.caracteristicas_perro()
d.caracteristicas_mamifero()
El perro ladra
Mamífero es un animal de sangre caliente

Decoradores

Python tiene una característica interesante llamada decoradores para agregar funcionalidad a un código existente. Esto también se llama metaprogramación ya que una parte del programa intenta modificar otra parte del programa en tiempo de compilación.

def debug(f):
    def nueva_funcion(a, b):
        print("La funcion Sumar es llamada!!!")
        return f(a, b)
    return nueva_funcion


@debug # decorador
def Sumar(a, b):
    return a + b
print(Sumar(7, 5))
La funcion Sumar es llamada!!!
12