funciones

Marcos Sánchez Provencio rapto en arrakis.es
Jue Oct 28 21:08:24 CEST 2004


Hay otra manera de tratar que te pueda venir uno o varios valores, que
es utilizar los argumentos variables. Además, podemos usar "list
comprehension", listas autodefinidas:

def myfunc( prost, *values): #values será una tupla siempre
  states=[]
  for p in prost:
    if p['AgeRecode<1'] in values:
      states.append(p['State-county recode'] )

  return states

#Versión alternativa con listas autodefinidas
def myfunc( prost, *values):
  return [p['State-county recode' 
    for p in prost 
    if p['AgeRecode<1'] in values] 

def myfunc2( caseage, pos, codes):
  count=[0] * len(codes)

  for p,c in zip(pos,codes):
    count[p]=caseage.count(c)
  return count


caseage04.extend( myfunc( prost, '00', '01') ) #Más simple
variables.append( myfunc2( caseage1, pos, codes ) )

caseage02.extend( myfunc( prost, '02' ) )
variables.append( myfunc2( caseage2, pos, codes ) )

caseage03.extend( myfunc( prost, '03' ) )
variables.append( myfunc2( caseage3, pos, codes ) )

El jue, 28-10-2004 a las 11:48, Chema Cortés escribió:
> On Wednesday 27 October 2004 23:13, Nan loz wrote:
> > Hola de nuevo a todos. Tengo una pregunta en la que de
> > pronto alguien me puede ayudar. Tengo el siguiente
> > codigo en el que hago la misma cosa varias veces y
> > siguiendo las sugerencias que he visto en los mensajes
> > quiero convertirlo en funcion, pero no se si puedo
> > hacerlo ya que mi condicion dentro del if esta
> > cambiando tambien... cualquier sugerencia sobre como
> > hacer esto de forma mas "elegante" es bien recibida.
> > Mil gracias de antemano
> 
> Voy a completar la respuesta que te ha dado Josu:
> 
> Estás viendo que hay un patrón que se repite y quieres que acabara siendo una 
> función. Supongamos que la función que queremos crear se llamará "myfunc". 
> Aquí van algunos consejos:
> 
> 
> - Comprobación de condiciones:
> 
> > 	if (prost[i]['AgeRecode<1']=='00' or
> > prost[i]['AgeRecode<1']=='01'):
> 
> > 	if (prost[i]['AgeRecode<1']=='02'):
> 
> > 	if (prost[i]['AgeRecode<1']=='03'):
> 
> Al tener número variable, una posibilidad sería pasar a la función una 
> secuencia para chequear. 
> 
>   def myfunc( values,...
>     ...
>        for p in prost:
>          if p['AgeRecode<1'] in values:
>             ...
> 
> Tiene el incoveniente de que para un sólo valor habría que pasar una 
> monotupla:
> 
>   myfunc( ('02',) , ....
> 
> Queda más elegante con una pequeña validación al inicio de la función que nos 
> simplifique la llamada:
> 
>   def myfunc( values,...
>      if not isinstance(values, (list,tuple) ):
>         values=(values,) #convertir un valor simple en tupla
>      ...
>      for p in prost:
>          if p['AgeRecode<1'] in values:
> 
> 
> Se podría así llamar de dos formas distintas:
> 
>   myfunc( ('00','01'), ...
> 
>   myfunc( '02', ...
> 
> 
> 
> - Devolución de resultados:
> 
> El principio a seguir es intentar desacoplar lo más posible el código de la 
> función del código desde donde se llama. Por tanto no hay que utilizar 
> variables globales ni permitir que la función modifique directamente objetos 
> que estén fuera de su alcance.
> 
> Siguiendo éste principio, las secuencias "caseage" y "count" no se deberían 
> pasar a la función. La función, en lugar de añadir directamente los elementos 
> a estas secuencias, debe retornar los elementos para que el codigo llamante 
> los añada (si quiere) a las secuencias adecuadas.
> 
> Si fuera necesario devolver varios resultados, se puede hacer como una tupla.
> 
> 
> 
> Poniendo todo ésto en práctica, con parte del código de Josu, la cosa quedaría 
> algo así:
> 
> 
> def myfunc( prost, values):
> 
>   if not isinstance(values, (list,tuple) ):
>     values=(values,) #convertir un valor simple en tupla
> 
>   states=[]
>   for p in prost:
>     if p['AgeRecode<1'] in values:
>       states.append(p['State-county recode'] )
> 
>   return states
> 
> def myfunc2( caseage, pos, codes):
>   count=[0]*(len(codes))
>   for p,c in zip(pos,codes):
>     count[p]=caseage.count(c)
>   return count
> 
> caseage04.extend( myfunc( prost, ('00','01') ) )
> variables.append( myfunc2( caseage1, pos, codes ) )
> 
> caseage02.extend( myfunc( prost, '02' ) )
> variables.append( myfunc2( caseage2, pos, codes ) )
> 
> caseage03.extend( myfunc( prost, '03' ) )
> variables.append( myfunc2( caseage3, pos, codes ) )
> 
> 
> 
> He intentado ser fiel al código que había en el mensaje. 
> 
> ______________________________________________________________________
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es

------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es