| Despabilando la MonoNeurona::Internet es de todos [Inicio] [Regresar] |
|
GNU/Linux \ Python instantáneo Este artículo ha sido consultado en 596 ocasiones. por Magnus Lie Hetland Esto es un curso intensivo de introducción mínima al lenguaje de programación Python. Para obtener más información, echa un vistazo a ladocumentación del web de Python, http://www.python.org/, especialmente la tutoría. Si te preguntas por qué debería interesarte, mira la página de comparación, en la que aparece Python comparado con otros lenguajes. Esta introducción ha recibido gran cantidad de alabanzas de lectores satisfechos y está traducida a varios idiomas, entre ellos portugués , ruso, noruego y castellano. La versión original, en inglés, está aquí. 1. Lo básico x,y,z = 1,2,3
primero, segundo = segundo, primero
a = b = 123
Para definir bloques de código, se utiliza el sangrado (o indentación) solamente (nada de if x < 5 or (x > 10 and x < 20):
print "El valor es correcto."
if x < 5 or 10 < x < 20:
print "El valor es correcto."
for i in [1,2,3,4,5]:
print "Pasada nº ", i
x = 10
while x >= 0:
print "x todavía no es negativo."
x = x-1
Los dos primeros ejemplos son equivalentes. La variable de índice en el bucle # Mostrar los valores de 0 a 99 inclusive.
for valor in range(100):
print valor
(La línea que comienza por " Vale, ahora ya sabes suficiente para implementar cualquier algoritmo en Python. Vamos a añadir algo de interacción básica. Para obtener entrada del usuario, de un indicador de texto, utiliza
la función de serie x = input("Introduzca un número:")
print "El cuadrado de ese número es:", x*x
La función Nota: Si desea introducir una cadena con Así que tenemos cubiertas las estructuras de control, la entrada y la salida. Ahora necesitamos estructuras de datos impresionantes?. Las más importantes son las listas y los diccionarios. Las listas se escriben entre corchetes, y se pueden (por supuesto) anidar: nombre = ["Cleese", "John"]
x = [[1,2,3],[y,z],[[[]]]]
Una de las ventajas de las listas es que se puede acceder a sus elementos por separado o en grupos, mediante indexado y corte . El indexado se realiza (como en muchos otros lenguajes) añadiendo el índice entre corchetes a la lista (observa que el primer elemento es el 0). print nombre[1], nombre[0]
Muestra "John Cleese"
nombre[0] = "Palin"
El corte es casi como el indexado, pero se indican los índices
de inicio y fin del resultado, con dos puntos (" x = ["magro","magro","magro","magro","magro","huevos","and","magro"]
print x[5:7]
Muestra la lista ["huevos","and"]
Observa que el índice final no se incluye en el resultado. Si se omite uno de los índices se supone que se quiere obtener todo en la dirección correspondiente. Esto es, Ya que estamos en el tema del indexado, puedes encontrar interesante
que la función de serie Y ahora, ¿qué pasa con los diccionarios? Para ser breves, son como listas, pero su contenido no está ordenado. Y ¿cómo se indexan, entonces? Bueno, cada elemento tiene una clave o "nombre" que se utiliza para buscar el elemento, como en un diccionario de verdad. Un par de diccionarios de ejemplo: { "Alicia" : 23452532, "Boris" : 252336, "Clara" : 2352525 }
persona = { 'nombre': "Robin", 'apellido': "Hood",
'trabajo u ocupación': "Ladrón" }
Ahora, para obtener la ocupación de persona['apellido'] = "de Locksley" Simple, ¿no? Como las listas, los diccionarios pueden contener otros diccionarios. O listas, ya que nos ponemos. Y naturalmente, también las listas pueden contener diccionarios. De este modo, se pueden conseguir estructuras de datos bastante avanzadas. 2. Funciones def cuadrado(x):
return x*x
print cuadrado(2)
Muestra 4
Para los que lo entendáis: Todos los parámetros en Python
se pasan por referencia (como, por ejemplo, en Java). Para los
que no, no os preocupéis Python tiene todo tipo de lujos, como argumentos con nombre y argumentos por omisión y puede manejar un número variable de argumentos para una función. Para obtener más información, consulta la sección 4.7 de la tutoría de Python. Si sabe utilizar las funciones en general, esto es lo que necesita
saber sobre ellas en Python, básicamente (ah, sí, la palabra
clave Algo que podría resultar interesante conocer, sin embargo,
es que las funciones son valores en Python. Así que,
si tiene una función como cosa = cuadrado
cosa(2)
Muestra 4
Para llamar a una función sin argumentos debes recordar escribir
3. Objetos y cosas... class Cesta:
# Recuerde siempre el argumento self
def __init__(self,contenido=None):
self.contenido = contenido or []
def añadir(self,elemento):
self.contenido.append(elemento)
def muestra_me(self):
resultado = ""
for elemento in self.contenido:
resultado = resultado + " " + `elemento`
print "Contiene:"+resultado
Cosas nuevas:
Ningún método o variable miembro es protegido (ni privado, ni nada de eso) en Python. La encapsulación es, en su mayoría, cuestión de estilo al programar. Retomando el tema de la lógica de cortocircuito... Todos los valores de Python se pueden utilizar como valores lógicos.
Algunos, los más "vacíos", como Las expresiones lógicas como Este mecanismo hace que if a:
print a
else:
print b
Se puede sustituir por: print a or b De hecho, esto es casi un 'deje' en Python, así que mejor irse
acostumbrando. Esto es lo que hacemos en el método if contenido:
self.contenido = contenido
else:
self.contenido = []
Por supuesto, ahora conocemos un método mejor, Y, ¿por
qué no le damos el valor por omisión Otro modo de hacer lo anterior es: def __init__(self, contenido=[]):
self.contenido = contenido[:]
¿Adivinas cómo funciona esto? En lugar de utilizar la
misma lista vacía siempre, utilizamos la expresión Así que, para hacer realmente una b = Cesta(['manzana','naranja'])
b.añadir("limón")
b.muestra_me()
Hay más métodos mágicos además de def __str__(self):
resultado = ""
for elemento in self.contenido:
resultado = resultado + " " + `elemento`
return "Contiene:"+resultado
Y, si quisiéramos mostrar la cesta print b chulo, ¿eh? La herencia se realiza de este modo: class CestaMagro(Cesta):
# ...
Python permite la herencia múltiple, así que puede indicar
varias super-clases entre los paréntesis, separadas por comas.
Las clases se instancian así: Si necesitase llamar al constructor de una super-clase desde el constructor
H de Para obtener más información sobre las maravillas de la programación orientada a objetos en Python, mire la sección 9 de la tutoría. 4. Truco mental Jedi ¿Te gustan los ejercicios mentales? Si es así, si eres realmente osado, deberías echarle un vistazo al ensayo de Guido van Rossum sobre metaclases . Si, por el contrario, prefieres que el cerebro no te explote, igual te satisface este truquito. Python utiliza espacios de nombres dinámicos (no léxicos). Esto quiere decir que si tienes una función como ésta: def zumo_naranja():
return x*2
... donde una variable (en este caso x = 3
zumo_naranja()
Devuelve 6
x=1
zumo_naranja()
Devuelve 2
Normalmente, éste es el comportamiento deseado (aunque el ejemplo es un poco rebuscado, pues es raro acceder a las variables de este modo). Sin embargo, a veces puede ser útil tener un espacio de nombres estático, es decir, guardar algún valor del entorno en que se crea la función. El modo de hacer esto en Python es por medio de los argumentos por omisión. x = 4
def zumo_manzana(x=x):
return x*2
Aquí, al argumento x = 3
zumo_manzana():
Devuelve 8
x = 1
zumo_manzana():
Devuelve 8
Concluyendo: El valor de def zumo_tomate():
x = 4
return x*2
incluso: def zumo_zanahoria():
return 8
Sin embargo, lo importante es que el valor de Queremos una función que funcione así: from math import sin, cos
sincos = componer(sin,cos)
x = sincos(3)
Donde Observa que estamos utilizando funciones como argumentos y eso ya es un truco en sí mismo. Obviamente, def componer(fun1, fun2):
def interior(x):
# ...
return interior
Nos tentaría poner from math import sin, cos
def fun1(x):
return x + " mundo"
def fun2(x):
return "Hola,"
sincos = componer(sin,cos) # Versión incorrecta
x = sincos(3)
Y bien, ¿qué valor tendría def componer(fun1, fun2):
def interior(x, fun1=fun1, fun2=fun2):
return fun1(fun2(x))
return interior
Ahora sólo nos queda esperar que nadie proporcione a la función
resultante más de un argumento, ya que eso nos rompería
los esquemas def componer(f1, f2):
return lambda x, f1=f1, f2=f2: f1(f2(x))
Espartano, pero claro. Te tiene que gustar ...y si no ha entendido nada, no se preocupe. Al menos le ha convencido
de que Python es más que "un lenguajillo para scripts"... 5. Y ahora... import string
x = string.split(y)
o... from string import split
x = split(y)
Para obtener más información sobre la biblioteca de módulos estándar, echa un vistazo a www.python.org/doc/lib. Contiene un montón de cosas útiles. Todo el código del módulo/script se ejecuta cuando se importa. Si quiere que su programa sea tanto un módulo importable como un script ejecutable, puede añadir algo así al final: if __nombre__ == "__main__": ejecutar() Es un modo mágico de decir que si el módulo se ejecuta como un script ejecutable (es decir, que no esta siendo importado por otro script o módulo), se debe ejecutar la función Y, si desea hacer un script ejecutable en UN*X, escriba esto como primera línea para hacer que el script se ejecute sin llamar a python explícitamente: #!/usr/bin/env python Finalmente, una breve mención a un concepto importante: Las excepciones. Algunas operaciones (como dividir por cero o leer de un archivo inexistente) causan una condición de error o excepción. Puede incluso generar las suyas propias y lanzarlas en los momentos adecuados. Si no se hace nada con la excepción, el programa termina y muestra un mensaje de error. Esto se puede evitar con una construcción def dividirSeguro(a,b):
try:
return a/b
except ZeroDivisionError:
return None
try:
dividirInseguro(a,b)
except ZeroDivisionError:
print "Se ha intentado dividir por cero en dividirInseguro"
En casos en los que normalmente no debería haber problemas concretos, pero podrían ocurrir, la utilización de excepciones permite evitar tediosas comprobaciones. Bueno, eso es todo. Espero que aprendieras algo. Ahora, a jugar. Y recuerde el lema de Python para aprender: "Que las fuentes te acompañen" (léase: Leer todo el código al que se le pueda echar las manos encima). Merece la pena resaltar una cosa sobre el ejemplo. La variable while not done:
while not done:
# Se repite hasta un 'break'
while not done:
# Sólo se ejecuta si el primero no puso "done" a 1
Una versión equivalente, posiblemente más clara, pero en mi opinión menos elegante, sería: while not done:
while 1:
# Se repite hasta un 'break'
if not done:
while 1:
# Sólo se ejecuta si el primero no puso "done" a 1
La única razón por la que he utilizado la variable Se pueden encontrar más ejemplos en la página
tidbit de Joe Strout.
Sobre el autor de este minitutorial Copyright © Magnus Lie Hetland (mlh@idi.ntnu.no) Traducción de Marcos Sánchez Provencio Corrección de Sonia Rubio Hernando Última actualización: 2007-04-29 10:57:00-05 |
| Este trabajo está licenciado bajo la MonoNeurona Commons License. 2002-2008 © :: Colectivo MonoNeurona.org :: |