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 (código sobre blanco)
By Javier Luna Molina
Introducción a Python (código sobre blanco)
Una introducción para programadores, profundizando en algunos de los muchos conceptos interesantes que nos brinda este lenguaje. Para Python 3
- 516