Python

De programador Java a Python Ninja

Javier Luna Molina

goo.gl/t0iGFR

Python como lenguaje

  • Creador: Guido van Rossum
  • Código abierto 
  • Primera versión publicada en 1991
  • Fan de los Monty Python
  • Versión actual: 3.5.2

Python como lenguaje

  • Intérprete más usado: CPython (Escrito en C)
  • Tabulación en vez de llaves
  • Lenguaje Interpretado
  • Hace hincapié en la legibilidad

El Zen

El Zen

>>> import this

  • Bello es mejor que feo.
  • Explícito es mejor que implícito.
  • Simple es mejor que complejo.
  • Complejo es mejor que complicado.
  • Plano es mejor que anidado.
  • Disperso es mejor que denso.
  • La legibilidad cuenta.
  • Los casos especiales no son tan especiales como para quebrantar las reglas.
  • Lo práctico gana a lo puro.
  • Los errores nunca deberían dejarse pasar silenciosamente.
  • A menos que hayan sido silenciados explícitamente.
  • Frente a la ambigüedad, rechaza la tentación de adivinar.
  • Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo.
  • Aunque esa manera puede no ser obvia al principio a menos que usted sea holandés.
  • Ahora es mejor que nunca.
  • Aunque nunca es a menudo mejor que ya mismo.
  • Si la implementación es difícil de explicar, es una mala idea.
  • Si la implementación es fácil de explicar, puede que sea una buena idea.
  • Los espacios de nombres (namespaces) son una gran idea ¡Hagamos más de esas cosas!

El Zen

Bello es mejor de feo

public class HelloWorld{

    public static void main(String[] args){
        System.out.println("Hello World");
    }

}
print("Hello world")

El Zen

Simple es mejor que complejo

List<Integer> list = new ArrayList<Integer>();
File file = new File("file.txt");
BufferedReader reader = null;

try {
    reader = new BufferedReader(new FileReader(file));
    String text = null;

    while ((text = reader.readLine()) != null) {
        list.add(Integer.parseInt(text));
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try {
        if (reader != null) {
            reader.close();
        }
    } catch (IOException e) {
    }
}

System.out.println(list);
list = []

with open("file.txt") as file:
    for line in file:
        list.append(int(line))

print(list)

El Zen

La legibilidad cuenta

for(int i=0; i<arraylist.size(); i++){
    if(numlist.get(i) > 0 && numlist.get(i) < 5){
        System.out.println(numlist.get(i));
    }
}
for num in numlist:
    if 0 < num < 5:
        print(num)

El Zen

Lo práctico gana a lo puro

ExampleObject example = new ExampleObject("green");

System.out.println("My fav color is "+example.getColor());

example.setColor("blue");

System.out.println("Now it is "+example.getColor());
example = ExampleObject("green")

print("My fav color is", example.color)

example.color = "blue"

print("Now it is", example.color)

"Todos somos adultos responsables"

El Zen

Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo.

def is_inside(num, numlist):
    return num in numlist
def is_inside(num, numlist):
    for n in numlist:
        if n == num:
            return True
    return False

El Zen

Contenido

  • Python 101
  • Colecciones
  • Funciones
  • POO
  • Ninja Skills

Python 101

Python 101

  • Variables
  • Condicionales
  • Bucles
  • I/O Archivos

Python 101

Variables

Python 101

Variables

  • Declaración:
nombre = "Ernesto"
nombre_completo = "Ernesto Enrique"
  • Tipado dinámico:
variable_cool = "Hola"
variable_cool = 32
  • Tipado fuerte:
asco_js = "32"
print(asco_js + 2)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cant convert 'int' object to str implicitly

Python 101

Condicionales

Python 101

Condicionales

  • Estructura:
if condicion1:
    #Si condicion1 es verdadera
elif condicion2:
    #Si condicion1 es falsa
    #Y condicion2 es verdadera
else:
    #Si el resto es falso

Python 101

Condicionales

&&

||

!

and

or

not

Python 101

Condicionales

¡Puedes concatenar comparadores!

if 5 < variable < 9:
    print("Wohoo!")

Python 101

Condicionales

Ternarias

print("Verdadero") if True else print("Falso")
if True:
    print("Verdadero")
else:
    print("Falso")

Igual que:

Python 101

¿Qué se considera verdadero y qué falso?

  • Falso:
    • False
    • 0
    • None
    • Colecciones vacías
def v_o_f(expresion):
    if expresion:
        print("Verdadero")
    else:
        print("Falso")

v_o_f(False)
"Falso"

v_o_f(0)
"Falso"

v_o_f(None)
"Falso"

v_o_f( [] )
"Falso"
  • Verdadero:
    • True
    • El resto

Python 101

Bucles

Python 101

Bucles

Dos tipos de bucles:

For

While

i = 1
while i < 4:
    print("Ni", i)
    i += 1
print("Sino", i)

"Ni 1"
"Ni 2"
"Ni 3"
"Sino 4"
for letra in "Hola":
    print(letra)

"H"
"o"
"l"
"a"

Python 101

Bucles: While

  • Estructura:
while condicion:
    #Mientras condicion sea verdad 
    #ejecuta esto

Python 101

Bucles: For

  • Estructura:
for item in coleccion:
    #Por cada elemento que 
    #haya en la coleccion
    #ejecuta esto.

Python 101

Bucles: For (para gente de Java)

String[] nombres = {"Ángel","Juan","Julian"};
for(int i=0; i < 3; i++){
    String nombre = nombres[i];

    System.out.println(nombre);
}
nombres = ["Ángel", "Juan", "Julian"]

for nombre in nombres:
    print(nombre)

Python 101

Bucles: For (para gente de Java)

for(int i=0; i < 3; i++){
    System.out.println(i);
}
for i in range(3):
    print(i)

Python 101

I/O Archivos

Python 101

I/O Archivos

  • Sintaxis:
with open(RUTA_DEL_ARCHIVO, MODO) as variable_archivo:
    #Trabajar con el contenido del archivo

#El archivo se cierra automáticamente

Python 101

Lectura de archivos

  • Texto plano:
with open("ejemplo.txt") as ejemplo_cool:
    contenido = ejemplo_cool.read()


#Leer linea a linea
with open("ejemplo.txt") as ejemplo_cool:
    for linea in ejemplo_cool:
        print(linea)
  • Archivo binario
with open("ejemplo.txt", 'rb') as binario:
    contenido = ejemplo_bin.read()

Python 101

Escritura de archivos

  • Texto plano:
with open("ejemplo.txt", 'w') as ejemplo_cool:
    contenido = ejemplo_cool.write("Hola")
  • Archivo binario
with open("ejemplo.txt", 'wb') as binario:
    contenido = ejemplo_bin.write("Hola")

Colecciones

Colecciones

  • Listas
  • Diccionarios
  • Sets
  • Tuplas

Colecciones

Listas

Colecciones

  • Mantiene el orden en el que se introducen los elementos

Listas

  • Puede tener duplicados
  • Accedemos al valor mediante índice

Colecciones

Listas

Declaración


lista = []     # Ó lista = list()

Añadir elemento

lista.append('ejemplo')
lista.append(2)
lista.append([])

Acceder elemento

lista[0]    'ejemplo'
lista[1]    '2'
lista[-1]   '[]'

Colecciones

Listas

Segmentos

lista = [3, 1, 8]
lista[1:]     '[1, 8]'
lista[0:2]    '[3, 1]

Máximo, mínimo y  total

max(lista)    '8'
min(lista)    '1'
sum(lista)    '12'

Ordenar


lista.sort()     '[1, 3, 8]'

Colecciones

Diccionarios

Colecciones

Diccionarios

  • No mantiene ningún orden
  • No puede tener claves duplicadas, valores sí
  • Accedemos al valor mediante clave

Colecciones

Diccionarios

Declaración


diccionario = {}  # Ó diccionario = dict()

Añadir elemento

diccionario['nombre'] = "Javier"
diccionario['apellido1'] = "Luna"
diccionario['edad'] = 19

Acceder elemento

diccionario['nombre']       'Javier'
diccionario['apellido1']    'Luna'
diccionario['edad']           19

Colecciones

Diccionarios

Acceder elemento [Forma segura]

diccionario['apellido2']            KeyError 'apellido2'
diccionario.get('apellido2', '*')   '*'

De diccionario a JSON string

import json
string = json.dumps(diccionario)
"{'nombre': 'Javier', 'apellido1': 'Luna',
 'edad':19}"

De JSON string a diccionario

import json
diccionario = json.loads(string)

Colecciones

Sets

Colecciones

  • No mantiene ningún orden

Sets

  • No tiene duplicados
  • No se accede directamente a los elementos  (iterar y operaciones con conjuntos)

Colecciones

Sets

Declaración


mi_set = set()

Añadir elemento

mi_set.add('hola')     "{'hola'}"
mi_set.add('mundo')    "{'hola', 'mundo'}"
mi_set.add('mundo')    "{'mundo', 'hola'}"

Lista a set

lista_set = set(['hola', 'mundo', 'mundo'])
"{'mundo', 'hola'}"

Recordad: Los elementos no tienen orden

Colecciones

Sets

Lista sin duplicados

lista = [1, 3, 4, 4, 3]
lista = list(set(lista))
"[3, 1, 4]"

Operaciones de conjuntos

a = set(['a', 'b', 'c'])
b = set(['a', 'm', 'd'])

Elementos de a que no aparecen en b
a - b  "{'b', 'c'}"

Elementos de a y elementos en b
a | b  "{'m', 'a', 'd', 'c', 'b'}"

Elementos de a y de b
a & b  "{'a'}"

Colecciones

Tuplas

Colecciones

  • Mantienen el orden de los elementos

Tuplas

  • Son inmutables
  • Accedemos a los elementos mediante índice

Colecciones

Tuplas

Declaración


tupla = ('hola', 'mundo')

Acceso a elementos

tupla[0]    "hola"
tupla[1]    "mundo"

Colecciones

Cosas cool

Colecciones

Cosas cool

Ver si una colección contiene un elemento

'hola' in ['hola', 'mundo']

Iterar sobre los elementos de una colección

for elemento in ['hola', 'mundo']:
    print(elemento)

String es una especie de colección (de caracteres)

for letra in "Hola mundo"[0:4]:
    print(letra)

Funciones

  • Declaración
  • keyword arguments
  • *args y **kwargs
  • Pasar funciones por parámetros

Funciones

Funciones

Declaración

def nombre_funcion():
    #código de la función

def con_argumentos(nombre, edad):
    #código de la función

Funciones

Keyword arguments I

def funcion(nombre="Pedro", edad=2):
    print(nombre + " " + edad)

funcion()                       'Pedro 2'
funcion(nombre="Manuel")        'Manuel 2'
funcion(edad=3, nombre="Sol")   'Sol 3'
    

Funciones

Keyword arguments II

def funcion(nombre, edad=2):
    print(nombre + " " + edad)

funcion("Pedro")                    'Pedro 2'
funcion(edad=34, "Manuel")           SyntaxError!!
funcion("Manuel", edad=34)          'Manuel 34'
    

Funciones

*args y **kwargs

def funcion(*args, **kwargs):    #args es una tupla 
                                 #y kwargs es un diccionario
    for argumento in args:
        print(argumento + " " + kwargs.get(argumento, ""))

funcion("Manuel", "Pedro", "Pablo", Manuel="23", Pablo="34")

'Manuel 23'
'Pedro'
'Pablo 34'
    

Funciones

Pasar funciones como argumento

import time

def medir_tiempo(funcion):
    tiempo_inicio = time.time()
    funcion()
    tiempo_final = time.time()
    return tiempo_final - tiempo_inicial

def ejemplo():
    time.sleep(3)

print(medir_tiempo(ejemplo), "segundos")        '3 segundos'

POO

  • Estructura y conceptos básicos
  • Encapsulación
  • Herencia múltiple

POO

POO

Conceptos Básicos

POO

Declaración de una clase

class Persona:

    def __init__(self, nombre, apellido, edad=13):
        #Este es el constructor
        self.nombre = nombre
        self.apellido = apellido
        self.edad = edad

    def print_datos(self):
        print(self.nombre, self.apellido, self.edad, "años")

patron = Persona("Pablo", "Escobar", edad=44)

patron.print_datos()    'Pablo Escobar 44 años'

POO

Varias clases en un mismo archivo

class Persona:

    def __init__(self, nombre, apellido, edad=13):
        self.nombre = nombre
        self.apellido = apellido
        self.edad = edad

    def print_datos(self):
        print(self.nombre, self.apellido, self.edad)

class Animal:
    
    def __init__(self, especie, raza)
        self.especie = especie
        self.raza = raza
    
    def print_datos(self):
        print(self.especie, self.raza)

POO

Herencia simple

class Fruta:

    def __init__(self, tipo, color):
        self.tipo = tipo
        self.color = color
    
    def print_info(self):
        print("Tipo:", self.tipo, "Color:", self.color)

class Platano(Fruta):

    def __init__(self):
        super().__init__("Alargado", "Amarillo")

platano = Platano()

platano.print_info()    'Tipo: Alargado Color: Amarillo'

POO

Encapsulación

POO

  • ¡Lo público mola!

Encapsulación

  • "Privado" -> No toques eso :(
class Prueba:

    def __init__(self):
        self.var_publica = "Publica"
        self.__var_privada = "Privada"

    def hola(self):
        return "Publica!"

    def __hola(self):
        return "Privada :("

POO

Herencia múltiple

POO

Herencia múltiple

class Fruta:
    
    def __init__(self, tipo, color):
        self.tipo = tipo
        self.color = color

    def refrescar(self):
        print("Wow qué refrescante!!")
        print("Es", self.tipo, "y", self.color)

class Hortaliza:
    
    def __init__(self, peso):
        self.peso = peso
    
    def en_ensalada(self):
        print("Va bien en una ensalada!")
        print("Pesa", self.peso)

POO

Herencia múltiple

class Tomate(Fruta, Hortaliza):

    def __init__(self):
        Fruta.__init__(self, "Esférico", "Rojo")
        Hortaliza.__init__(self, "3gr")

    def print_info(self):
        self.refrescar()
        print("Y")
        self.en_ensalada()

tomate = Tomate()

tomate.print_info()

'Wow qué refrescante!'
'Es Esférico y Rojo'
'Y'
'Va bien en una ensalada!'
'Pesa 3gr'

Ninja Skills

Ninja Skills

Unboxing

Ninja Skills

Unboxing



a, b, c = ["Hola", "a", "todos!"]

print(a)    'Hola'
print(b)    'a'
print(c)    'todos!'

Ninja Skills

enumerate

Ninja Skills

enumerate

lista_compra = ["Leche", "Huevos", "Ketchup"]

for i, elemento in enumerate(lista_compra):
    print(i, elemento)

'0 Leche'
'1 Huevos'
'2 Ketchup'

Ninja Skills

Asignación condicional

Ninja Skills

Asignación condicional

variable_1 = False or 1
variable_2 = True or 2

print(variable_1)    '1'
print(variable_2)    'True'

def llamar_a(numero, nombre=""):
    nombre = nombre or "No tiene nombre"
    print("LLamando a:", nombre)

llamar_a(679049312)    'Llamando a: No tiene nombre'

Ninja Skills

List comprehensions

Ninja Skills

List comprehensions

lista_pares = [num for num in range(800) if not num % 2]

lista_pares = []

for num in range(800):
    if num % 2 == 0:
        lista_pares.append(num)

Ninja Skills

Lazy attributes

Ninja Skills

Lazy attributes

class Persona
    
    def __init__(self, edad=30):
        self.__edad = edad
    
    @property
    def edad(self):
        self.__edad += 1
        return self.__edad - 1

persona = Persona()

persona.edad    '30'
persona.edad    '31'
persona.edad    '32'

¡Gracias a todos!

Introducción a Python

By Javier Luna Molina

Introducción a Python

Una introducción para programadores, profundizando en algunos de los muchos conceptos interesantes que nos brinda este lenguaje. Para Python 3

  • 574