Sentencias de control de flujo
Las sentencias de control de flujo son while, if y for. No existe el select, en vez de eso se usa if. Para enumerar los miembros de una lista se usa for. Y para obtener una lista de números se utiliza range(). La síntaxis de esta sentencia es así:
lstRange = range(10)
>>> print lstRange
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for intNumero in lstRange:
# Comprobar si intNumero es uno
# de los números en la lista.
if intNumber in (3, 4, 7, 9):
# "Break" finaliza un for sin
# ejecutar la clausula "else".
break
else:
# "Continue" sigue con la siguiente iteración
# del bucle. Aquí no sirve para nada
# ya que es la última sentencia del bucle.
continue
else:
# La clausula "else" es opcional y se ejecuta solo
# si el bucle no encuentra un "break".
pass # Hacer algo
if lstRange[1] == 2:
print "El segundo elemento (las listas empiezan en 0) es 2"
elif lstRange[1] == 3:
print "El segundo elemento (las listas empiezan en 0) es 3"
else:
print "No lo he encontrdo"
while lstRange[1] == 1:
pass
Funciones
Las funciones se declaran con la palabra clave "def". Los argumentos opcionales se colocan en la declaración de la función después de los argumentos obligatorios asignándoles un valor por defecto. También se pueden llamar a parámetros por su nombre, indicando el valor que van a tener. Las funciones pueden devolver una tupla (y desempaquetando la tupla puedes devolver múltiples valores). Las funciones lambda son un tipo especial de función que solo están compuestas por una instrucción. Los parámetros son pasados por referencia. Pero los tipos de datos modificables (tuplas, listas, enteros, cadenas, etc) no pueden cambiarse. Por ejemplo:
# arg2 y arg3 son opcionales. Tienen valores por defecto
# si uno no se pasa (100 y "prueba" respectivamente).
def fnMiFuncion(arg1, arg2 = 100, arg3 = "prueba"):
return arg3, arg2, arg1
ret1, ret2, ret3 = fnMiFuncion("Argumento 1", arg3 = "argumento con nombre")
fnVariable = lambda x: x + 1
>>> print fnVariable(1)
2
Clases
Python soporta una forma limitada de herencia múltiple en las clases. Se pueden declarar variables y métodos privados (por convención, el lenguaje no obliga a hacerlo) añadiendo al menos dos subrayados en el nombre (p.e. "__spam"). También se pueden asignar variables arbitrarias a las instancias de la clase. Por ejemplo:
class MiClase:
varComun = 10
def __init__(self):
self.varMiVariable = 3
def fnMiFuncion(self, arg1, arg2):
return self.varMiVariable
# Esta es la instanciación de la clase
>>> clsInstancia = MiClase()
>>> clsInstancia.fnMiFuncion(1, 2)
3
# Esta variable está compartida por tadas las clases
>>> clsInstancia2 = MiClase()
>>> clsInstancia.varComun
10
>>> clsInstancia2.varComun
10
# Fíjate cómo se usa el nombre de la clase
# en vez del de la instancia.
>>> MiClase.varComun = 30
>>> clsInstancia.varComun
30
>>> clsInstancia2.varComun
30
# Esto no actualizará la variable en la clase,
# sino que creará una nueva en la instancia
# de la clase y le asignará el valor.
>>> clsInstancia.varComun = 10
>>> clsInstancia.varComun
10
>>> clsInstancia2.varComun
30
>>> MiClase.varComun = 50
# Esto no cambia, porque varComun es
# ahora una variable de la instancia.
>>> clsInstancia.varComun
10
>>> clsInstancia2.varComun
50
# Esta clase hereda de MiClase. La herencia múltiple
# se declara como:
# class OtraClase(MiClase1, MiClase2, MiClaseN)
class OtraClase(MiClase):
def __init__(self, arg1):
self.varMiVariable = 3
print arg1
>>> clsInstancia = OtraClase("hola")
hola
>>> clsInstancia.fnMiFuncion(1, 2)
3
# Esta clase no tiene un miebro llamado prueba.
# Pero podemos añadírselo de todas formas.
# Date cuenta que solo será un miembro de clsInstancia.
>>> clsInstancia.prueba = 10
>>> clsInstancia.prueba
10
Excepciones
Las excepciones en Python se tratan con los bloques try-except [nombre de excepción]:
def fnExcepcion():
try:
# La división por cero eleva una excepción
10 / 0
except ZeroDivisionError:
print "Vaya, no válido."
>>> fnExcepcion()
Vaya, no válido.
Importación
Se pueden usar librerías externas con la palabra clave import [nombre de la librería]. También puedes usar la sintaxis from [nombre de la librería] import [nombre función] para funciones individuales. Por ejemplo:
import random
from time import clock
intRandom = random.randint(1, 100)
>>> print intRandom
64
E/S de Archivos
Python tiene un gran conjunto de librerías incluidas. Como ejemplo, así es como se usa la serialización (convertir estructuras de datos en cadenas usando la librería pickle) con E/S a archivos:
import pickle
lstLista = ["Esta", "es", 4, 13327]
# Abrir el archivo C:\binario.dat para escribir. La letra r antes del nombre del archivo es
# evitar el escape de la barra.
flArchivo = file(r"C:\binario.dat", "w")
pickle.dump(lstLista, flArchivo)
flArchivo.close()
flArchivo = file(r"C:\texto.txt", "w")
flArchivo.write("Esta es una cadena de ejemplo")
flArchivo.close()
flArchivo = file(r"C:\texto.txt")
>>> print flArchivo.read()
'Esta es una cadena de ejemplo'
flArchivo.close()
# Abrir el archivo para leer.
flArchivo = file(r"C:\binario.dat")
lstCargada = pickle.load(flArchivo)
flArchivo.close()
>>> print lstCargada
['Esta', 'es', 4, 13327]
Otros
- Puedes usar del para eliminar variables o elementos de una matriz.
- La comprensión de cadenas facilita una forma rápida de crear y manipular listas. Consiste en una expresión seguida de una clausula for seguida por cero o más clausulas if@ de esta forma:
lst1 = [1, 2, 3]
lst2 = [3, 4, 5]
>>> print [x * y for x in lst1 for y in lst2]
[3, 4, 5, 6, 8, 10, 9, 12, 15]
>>> print [x for x in lst1 if 4 > x > 1]
[2, 3]
del lst1[0]
>>> print lst1
[2, 3]
del lst1
- Las variables globales se declaran fuera de las funciones y pueden ser leídas sin ninguna declaración especial. Pero si quieres escribir en ellas tendrás que declararlas al principio de la función con la palabra clave global. Sino Python creará una variable local y le asignará el valor a ella. Hay que tener cuidado con esto porque puede dar lugar a errores muy difíciles de encontrar.
intNumero = 5
def fnMiFuncion():
# Esto mostrará 5
print intNumber
def fnOtra():
# Esto elevará una excepción porque la variable no ha sido asignada
# antes de mostrarse. En la segunda creará una nueva variable local
# y le asignará el número.
print intNumero
intNumero = 3
def fnOtraMas():
global intNumero
# Esta cambiará correctamente el número
intNumero = 3
Epílogo
Este tutorial no pretende ser una lista exhaustiva de todas (ni tan siquiera de una parte) de las posibilidades de Python. Python tiene una cantidad increíble de librerías y muchas más funcionalidades que puedes descubrir si te gusta el lenguaje o te hace falta. Puedes, por ejemplo leer este libro online Dive into Python. Espero que te haya sido útil y amena la lectura. Si crees que haría falta algo más o modificar cualquier cosa, coméntalo.
Versión original