Introducción a Python

Este texto es un conjunto de información general sobre Python, se pretende que sea una referencia rápida para prácticas dejadas en clase. En ningún momento llega a sustituir la documentación oficial ni los libros sugeridos en la bibliografía del curso.

¿Qué es Python?

Es un lenguaje de programación fuertemente tipado [1] y de tipado dinámico(las variables pueden cambiar de tipo en asignaciones durante la ejecución del programa).

Es un lenguaje “Orientado a objetos” en el sentido en que todo es tratado como uno, incluso las funciones aunque Python no impone la orientación a objetos como el paradigma principal.

Interprete

Para poder ejecutar nuestros archivo de python necesitamos de un interprete. Python nos ofrece uno que funciona de 2 maneras. Pasando parámetros y modo interctivo.

Pasando parámetros

De esta forma invocamos al interprete pasándole como parámetro nuestro arhivo a ejecutar

pyhton mi_programa.py
python3 mi_programa.py

La diferencia es que en nuestro sistema podemos tener asociado python a la versión 2 o 3 por lo que puede hacer falta especificar la versión del interprete con la cual queremos ejecutar nuestro código

Modo interactivo

El módo interactivo nos permite escribir código y ejecutarlo al momento sin necesidad de escribir en un archivo. Es muy útil cuando se necesita probar código.

pyhton
python3

La diferencia es que en nuestro sistema podemos tener asociado python a la versión 2 o 3 por lo que puede hacer falta especificar la versión del interprete con la cual queremos ejecutar nuestro código

Hola Mundo

Aquí el ejemplo clásico del programa Hola Mundo!. No sé necesita más que una sola línea de código

print("Hola Mundo!")
Hola Mundo!

¿Dónde está el main?

Los programas escritos en Python no se empiezan a ejecutar desde álgún metodo main, en cambio se empiezan a ejecutar desde la primera línea del archivo.

Aunque no exista un método main, para programas algo más complejos, se recomienda declarar uno.

def main():
  codigo...

main()

Tipos de Datos

Cadenas

variable = "Esta es una 'cadena' en Python"
variable = 'Esta es una "cadena" en Python'
variable = """Esta es una cadena de
varias
líneas"""
variable = str(234)

Números Enteros

variable = 234
variable = int(234.0)
variable = int("234")

Números Flotantes

variable = 234.0
variable = float(234)
variable = float("234.0")

Números Complejos

variable = 234j
variable = 234 + 456j
variable = complex(234,456)

Booleanos

variable = True
variable = False

Entrada y Salida

Entrada

variable = input()

Salida

print(objeto_a_imprimir)

Control de Flujo

For

for elemento in objeto_iterable:
  codigo...
else:
  codigo...

Si queremos iterar y no necesitamos de la variable podemos usar un guión bajo en la seccion de la variable del for

for _ in iterable:
  codigo...

While

while condicion:
  codigo...
else:
  codigo...

If

if condicion1:
  codigo...
elif condicion2:
  codigo...
else:
  codigo...

Selector

"cadena"[3] # 4to caracter
'e'
"cadena"[-1] # Últmio caracter
'a'
"cadena"[2:4] # Subcadena desde el 2do hasta el 4to
'de'
"cadena"[:3] # Todos los caracteres hasta el 3ro
'cad'
"cadena"[3:] # Todos los caracteres apartir del 4to
'ena'
"cadena"[::2] # Todos los caracteres impares
'cdn'

Módulos

Un módulo es un archivo que es importado usando alguna de las formas siguientes:

from modulo import *
from modulo import sqrt
import modulo

Paquete

Un paquete es una colección de módulos en directorios en cierta jerarquía.

from my_paquete.timing.danger.internets import modulo

Estructuras de Datos

Listas

lista = list()  # Constructor de lista vacía
lista = []  # Constructor de lista vacía
lista = [1, 2, 3, "a", "b", "c"]  # Constructor de lista con elementos

Se debe notar que las listas pueden tener elementos de varios tipos

Clases

class MiClase:
  def __init__(self, parametro):
    self.variable = parametro

  def mi_metodo(self):
    print(self.variable)

Métodos

def metodo(self, parametro1, parametro2=default):
  codigo...

Cuando se manda a llamar a un método se necesita pasar el objeto mismo. Por eso es necesario usar el parámetro self.

Herencia

Python2

class A(object):
  def __init__(self, variable):
    self.var1 = 1
    self.var2 = variable

class B(A):
  def __init__(self, param1, param2):
    super(A, self).__init__(param1)
    self.var3 = param2

Python3

class A:
  def __init__(self, variable):
    self.var1 = 1
    self.var2 = variable

class B(A):
  def __init__(self, param1, param2):
    super().__init__(param1)
    self.var3 = param2

Excepciones

Try

try:  # Código a ser monitoreado
  pass
except Exception as ex:  # Cacha la excepción y la da un nombre
  raise ex
else:  # Se ejecuta sólo si no se lanza una excepción en el bloque *try*
  pass
finally:  # Se ejecuta haya o no haya una excepción
  pass

Raise

Sirve para lanzar una excepción

raise Exception("Algo salió mal :(")

Preguntas frecuentes y cosas Interesantes

Retorno de las funciones

Las funciones siempre regresan algo. Si no se especifica el valor de retorno la función regresa el objeto None

Errores comunes

No se modifican las variables globales

Manera incorrecta de hacerlo

variable = 56

def mi_funcion():
  variable = 0

mi_funcion()
print(variable)
56

Se debe usar la palabra reservada global para modificar variables globales

variable = 56

def mi_funcion():
  global variable
  variable = 0

mi_funcion()
print(variable)
0

Argumentos mutables por defecto

Lo que escribiste

def encola(elemento, lista=[]):
  lista.append(elemento)
  return lista

Lo que esperas

mi_lista = encola(12)
print(mi_lista)
[12]

mi_otra_lista = encola(42)
print(mi_otra_lista)
[42]

Lo que pasó

mi_lista = encola(12)
print(mi_lista)
[12]

mi_otra_lista = encola(42)
print(mi_otra_lista)
[12, 42]

Solución

def encola(elemento, lista=None):
  if lista is None:
    lista = list()
  lista.append(elemento)
  return lista

Las variables de clase no se modifican

Lo que escribiste

class MiClase:
  var = 100

a = MiClase()
b = MiClase()

Lo que esperaste

a.var = 20
print(b.var)
20

Lo que pasó

a.var = 20
print(b.var)
100

Solución

MiClase.var = 20
print(b.var)
20

Pendientes de clase

¿Qué ordenamiento usa Python?

Timsort [2], derivado de merge sort e insertion sort

Operador Ternario

a if condicion else b

Interprete necesario para usar PyQt

PyQt funciona tanto con Python2 como Python3 [3]

Práctica 1

  • Lista los comandos de linux que puedan realizar las siguientes acciones:
    • Crear un archivo
    • item Borrar un archivo
    • item Crear un directorio
    • item Borrar un directorio
    • item Listar archivos y directorios
    • item Cambiar de directorio
    • item Imprimir el directorio actual
  • Lista al menos 5 funciones que Python ofrece por defecto y escribe una pequeña descripción de lo que hacen.
  • Hacer un programa que reciba números de uno por uno de la línea de comandos y cumpla con lo siguiente:
    • Si el número actual es el primer número que se lee entonces se guarda
    • Si el número actual es menor que los recibidos anteriormente se debe ignorar e imprimir los números anteriores que sí fueron agregados. Es decir, sólo se aceptan números en orden no decreciente.
    • Si se recibe la letra m se debe calcular la media aritmética de los números que sí fueron agregados y se debe de imprimir
    • Si se recibe una cadena vacía el programa debe terminar
[1]QtGui.Application.exec_
[2]Wikipedia
[3]PyQt