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