jueves, 11 de abril de 2013

Tutorial funciones python 3 parte 2


Seguimos con los tutoriales de python,vamos a acabar con funciones para en otro tutorial comenzar con clases y objetos,pero de momento veremos:

Alcance de variables

Listas y diccionarios como funciones

args* and **kwargs

Alcance de variables

1.Las variables son valores a los que asignamos un valor o otro valor para referirnos a dicho valor y poder usarlas,como por ejemplo:

x = 10

Ahí x ya no es x ya es 10,si lo llamamos como texto crudo(si que este envuelto en comillas)

Estas variables pueden cambiar su valor en cualquier parte del script/programa pero tienen solo un limite de alcance por ejemplo las variables que definamos en una función se consideran locales y no las podemos modificar fuera de esta:

#!/usr/bin/env python3
def localv():
      x = 10

print (x)

En este ejemplo estamos llamando una variable local,que solo funciona en la funcion local,para el programa general es invisible,no podemos mutar su valor desde el script principal,podemos hacer practicas como estas:

#!/usr/bin/env python3
def localv():
      x = 10
      return x

x = localv()
print (x)

Lo que acabamos de hacer es usar la función como un solo valor de regreso,asignarlo a una variable  global y imprimirla,esto se puede hacer en ciertos casos,pero no es necesario ya que para usar solo un valor podemos definirlo directamente desde el script principal,osea las llamadas variables globales,que pueden ser vistas y modificadas en todo el script así como desde una función solo que en la función tenemos que indicar que es una variable global o sera tratada como local:

#!/usr/bin/env python3
def localv():
      x = 10
      return x
x = 5 # Variable global
print (x)
# Intentamos Cambiar el valor desde la funcion,solo con llamarla:
print (localv)
# Llamamos nuevamente la variable global
print (x) 

No pasa nada,sin embargo usamos la función de python global y podemos trabajar con variables globales desde python:

La sintaxis :

global variable

Ejemplo:

#!/usr/bin/env python3
def localv():
      global x
 # Le decimos a python que usaremos la variable global x
      x = 10
      return x

x = 5 # Variable global
 con valor de 5
print (x)
# Cambiamos el valor desde la funcion,solo con llamarla:
print (localv())
# Llamamos nuevamente la variable global
print (x)

Ahora si,x pasa al valor 10 que se le asigna desde la función local :D

Algo que se debe hacer que si no,usamos la variable global en la funcion,para modificar su valor,no debemos definirla,por ejemplo si queremos regresar x desde la funcion no necesitamos definir nada,ya que x ya esta definida en el script principal:

#!/usr/bin/env python3
def localv():
      return x
 # En ningun momento de la funcion definimos x

x = 5 # Variable global
print (x)
# Llamamos x con una funcion

print (localv())
# Llamamos nuevamente la variable global
print (x)

Las variables tambien las podemos definir desde el paso de parametros al cuerpo de la funcion,por ejemplo podemos definir una variable es esta manera dentro de una funcion:

def ejemplo():
      x = 10
      print (x)

O podemos hacerlo de esta manera:

def ejemplo(x):
      print (x)

ejemplo(10)

O de esta manera,la cual es la que menciono:

def manera(y,x = 10):
      print (x)

manera(1)

De esa manera podemos definir una variable,local para nuestra funcion desde el paso de argumentos,si definirla en el cuerpo del script global.


Listas y diccionarios como funciones

Las listas y los diccionarios se pueden usar para llamar funciones y al igual que una variable con return,no hay mucho que decir,sobre los diccionarios aqui un turial:

Enlace

Ahora podemos usar el retorno de una funcion como la llave de un diccionario y llamarla desde print


#!/usr/bin/env python3

def suma(y,x = 10):
    return y + x

diccionario = {
'entero' : 10,
'cadena' : "String",
'real' : 3.23,
'funcion' : suma(2)
}

print ("Mi funcion: %s " % (diccionario['funcion']))



"Muy facil" :D

Ahora a la inversa,usando un diccionario en una adentro de una funcion:

Al igual que las variables podemos definir diccionarios en nuestro paso de argumentos,o adentro de la funcion(en el cuerpo de la funcion), en este caso voy a definir un diccionario vació en el paso de argumentos y lo voy a llenar en el cuerpo de la funcion,usando como valor de nuestras llaves los argumentos que le pasaremos en el diccionario global,para obtener el mismo resultado a la de llamar la llave funcion de nuestro diccionario global:

#!/usr/bin/env python3

def suma(y,x = 10,diccionario = {}):
    diccionario['x'] = x
    diccionario['y'] = y
    return diccionario['y'] + diccionario['x']

diccionario = {
'entero' : 10,
'cadena' : "String",
'real' : 3.23,
'funcion' : suma(2)
}

print ("Mi funcion: %s " % (diccionario['funcion']))

El mismo resultado :D

Ahora igual con listas:

Podemos definir el valor de una lista,con el valor del retorno de una funcion y igual que en los diccionarios podemos definir una lista adentro de una funcion:


#!/usr/bin/env python3

def suma(y,x = 10):
    lista = [y,x]
 # Definimos una lista local
    return lista[0] + lista[1]
 # Regresamos los valores sumados

lista = [ suma(3),2 ]
 # Definimos una lista global con el primer valor como una funcion

print ("Mi funcion: %s " % (lista[0]))

args* and **kwargs

Hemos hablado del alcance de  las variables dentro de nuestro script,y lo hemos visto a la hora de definir nuestras variables,pero tambien debemos aprender a definirlas bien y desde donde,ya que vimos esto:

def ejemplo():
      x = 10
      print (x)

O podemos hacerlo de esta manera:

def ejemplo(x):
      print (x)

ejemplo(10)

O de esta manera:

def manera(y,x = 10):
      print (x)

manera(1)

Otra mas:

def manera(y,x = 10):
      print (x)

numero = 1 # Variable global

manera(numero) # Pasamos valor de variable global a la funcion

Tambien de esta manera que es la que digo ahora

def manera():
      print (x)

manera(x = 1) # Variable local definida en ambito global

Como podemos ver definimos una variable que usaremos desde la llamada de la funcion,esto es muy bueno,porque si lo hacemos como el penúltimo ejemplo mandaremos una variable global a local y podemos cambiar su valor en cualquier momento:

def manera(numero,x = 10):
      print (numero)

numero = 1 # Variable global

manera(numero) # Pasamos valor de variable global a la funcion

numero = 10 # Cambiamos el valor

manera(numero) # Ya no es el mismo valor

Pero si lo hacemos asi:

#!/usr/bin/env python3

def manera(numero,x = 10):
      print (numero)

numero = 1 # Variable global

manera(numero = 2) # Definimos variable local desde ambito global

numero = 10 # Cambiamos el valor

manera(numero = 2) # Ya no pasa nada

Lo malo de esto es que debemos definir el valor cada vez,pero lo bueno es que no dependemos de variables globales,como ven podemos definir variables locales de muchas maneras,y no les digo como se hace realmente,porque no existe una definicion real,si fuera asi no existirían tantas formas,solo que debemos usar la que mas nos convenga,por ejemplo si necesitamos pasarle el regreso de una funcion de un modulo a una funcion,podemos definirla en una variable global primero y despues mandarla a la funcion,asi:

#!/usr/bin/env python3

import os
import time

def whoami(login):
    print ("Tu usario es %s" % (login))

Usuario = os.getlogin()

whoami(Usuario)

Ya que no es necesario hacer esto:

#!/usr/bin/env python3

import os
import time
  
def whoami(Usuario):
    print ("Tu usario es %s" % (Usuario))

whoami(Usuario = os.getlogin()) # Esto 

También funciona pero es muy incomodo,por lo menos en este caso,asi que vean bien cual es la forma de definición que les conviene mas para realizar lo que quieran ralizar.

Bien,como vemos podemos definir muchas cosas desde la llamada de la funcion,pero que tal si queremos definir muchas o definimos muchas :O

Por ejemplo :

llamando_funcion(1,3,4,534,345,23,324,234,23423,4234,23)

En la funcion pondríamos algo como:

def llamando_funcion(a,b,c,d,f,g,h,i,j,k,z):

Para este ejemplo entra perfecto *args,con *args podemos meter todo eso en un solo valor,llamado args y de tipo tupla,las tuplas son como las listas,de hecho son iguales,solo con un cambio que radica en muchos y en mucho su uso,es inmutable :(,no podemos cambiar su valor y se definen con parentesis en vez de corchetes,pero bueno hagan de cuenta que esto:

llamando_funcion(1,3,4,534,345,23,324,234,23423,4234,23)

Es esto:

tupla = (1,3,4,534,345,23,324,234,23423,4234,23)

Al llamar esto en la funcion:

def llamando_funcion(*args):

Se ve mejor y mas limpio que esto:

llamando_funcion(1,3,4,534,345,23,324,234,23423,4234,23)

Esto es automatico,al usar *args como parametro en la funcion nos convierte todos los argumetos que declaramos en la llamada a una tupla de nombre *args,y al igual que las listas llamamos asi:

tupla[numero]

Comenzando por el cero, aquí un ejemplo:

#!/usr/bin/env python3

def ejemplo(*args):
    print (args[0] + args[6])

ejemplo(1,2,3,4,5,6,7,8,9,0)

Como ven es sencillo, también podemos usar variables,listas,diccionarios,etc:

#!/usr/bin/env python3

def ejemplo(*args):
    print (args[0] + args[6])

variable = 6
lista = [2,3,4,5,1]

ejemplo(lista[4],2,3,4,5,6,variable,8,9,0)



Pero si queremos hacer esto:

ejemplo(var1 = 1,var2 = 2,var3 = 4,muchasvar = muchas)

Para eso esta **kwargs,ya que como *args nos devuelve una tupla,adivinen que nos devuelve **kwargs,un diccionario :D,que usa:

var1 como llave

y

1 como valor

En ese ejemplo,o por ejemplo:

#!/usr/bin/env python3

def ejemplo(**kwargs):
    print (kwargs['var1'] + kwargs['var2'])
    print (kwargs['muchasvar'])

muchas = "Muchos argumentos"

ejemplo(var1 = 1,var2 = 2,var3 = 4,muchasvar = muchas)

El hecho es solo tratar kwargs como un simple diccionario,tambien hay una cosa importate y es que no es necesario usar el nombre args y kwargs,aqui lo importante es usar los asteriscos (*)


#!/usr/bin/env python3

def ejemplo(**x):
    print (x['var1'] + x['var2'])
    print (x['muchasvar'])

muchas = "Muchos argumentos"

ejemplo(var1 = 1,var2 = 2,var3 = 4,muchasvar = muchas)


Eso es todo, en otra ocasión hablaremos de funciones lambda.

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.