Tutorial de Python 3¶
El objetivo de este tutorial es que ustedes puedan aprender sobre lo básico de Python 3, no esperamos que se vuelvan expertos con esta introducción. En este curso no es fundamental que dominen al 100% este lenguaje de programación y realmente solo necesitan conocer lo básico para poder completar satisfactoriamente los laboratorios y proyectos que utilicen este lenguaje.
Instalación¶
Actualmente hay 2 diferentes versiones soportadas de Python: 2.7 y 3.X. Para este curso vamos a estar utilizando Python 3 y más especificamente utilizar Anaconda Python. Para instalar Anaconda en sus computadoras tienen que hacer lo siguiente:
wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh
bash Anaconda3-2019.03-Linux-x86_64.sh
source ~/.bashrc
Esto va a instalar Anaconda Python 3.7, para verificar la version pueden correr el siguiente comando:
python --version
Para abrir el intérprete de Python solo necesitan escribir:
python
Si su instalación es correcta resultará en algo como esto:
Python 3.7.3 (default, Mar 27 2019, 22:11:17) [GCC 7.3.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>>
Introducción¶
Python es un lenguaje de programación multiparadigma y con tipos dinámicos. El código escrito en Python se dice que es similar al pseudocódigo, ya que permite expresar ideas bastante poderosas en muy pocas líneas de código y al mismo tiempo ser bastante leíble. Como ejemplo, aquí hay una implementación del clásico algoritmo quicksort escrito en Python:
def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quicksort(left) + middle + quicksort(right) print(quicksort([3,6,8,10,1,2,1]))
Tipos de datos básicos¶
Como en muchos lenguajes, Python tiene un número de tipos de datos básicos incluyendo enteros, floats, booleans y strings. Estos tipos de datos se comportan como lo han visto en otros lenguajes de programación (C por ejemplo).
Números¶
Los enteros y los floats funcionan como ustedes han visto que funcionan en otros lenguajes:
x = 3 print(type(x)) # type: sirve para obtener el tipo de un objeto print(x) print(x + 1) print(x - 1) print(x * 2) print(x / 2) # division exacta print(x // 2) # division entera print(x ** 3) # exponentes x += 1 print(x) x *= 2 print(x) y = 2.5 print(type(y)) print(y) print(y + 1) print(y * 2) print(y / 2) print(y ** 2)
Noten que Python no tiene los operadores de incremento unario (x++
) o decremento (x--
). Python también tiene tipos para manejo de números completos, todo esto lo pueden ver en la documentación
Booleans¶
Python implementa todos los operadores usuales para hacer lógica booleana, pero usa palabras en Inglés en vez de símbolos (&&
, ||
, etc.):
t = True f = False print(type(t)) print(t and f) # AND lógico print(t or f) # OR lógico print(not t) # NOT lógico print(t != f) # XOR lógico
Strings¶
Python tiene buen soporte de strings:
hello = 'hello' # las literales string pueden ser declaradas con apóstofre world = "world" # o comillas, no importa la verdad... print(hello) print(len(hello)) # con len obtenemos el length del string hw = hello + ' ' + world # concatenación, así como en Java print(hw) hw12 = '%s %s %d' % (hello, world, 12) # formato de texto al estilo sprintf print(hw12)
Los objetos de tipo string tienen un montón de métodos útiles; Por ejemplo:
s = 'hello' # Pone la letra del principio en mayuscula print(s.capitalize()) # Pasa el string a mayusculas print(s.upper()) # Justifica un string, rellenando con espacios print(s.rjust(7)) # Centra un string, rellanando con espacios print(s.center(7)) # Reemplaza todas las apariciones de un substring por otro print(s.replace('l', '(ell)')) # Quita todos los caracteres de whitespace del principio y final print(' world '.strip())
Pueden encontrar una lista de todos los métodos en la documentación.
Contenedores¶
Python incluye bastantes tipos de contenedores: listas, diccionarios, sets y tuplas.
Listas¶
Una lista en Python es equivalente a un arreglo en C o Java, pero es dinámico (puede cambiar su tamaño, es decir no es fijo) y puede tener elementos de diferentes tipos:\
# Crea una lista xs = [3, 1, 2] print(xs) # Para acceder a un elemento de la lista, los indices van de 0 a length - 1 print(xs[1]) # Los indices negativos empiezan desde el final de la lista print(xs[-1]) # Las listas pueden contener elementos de diferentes tipos xs[2] = 'foo' print(xs) # Añade un elemento al final de la lista xs.append('bar') print(xs) # Quita y devuelve el último elemento de la lista x = xs.pop() print(x, xs) # para obtener el length de la lista print(len(xs))
Puden encontrar más detalles en la documentación de listas.
Slicing¶
Además de acceder a los elementos de una lista uno a la vez, Python provee una sintaxis para acceder a sublistas, a esto se le conoce como slicing:
# Creamos una nueva lista nums = [0, 1, 2, 3, 4] print(nums) # Agarra una sublista desde el indice 2 hasta el indice 3 es decir [2,4) print(nums[2:4]) # Agarra una sublista desde el indice 2 hasta el final de la lista, es decir [2,4] print(nums[2:]) # Agarra una sublista desde el principio de la misma hasta el indice 2 sin incluir, es decir [0,2) print(nums[:2]) # Agarra toda la lista "[0, 1, 2, 3, 4]" print(nums[:]) # El slice puede ser negativo, en este caso agarra desde el principio hasta el penultimo elemento, es decir [0,3] print(nums[:-1]) # Asigna una sublista al slice nums[2:4] = [8, 9] print(nums)
Ciclos¶
Pueden iterar sobre elementos de una lista de la siguiente manera:
animals = ['cat', 'dog', 'monkey'] for animal in animals: print(animal)
Si quieren acceder al indice de cada elemento dentro del ciclo, pueden utilizar la funcion “enumerate”:
animals = ['cat', 'dog', 'monkey'] for idx, animal in enumerate(animals): print('#%d: %s' % (idx + 1, animal))
List comprehensions¶
Cuando estamos programando, frecuentemente vamos a querer transformar un tipo de dato hacia otro. Como un ejemplo simple, consideren el siguiente código que calcula numeros al cuadrado:
nums = [0, 1, 2, 3, 4] squares = [] for x in nums: squares.append(x ** 2) print(squares)
Pueden hacer este código más simple utilizando una list comprehension:
nums = [0, 1, 2, 3, 4] squares = [x ** 2 for x in nums] # list comprehension print(squares)
Las list comprehension pueden contener condiciones:
nums = [0, 1, 2, 3, 4] even_squares = [x ** 2 for x in nums if x % 2 == 0] print(even_squares)
Diccionarios¶
Un diccionario guarda un par (key, value), similar a un Map en java. Pueden utilizarlo así:
# crea un nuevo diccionario con algunos datos d = {'cat': 'cute', 'dog': 'furry'} # toma el valor del key 'cat' print(d['cat']) # verifica que el key 'cat' este en el diccionario d print('cat' in d) # añade un par key, value al diccionario d d['fish'] = 'wet' print(d['fish']) # el key 'monkey' no existe, pero podemos poner un valor por defecto, en este caso N/A print(d.get('monkey', 'N/A')) # como fish existe no imprime el valor por defecto print(d.get('fish', 'N/A')) # podemos eliminar elementos del diccionario del d['fish'] # come fish lo quitamos y ya no existe, tiene que devolver el valor por defecto print(d.get('fish', 'N/A'))
Pueden encontrar todo lo que necesitan saber de diccionarios en la documentación.
Ciclos¶
Es fácil iterar sobre las keys de un diccionario:
d = {'person': 2, 'cat': 4, 'spider': 8} for animal in d: legs = d[animal] print('A %s has %d legs' % (animal, legs))
Si quieren acceder a las keys y sus valores correspondientes pueden utilizar el método “items”:
d = {'person': 2, 'cat': 4, 'spider': 8} for animal, legs in d.items(): print('A %s has %d legs' % (animal, legs))
Dictionary comprehensions¶
Estos son similares a las list comprehensions, pero ayuda a construir diccionarios fácilmente, por ejemplo:
nums = [0, 1, 2, 3, 4] even_num_to_square = {x: x ** 2 for x in nums if x % 2 == 0} print(even_num_to_square)
Sets¶
Un set es un la colección no ordenada de elementos distintos. Como ejemplo simple, consideren lo siguiente:
animals = {'cat', 'dog'} # Verifica que un elemento este en el set print('cat' in animals) print('fish' in animals) # Añade un elemento al set animals.add('fish') print('fish' in animals) # Numero de elementos en un set print(len(animals)) # Añadir un elemento que ya esta en el set, lo permite pero no pasa nada animals.add('cat') print(len(animals)) # Remueve un elemento del set animals.remove('cat') print(len(animals))
Otra vez, todo lo que quieran saber acerca de los sets lo pueden encontrar en la documentación.
Loops¶
Iterear sobre un set tienen la misma sintaxis que iterar sobre una lista, sin embargo como los sets no tienen orden, no pueden asumir sobre en que orden se van a visitar los elementos del set:
animals = {'cat', 'dog', 'fish'} for idx, animal in enumerate(animals): print('#%d: %s' % (idx + 1, animal))
Set comprehensions¶
como las listas y los diccionarios, podemos construir sets fácilmente utilizando set comprehensions:
from math import sqrt nums = {int(sqrt(x)) for x in range(30)} print(nums)
Tuplas¶
Una tupla es una lista ordenada de elementos “fija”. Una tupla es bastante similar a una lista, una de las más importantes diferencias es que las tuplas se pueden utilizar como keys en un diccionario y como elementos de los sets, mientras que las listas no. Aquí hay un ejemplo:
# Crea un diccionario con keys de tuplas d = {(x, x + 1): x for x in range(10)} # Crea una tupla t = (5, 6) print(type(t)) print(d[t]) print(d[(1, 2)])
La documentación tiene mas información acerca de las tuplas.
Funciones¶
Las funciones de Python se definen utilizando el keyword def. Por ejemplo:
def sign(x): if x > 0: return 'positive' elif x < 0: return 'negative' else: return 'zero' for x in [-1, 0, 1]: print(sign(x))
Vamos a definir funciones que toman argumentos, y opcionalmente argumentos keyword, como esto:
def hello(name, loud=False): if loud: print('HELLO, %s' % name.upper()) else: print('Hello, %s!' % name) hello('Bob') hello('Fred', loud=True)
Hay mucha información acerca de como definir funciones en Python en la documentación.
Funciones Lambda¶
Python tiene una sintaxis definida para funciones anónimas, lambda functions, están son bastante utiles para pasarlas como argumento a otras funciones:
# importamos la funcion reduce from functools import reduce # definimos una funcion anonima y se la asignamos a una variable x x = lambda l: l ** 2 # podemos usar la funcion anonima como cualquier otra funcion print(x(2)) # pero lo mas importante es que la podemos pasar como argumento def foo(f): return f(4) print(foo(lambda x: x + 1)) # aunque esto no implica que con las funciones normales puedan hacer esto... def bar(x): return x ** 2 print(foo(bar)) # por lo general se utilizan con las funciones map, reduce y filter de python que trabajan con listas print(list(map(lambda x: x ** 2, [1, 2, 3, 4, 5]))) print(list(filter(lambda x: x > 2, [1, 2, 3, 4, 5]))) print(reduce(lambda a, b: a + b, [1, 2, 3, 4, 5])) # pero tambien se ven muy seguido cuando se trabaja con el paradigma MapReduce y Spark # que es parte de su proyecto y este laboratorio !!!
Clases¶
La sintaxis para definir clases en Python es bastante simple:
class Greeter: # Constructor def __init__(self, name): self.name = name # Crea un atributo para la clase # Un metodo de la clase def greet(self, loud=False): if loud: print('HELLO, %s!' % self.name.upper()) else: print('Hello, %s' % self.name) # Crea una instancia de la clase g = Greeter('Fred') # Llama al metodo de la clase; imprime "Hello, Fred" g.greet() # Llama al metodo de la clase; imprime "HELLO, FRED!" g.greet(loud=True)
Con esto concluimos el tutorial de Python 3, pueden obtener más información en la documentación de Python 3 oficial o incluso seguir el tutorial completo que ellos tienen.