mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-12-23 17:41:41 +00:00
491 lines
14 KiB
Markdown
491 lines
14 KiB
Markdown
|
---
|
||
|
language: python
|
||
|
contributors:
|
||
|
- ["Louie Dinh", "http://ldinh.ca"]
|
||
|
translators:
|
||
|
- ["Camilo Garrido", "http://www.twitter.com/hirohope"]
|
||
|
lang: es-es
|
||
|
filename: learnpython.py
|
||
|
---
|
||
|
|
||
|
Python fue creado por Guido Van Rossum en el principio de los 90'. Ahora es uno
|
||
|
de los lenguajes más populares en existencia. Me enamoré de Python por su claridad sintáctica.
|
||
|
Es básicamente pseudocódigo ejecutable.
|
||
|
|
||
|
¡Comentarios serán muy apreciados! Pueden contactarme en [@louiedinh](http://twitter.com/louiedinh) o louiedinh [at] [servicio de email de google]
|
||
|
|
||
|
Nota: Este artículo aplica a Python 2.7 específicamente, pero debería ser aplicable a Python 2.x. ¡Pronto un recorrido por Python 3!
|
||
|
|
||
|
```python
|
||
|
# Comentarios de una línea comienzan con una almohadilla (o signo gato)
|
||
|
""" Strings multilinea pueden escribirse
|
||
|
usando tres "'s, y comunmente son usados
|
||
|
como comentarios.
|
||
|
"""
|
||
|
|
||
|
####################################################
|
||
|
## 1. Tipos de datos primitivos y operadores.
|
||
|
####################################################
|
||
|
|
||
|
# Tienes números
|
||
|
3 #=> 3
|
||
|
|
||
|
# Matemática es lo que esperarías
|
||
|
1 + 1 #=> 2
|
||
|
8 - 1 #=> 7
|
||
|
10 * 2 #=> 20
|
||
|
35 / 5 #=> 7
|
||
|
|
||
|
# La división es un poco complicada. Es división entera y toma la parte entera
|
||
|
# de los resultados automáticamente.
|
||
|
5 / 2 #=> 2
|
||
|
|
||
|
# Para arreglar la división necesitamos aprender sobre 'floats'
|
||
|
# (números de coma flotante).
|
||
|
2.0 # Esto es un 'float'
|
||
|
11.0 / 4.0 #=> 2.75 ahhh...mucho mejor
|
||
|
|
||
|
# Refuerza la precedencia con paréntesis
|
||
|
(1 + 3) * 2 #=> 8
|
||
|
|
||
|
# Valores 'boolean' (booleanos) son primitivos
|
||
|
True
|
||
|
False
|
||
|
|
||
|
# Niega con 'not'
|
||
|
not True #=> False
|
||
|
not False #=> True
|
||
|
|
||
|
# Igualdad es ==
|
||
|
1 == 1 #=> True
|
||
|
2 == 1 #=> False
|
||
|
|
||
|
# Desigualdad es !=
|
||
|
1 != 1 #=> False
|
||
|
2 != 1 #=> True
|
||
|
|
||
|
# Más comparaciones
|
||
|
1 < 10 #=> True
|
||
|
1 > 10 #=> False
|
||
|
2 <= 2 #=> True
|
||
|
2 >= 2 #=> True
|
||
|
|
||
|
# ¡Las comparaciones pueden ser concatenadas!
|
||
|
1 < 2 < 3 #=> True
|
||
|
2 < 3 < 2 #=> False
|
||
|
|
||
|
# Strings se crean con " o '
|
||
|
"Esto es un string."
|
||
|
'Esto también es un string'
|
||
|
|
||
|
# ¡Strings también pueden ser sumados!
|
||
|
"Hola " + "mundo!" #=> "Hola mundo!"
|
||
|
|
||
|
# Un string puede ser tratado como una lista de caracteres
|
||
|
"Esto es un string"[0] #=> 'E'
|
||
|
|
||
|
# % pueden ser usados para formatear strings, como esto:
|
||
|
"%s pueden ser %s" % ("strings", "interpolados")
|
||
|
|
||
|
# Una forma más reciente de formatear strings es el método 'format'.
|
||
|
# Este método es la forma preferida
|
||
|
"{0} pueden ser {1}".format("strings", "formateados")
|
||
|
# Puedes usar palabras claves si no quieres contar.
|
||
|
"{nombre} quiere comer {comida}".format(nombre="Bob", comida="lasaña")
|
||
|
|
||
|
# None es un objeto
|
||
|
None #=> None
|
||
|
|
||
|
# No uses el símbolo de igualdad `==` para comparar objetos con None
|
||
|
# Usa `is` en lugar de
|
||
|
"etc" is None #=> False
|
||
|
None is None #=> True
|
||
|
|
||
|
# El operador 'is' prueba la identidad del objeto. Esto no es
|
||
|
# muy útil cuando se trata de datos primitivos, pero es
|
||
|
# muy útil cuando se trata de objetos.
|
||
|
|
||
|
# None, 0, y strings/listas vacíos(as) todas se evalúan como False.
|
||
|
# Todos los otros valores son True
|
||
|
0 == False #=> True
|
||
|
"" == False #=> True
|
||
|
|
||
|
|
||
|
####################################################
|
||
|
## 2. Variables y Colecciones
|
||
|
####################################################
|
||
|
|
||
|
# Imprimir es muy fácil
|
||
|
print "Soy Python. ¡Encantado de conocerte!"
|
||
|
|
||
|
|
||
|
# No hay necesidad de declarar las variables antes de asignarlas.
|
||
|
una_variable = 5 # La convención es usar guiones_bajos_con_minúsculas
|
||
|
una_variable #=> 5
|
||
|
|
||
|
# Acceder a variables no asignadas previamente es una excepción.
|
||
|
# Ve Control de Flujo para aprender más sobre el manejo de excepciones.
|
||
|
otra_variable # Levanta un error de nombre
|
||
|
|
||
|
# 'if' puede ser usado como una expresión
|
||
|
"yahoo!" if 3 > 2 else 2 #=> "yahoo!"
|
||
|
|
||
|
# Listas sobre secuencias
|
||
|
lista = []
|
||
|
# Puedes empezar con una lista prellenada
|
||
|
otra_lista = [4, 5, 6]
|
||
|
|
||
|
# Añadir cosas al final de una lista con 'append'
|
||
|
lista.append(1) #lista ahora es [1]
|
||
|
lista.append(2) #lista ahora es [1, 2]
|
||
|
lista.append(4) #lista ahora es [1, 2, 4]
|
||
|
lista.append(3) #lista ahora es [1, 2, 4, 3]
|
||
|
# Remueve del final de la lista con 'pop'
|
||
|
lista.pop() #=> 3 y lista ahora es [1, 2, 4]
|
||
|
# Pongámoslo de vuelta
|
||
|
lista.append(3) # Nuevamente lista ahora es [1, 2, 4, 3].
|
||
|
|
||
|
# Accede a una lista como lo harías con cualquier arreglo
|
||
|
lista[0] #=> 1
|
||
|
# Mira el último elemento
|
||
|
lista[-1] #=> 3
|
||
|
|
||
|
# Mirar fuera de los límites es un error 'IndexError'
|
||
|
lista[4] # Levanta la excepción IndexError
|
||
|
|
||
|
# Puedes mirar por rango con la sintáxis de trozo.
|
||
|
# (Es un rango cerrado/abierto para ustedes los matemáticos.)
|
||
|
lista[1:3] #=> [2, 4]
|
||
|
# Omite el inicio
|
||
|
lista[2:] #=> [4, 3]
|
||
|
# Omite el final
|
||
|
lista[:3] #=> [1, 2, 4]
|
||
|
|
||
|
# Remueve elementos arbitrarios de una lista con 'del'
|
||
|
del lista[2] # lista ahora es [1, 2, 3]
|
||
|
|
||
|
# Puedes sumar listas
|
||
|
lista + otra_lista #=> [1, 2, 3, 4, 5, 6] - Nota: lista y otra_lista no se tocan
|
||
|
|
||
|
# Concatenar listas con 'extend'
|
||
|
lista.extend(otra_lista) # lista ahora es [1, 2, 3, 4, 5, 6]
|
||
|
|
||
|
# Chequea la existencia en una lista con
|
||
|
1 in lista #=> True
|
||
|
|
||
|
# Examina el largo de una lista con 'len'
|
||
|
len(lista) #=> 6
|
||
|
|
||
|
|
||
|
# Tuplas son como listas pero son inmutables.
|
||
|
tupla = (1, 2, 3)
|
||
|
tupla[0] #=> 1
|
||
|
tupla[0] = 3 # Levanta un error TypeError
|
||
|
|
||
|
# También puedes hacer todas esas cosas que haces con listas
|
||
|
len(tupla) #=> 3
|
||
|
tupla + (4, 5, 6) #=> (1, 2, 3, 4, 5, 6)
|
||
|
tupla[:2] #=> (1, 2)
|
||
|
2 in tupla #=> True
|
||
|
|
||
|
# Puedes desempacar tuplas (o listas) en variables
|
||
|
a, b, c = (1, 2, 3) # a ahora es 1, b ahora es 2 y c ahora es 3
|
||
|
# Tuplas son creadas por defecto si omites los paréntesis
|
||
|
d, e, f = 4, 5, 6
|
||
|
# Ahora mira que fácil es intercambiar dos valores
|
||
|
e, d = d, e # d ahora es 5 y e ahora es 4
|
||
|
|
||
|
|
||
|
# Diccionarios almacenan mapeos
|
||
|
dicc_vacio = {}
|
||
|
# Aquí está un diccionario prellenado
|
||
|
dicc_lleno = {"uno": 1, "dos": 2, "tres": 3}
|
||
|
|
||
|
# Busca valores con []
|
||
|
dicc_lleno["uno"] #=> 1
|
||
|
|
||
|
# Obtén todas las llaves como una lista
|
||
|
dicc_lleno.keys() #=> ["tres", "dos", "uno"]
|
||
|
# Nota - El orden de las llaves del diccionario no está garantizada.
|
||
|
# Tus resultados podrían no ser los mismos del ejemplo.
|
||
|
|
||
|
# Obtén todos los valores como una lista
|
||
|
dicc_lleno.values() #=> [3, 2, 1]
|
||
|
# Nota - Lo mismo que con las llaves, no se garantiza el orden.
|
||
|
|
||
|
# Chequea la existencia de una llave en el diccionario con 'in'
|
||
|
"uno" in dicc_lleno #=> True
|
||
|
1 in dicc_lleno #=> False
|
||
|
|
||
|
# Buscar una llave inexistente deriva en KeyError
|
||
|
dicc_lleno["cuatro"] # KeyError
|
||
|
|
||
|
# Usa el método 'get' para evitar la excepción KeyError
|
||
|
dicc_lleno.get("uno") #=> 1
|
||
|
dicc_lleno.get("cuatro") #=> None
|
||
|
# El método 'get' soporta un argumento por defecto cuando el valor no existe.
|
||
|
dicc_lleno.get("uno", 4) #=> 1
|
||
|
dicc_lleno.get("cuatro", 4) #=> 4
|
||
|
|
||
|
# El método 'setdefault' es una manera segura de añadir nuevos pares
|
||
|
# llave-valor en un diccionario
|
||
|
dicc_lleno.setdefault("cinco", 5) #dicc_lleno["cinco"] es puesto con valor 5
|
||
|
dicc_lleno.setdefault("cinco", 6) #dicc_lleno["cinco"] todavía es 5
|
||
|
|
||
|
|
||
|
# Sets (conjuntos) almacenan ... bueno, conjuntos
|
||
|
conjunto_vacio = set()
|
||
|
# Inicializar un conjunto con montón de valores
|
||
|
un_conjunto = set([1,2,2,3,4]) # un_conjunto ahora es set([1, 2, 3, 4])
|
||
|
|
||
|
# Desde Python 2.7, {} puede ser usado para declarar un conjunto
|
||
|
conjunto_lleno = {1, 2, 2, 3, 4} # => {1 2 3 4}
|
||
|
|
||
|
# Añade más valores a un conjunto
|
||
|
conjunto_lleno.add(5) # conjunto_lleno ahora es {1, 2, 3, 4, 5}
|
||
|
|
||
|
# Haz intersección de conjuntos con &
|
||
|
otro_conjunto = {3, 4, 5, 6}
|
||
|
conjunto_lleno & otro_conjunto #=> {3, 4, 5}
|
||
|
|
||
|
# Haz unión de conjuntos con |
|
||
|
conjunto_lleno | otro_conjunto #=> {1, 2, 3, 4, 5, 6}
|
||
|
|
||
|
# Haz diferencia de conjuntos con -
|
||
|
{1,2,3,4} - {2,3,5} #=> {1, 4}
|
||
|
|
||
|
# CHequea la existencia en un conjunto con 'in'
|
||
|
2 in conjunto_lleno #=> True
|
||
|
10 in conjunto_lleno #=> False
|
||
|
|
||
|
|
||
|
####################################################
|
||
|
## 3. Control de Flujo
|
||
|
####################################################
|
||
|
|
||
|
# Hagamos sólo una variable
|
||
|
una_variable = 5
|
||
|
|
||
|
# Aquí está una declaración de un 'if'. ¡La indentación es significativa en Python!
|
||
|
# imprime "una_variable es menor que 10"
|
||
|
if una_variable > 10:
|
||
|
print "una_variable es completamente mas grande que 10."
|
||
|
elif una_variable < 10: # Este condición 'elif' es opcional.
|
||
|
print "una_variable es mas chica que 10."
|
||
|
else: # Esto también es opcional.
|
||
|
print "una_variable es de hecho 10."
|
||
|
|
||
|
|
||
|
"""
|
||
|
For itera sobre listas
|
||
|
imprime:
|
||
|
perro es un mamifero
|
||
|
gato es un mamifero
|
||
|
raton es un mamifero
|
||
|
"""
|
||
|
for animal in ["perro", "gato", "raton"]:
|
||
|
# Puedes usar % para interpolar strings formateados
|
||
|
print "%s es un mamifero" % animal
|
||
|
|
||
|
"""
|
||
|
`range(número)` retorna una lista de números
|
||
|
desde cero hasta el número dado
|
||
|
imprime:
|
||
|
0
|
||
|
1
|
||
|
2
|
||
|
3
|
||
|
"""
|
||
|
for i in range(4):
|
||
|
print i
|
||
|
|
||
|
"""
|
||
|
While itera hasta que una condición no se cumple.
|
||
|
imprime:
|
||
|
0
|
||
|
1
|
||
|
2
|
||
|
3
|
||
|
"""
|
||
|
x = 0
|
||
|
while x < 4:
|
||
|
print x
|
||
|
x += 1 # versión corta de x = x + 1
|
||
|
|
||
|
# Maneja excepciones con un bloque try/except
|
||
|
|
||
|
# Funciona desde Python 2.6 en adelante:
|
||
|
try:
|
||
|
# Usa raise para levantar un error
|
||
|
raise IndexError("Este es un error de indice")
|
||
|
except IndexError as e:
|
||
|
pass # Pass no hace nada. Usualmente harias alguna recuperacion aqui.
|
||
|
|
||
|
|
||
|
####################################################
|
||
|
## 4. Funciones
|
||
|
####################################################
|
||
|
|
||
|
# Usa 'def' para crear nuevas funciones
|
||
|
def add(x, y):
|
||
|
print "x es %s y y es %s" % (x, y)
|
||
|
return x + y # Retorna valores con una la declaración return
|
||
|
|
||
|
# Llamando funciones con parámetros
|
||
|
add(5, 6) #=> imprime "x es 5 y y es 6" y retorna 11
|
||
|
|
||
|
# Otra forma de llamar funciones es con argumentos de palabras claves
|
||
|
add(y=6, x=5) # Argumentos de palabra clave pueden ir en cualquier orden.
|
||
|
|
||
|
# Puedes definir funciones que tomen un número variable de argumentos
|
||
|
def varargs(*args):
|
||
|
return args
|
||
|
|
||
|
varargs(1, 2, 3) #=> (1,2,3)
|
||
|
|
||
|
|
||
|
# Puedes definir funciones que toman un número variable de argumentos
|
||
|
# de palabras claves
|
||
|
def keyword_args(**kwargs):
|
||
|
return kwargs
|
||
|
|
||
|
# Llamémosla para ver que sucede
|
||
|
keyword_args(pie="grande", lago="ness") #=> {"pie": "grande", "lago": "ness"}
|
||
|
|
||
|
# Puedes hacer ambas a la vez si quieres
|
||
|
def todos_los_argumentos(*args, **kwargs):
|
||
|
print args
|
||
|
print kwargs
|
||
|
"""
|
||
|
todos_los_argumentos(1, 2, a=3, b=4) imprime:
|
||
|
(1, 2)
|
||
|
{"a": 3, "b": 4}
|
||
|
"""
|
||
|
|
||
|
# ¡Cuando llames funciones, puedes hacer lo opuesto a varargs/kwargs!
|
||
|
# Usa * para expandir tuplas y usa ** para expandir argumentos de palabras claves.
|
||
|
args = (1, 2, 3, 4)
|
||
|
kwargs = {"a": 3, "b": 4}
|
||
|
todos_los_argumentos(*args) # es equivalente a foo(1, 2, 3, 4)
|
||
|
todos_los_argumentos(**kwargs) # es equivalente a foo(a=3, b=4)
|
||
|
todos_los_argumentos(*args, **kwargs) # es equivalente a foo(1, 2, 3, 4, a=3, b=4)
|
||
|
|
||
|
# Python tiene funciones de primera clase
|
||
|
def crear_suma(x):
|
||
|
def suma(y):
|
||
|
return x + y
|
||
|
return suma
|
||
|
|
||
|
sumar_10 = crear_suma(10)
|
||
|
sumar_10(3) #=> 13
|
||
|
|
||
|
# También hay funciones anónimas
|
||
|
(lambda x: x > 2)(3) #=> True
|
||
|
|
||
|
# Hay funciones integradas de orden superior
|
||
|
map(sumar_10, [1,2,3]) #=> [11, 12, 13]
|
||
|
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) #=> [6, 7]
|
||
|
|
||
|
# Podemos usar listas por comprensión para mapeos y filtros agradables
|
||
|
[add_10(i) for i in [1, 2, 3]] #=> [11, 12, 13]
|
||
|
[x for x in [3, 4, 5, 6, 7] if x > 5] #=> [6, 7]
|
||
|
|
||
|
####################################################
|
||
|
## 5. Clases
|
||
|
####################################################
|
||
|
|
||
|
# Heredamos de object para obtener una clase.
|
||
|
class Humano(object):
|
||
|
|
||
|
# Un atributo de clase es compartido por todas las instancias de esta clase
|
||
|
especie = "H. sapiens"
|
||
|
|
||
|
# Constructor basico
|
||
|
def __init__(self, nombre):
|
||
|
# Asigna el argumento al atributo nombre de la instancia
|
||
|
self.nombre = nombre
|
||
|
|
||
|
# Un metodo de instancia. Todos los metodos toman self como primer argumento
|
||
|
def decir(self, msg):
|
||
|
return "%s: %s" % (self.nombre, msg)
|
||
|
|
||
|
# Un metodo de clase es compartido a través de todas las instancias
|
||
|
# Son llamados con la clase como primer argumento
|
||
|
@classmethod
|
||
|
def get_especie(cls):
|
||
|
return cls.especie
|
||
|
|
||
|
# Un metodo estatico es llamado sin la clase o instancia como referencia
|
||
|
@staticmethod
|
||
|
def roncar():
|
||
|
return "*roncar*"
|
||
|
|
||
|
|
||
|
# Instancia una clase
|
||
|
i = Humano(nombre="Ian")
|
||
|
print i.decir("hi") # imprime "Ian: hi"
|
||
|
|
||
|
j = Humano("Joel")
|
||
|
print j.decir("hello") #imprime "Joel: hello"
|
||
|
|
||
|
# Llama nuestro método de clase
|
||
|
i.get_especie() #=> "H. sapiens"
|
||
|
|
||
|
# Cambia los atributos compartidos
|
||
|
Humano.especie = "H. neanderthalensis"
|
||
|
i.get_especie() #=> "H. neanderthalensis"
|
||
|
j.get_especie() #=> "H. neanderthalensis"
|
||
|
|
||
|
# Llama al método estático
|
||
|
Humano.roncar() #=> "*roncar*"
|
||
|
|
||
|
|
||
|
####################################################
|
||
|
## 6. Módulos
|
||
|
####################################################
|
||
|
|
||
|
# Puedes importar módulos
|
||
|
import math
|
||
|
print math.sqrt(16) #=> 4
|
||
|
|
||
|
# Puedes obtener funciones específicas desde un módulo
|
||
|
from math import ceil, floor
|
||
|
print ceil(3.7) #=> 4.0
|
||
|
print floor(3.7) #=> 3.0
|
||
|
|
||
|
# Puedes importar todas las funciones de un módulo
|
||
|
# Precaución: Esto no es recomendable
|
||
|
from math import *
|
||
|
|
||
|
# Puedes acortar los nombres de los módulos
|
||
|
import math as m
|
||
|
math.sqrt(16) == m.sqrt(16) #=> True
|
||
|
|
||
|
# Los módulos de Python son sólo archivos ordinarios de Python.
|
||
|
# Puedes escribir tus propios módulos e importarlos. El nombre del módulo
|
||
|
# es el mismo del nombre del archivo.
|
||
|
|
||
|
# Puedes encontrar que funciones y atributos definen un módulo.
|
||
|
import math
|
||
|
dir(math)
|
||
|
|
||
|
|
||
|
```
|
||
|
|
||
|
## ¿Listo para más?
|
||
|
|
||
|
### Gratis y en línea
|
||
|
|
||
|
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
|
||
|
* [Dive Into Python](http://www.diveintopython.net/)
|
||
|
* [The Official Docs](http://docs.python.org/2.6/)
|
||
|
* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/)
|
||
|
* [Python Module of the Week](http://pymotw.com/2/)
|
||
|
|
||
|
### Encuadernados
|
||
|
|
||
|
* [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20)
|
||
|
* [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20)
|
||
|
* [Python Essential Reference](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20)
|
||
|
|