martes, 3 de marzo de 2009

FUNCIONES EN PYTHON

Bueno un funcion es una sencuencia de codigo definido por nosotros y que se ejecuta al hacer referencia a ella por un nombre que definimos, la sintaxis es la siguiente:


def nombre(lista de parametros):
sentencias

bueno aqui no es como en C o java que el contenido de una funcion lo determina { } aqui en python su creador Guido Van Rossum quiso que fuera determinado a traves de la sangria con un estandar de 4 espacios veamos para que me entiendan:

def numeros():
____print ("hola")
____print ("mundo")

def numeros():
____print ("hola")
print ("mundo")


como ven aparentemente este par de funciones hacen lo mismo pero hay una diferencia y es que en la primera al llamar la funcion numeros() imprimira hola y acontinuacion mundo ya que como se dan cuenta las dos estan perfectamente aliniadas con una sangria de 4 espacios apartir del nombre de la funcion, cuando rompoes esta sangria como es en el caso de la segunda funcion al llamar numeros() solo imprime hola, y el fin de esto es que Python quiere que escrbas codigo elegante, entendible que llegue otro programador y al ver el fuente de un compañero sea totalmente claro y no un nido de pajaros como muchos estan acostumbrados a programar.

En Python usted puede llamar las funciones como quiere excepto que utlize alguna palabra reservada algunas mencionadas en VARIABLES DE PYTHON


Nuestras funciones en python aceptan un sin nuemeros de argumentos , tambien podemos asignar valores por defecto a nuestros parametros, y a todas esta que diferencia hay entre argumentos y parametros??? bueno cuando hago llamado a una funcion:

numeros(2,7)

esos valores son los argumentos de la funcion y cuando hablo de parametros se refiere ya al valor recibido, osea es la variable que defini cuando cree la funcion para que reciba los argumentos:

def numeros(x,y): #las variable X y Y son los parametros de la funcion
____return x+y

otra cosa a tener en cuenta es saber que diferencia hay entre procedimiento y funcion ????

bueno un procedimiento es una funcion que no retorna ningun valor, y una funcion si retorna un valor, mencino esto porque en python no existen los procedimientos ya que si usted en una funcion no definen un valor a retonar Python por defecto retorna None asi que esto es de tener siempre en cuenta.

hasta ahora todo lo que hemos visto lo hemos practicado directamente desde consola. ahora en adelante ire colocando el fuente completo para que usted ejecuten su codigo y vayan acostumbrarse a realizar su codigo y sepa reutilizar las funciones de codigos hechos por usted.


este codigo lo guardan en un archivo que lo pueden llamar como quiera en este caso lo llamare suma.py

def suma(x,y):
______"""Esta funcion devuelve la suma de dos enteros"""
______return x+y


def main():

____print suma(5,6)


if __name__ == "__main__":main()


y ahora para ejecutarlo solo hacemos:

python suma.py en nuestra consola Linux o windows, tambien podemos bajar el IDE NetBeans
solo dedicado a python vamos a utilizar este ya que desde la misma pagina lo puedes bajar tanto para windows como para GNU-Linux.

Para los windowseros:

Bueno para los usuarios de windows solo lo descargan y doble-click y dan siguiente a todo :)


para los linuxeros:

Para poder ejecutar el archivo, abre una linea de comandos y en la carpeta donde está el archivo ingresa comando:

chmod +x netbeans-6.5-python-linux.sh

y despues podemos ejecutarlo:

./netbeans-6.5-python-linux.sh

Eso va a lanzar el instalador y desde ahi recordamos viejos tiempos con windows :)

bueno una vez instalado lo abrimos y esta es su ventana principal:



Damos File (archivo) y luego en New project (nuevo projecto) y se nos abra la siguiente ventana:


Negritadejamos la opcion por defecto Python project y damos next (siguiente) y definimos en nombre de projecto y en donde dice Create main file le cambiamos el nombre por el de nuestro programita
suma.py damos finish para volver a nuestra ventana principal:




Aqui damos doble click al nombre del proyecto que este caso lo llame estudio y luego en sources donde va estar nuestro primer programa:


Añadir imagen
Bueno esto no es un tutorial de Netbeans asi que busquen en google un buen tutorial para el manejo completo de esta Herramienta aqui esta el codigo fuente de suma.py en mi compu yo lo llame estudio.py veamos:

suma.py
---------

def suma(x,y):
"""Esta funcion devuelve la suma de dos enteros"""
return x+y


def main():
print suma(5,5)


if __name__ == "__main__":main()


Bueno continuamos viendo las funciones en python:

def hola(veces=1):
____print("hola" * veces)

esta funcion llamada hola contiene un parametro opcional ya que dicho parametro tiene un valor por defecto que es 1, al llamar la funcion podems hacer:

definimos la funcion:
>>>def hola(veces=1):
....____print("hola "* veces)

ahora llamamos la funcion:

>>>hola()
hola

como ven al tener un parametro opcional podemos llamar la funcion sin agumentos pero si queremos que me imprama dos veces el hola solo hay que colocar como argumento el numero de veces que queramos que nos imprima el hola veamos:

>>>hola(3)
hola hola hola


bueno python trae una forma de declar muchos argumentos por defecto a traves de una tupla
veamos:

def test(*tupla):
____for val in tupla:
____print(val)


Ahora si llamamos la funcion test() sin argumentos pues no va imprimir nada, pero si la llamamos con tres argumentos asi:

>>>test(1,2,3)
1
2
3

tambien podemos hacer que de vez de una tupla sea un diccionario, tan solo hay que hacer lo siguiente:

def test(**diccionario):
____for val in diccionario.items():
____print(val)

ahora hacemos el llamado de esta forma:

>>>test(primero = 1)
('primero', 1)

aqui primero va ser de key del diccionario y 1 va hacer de value, :) bueno en Python tambien puedo llamar una funcion dentro de otra funcion veamos:

>>>def uno():
______print("Hola mundo")

>>>def dos():
______uno()

>>>dos()
Hola mundo

Otro concepto de las funciones es cuando deciamos pasamos el argumento por valor o por referencia y algunos estaran diciendo y eso que ??
Bueno cuando nosotros pasavamos un valor por referencia lo que realmente pasamos a la funcion es la direccion de memoria donde esta almacenada en contenido de la variable y esto lo hacemos cuando queremos que todo los cambios que realize nuestra funcio a dicha variable permanescan fuera de la funcion, cuando paso un argumento por valor lo que realmente hacemos es llevarnos una copia del contenido de nuestra variable y todos los cambios que se realizen dentro de la funcion solo permanece alla dentro de la funcion ya que las variables dentro de la funcion son locales, veamos un ejemplo para captar la idea:

Bueno antes que nada hay que recordar que en Python todo es un objeto y que las listas son mutables los enteros y las tuplas inmutables ya que lo inmutable va atrabajar como paramatros por valor y lo mutable va ser paso por referencia:

>>>def f(x, y):
...____x = x + 3
...____y.append(2)
...____print x, y


>>>x=7
>>>y=[1]

llamemos la funcion y miremos que pasa:

>>>f(x,y)
10 [1, 2]

Bueno ese resultado es del print dentro de la funcion la variable x que vale 7 le sume 3 ahi se refleja en el resultado 10, y a la lista le agrague un nuevo valor que es el dos, estos valores son los de la funcion ahora hagmos un print para ver que pasa ???

>>> print (x , y)
7 [1, 2]

Como vemos fuera de la funcion el valor de la variables inmutables como la x se comporto como un paso por valor ya que dentro de la funcion tomo valor de 10 pero fuera de ella sigue valiendo 7, en cambio la lista que es mutable se comporto como un argumento por referencia ya que dentro de la funcion se le modifico añadiendo un nuevo elemento a la lista que fue el 2 y fuera de la funcion aun permanece igual :) que bonito es entender un poquito dale si quedas aun con alguna duda me la haces saber :=)

Como mencione antes en Python solo existen funciones, nada de procedimientos ya que toda funcion Python simpre retorna algo, cuando no definimos el return python retorna none ah no me crees :( pues probemos nada perdemos :) en la funcion anterior donde explique cuando para una funcion en Python en un parametro por valor y cuando es por referencia en dicha funcion no declare la el return el cual es una palabra reservada por python para retornar un valor de una funcion veamos:


esta era nuestra funcion:

>>>def f(x, y):
...____x = x + 3
...____y.append(2)
...____print x, y


ahora hagan esto:

>>>z=f( 2,[5])

ahora imprimamos la variable z haber que tiene:

>>>print(z)
None

hmm si ven veamos como utilizar el return:

>>>def sumar(x, y):
...______return x + y

>>>print sumar(3, 2)

5

asi de facil :) ahora que alguien me explique esto:

>>>def f(x, y):
...____return x * 2, y * 2

>>>a, b = f(1, 2)


Pues debe ser una trampa tuya verda??? como es que una funcion retorne dos valores imposible :( eso debe dar error, ejecutelo y te apuesto que python genera una excepcion, no ves que no ha generado nada verifica las variable a y b a=2 y b=4 , tonces como hace python??? bueno pues muy simple python sigue retornando solo un valor, lo que el hace internamente es crear una tupla con los valores de 2 y 4 y asi la funcion solo retorna una unica variable que es la tupla :)
Muy interesante, Python es una chimba :)

7 comentarios:

  1. realmente esta mut bien tu esplicacion , soy un novato y me ayudo tu informacion

    ResponderEliminar
  2. Muy buena información, gracias :3 !!

    ResponderEliminar
  3. Que tal, muchas gracias por el blog, tengo una duda, es posible hacer lo mismo que en C que se hace una llamada a las funciones pero estas estan al final del codigo?

    ResponderEliminar