Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] RanaRama

Estas en el tema de RanaRama en el foro de Python en Foros del Web. Buenas, es mi primer dia en este foro que creo que me puede ser muy util y yo tambien puedo serlo para otras personas ;) ...
  #1 (permalink)  
Antiguo 25/01/2013, 14:51
 
Fecha de Ingreso: enero-2013
Mensajes: 5
Antigüedad: 11 años, 3 meses
Puntos: 0
RanaRama

Buenas, es mi primer dia en este foro que creo que me puede ser muy util y yo tambien puedo serlo para otras personas ;)

Les comento, tengo que hacer una practica para la universidad en python, se trata del juego del ranaRama, es decir metes una palabra, la desordenas tienes 2 barras verticales que puedes desplazar siempre hacia derecha oz izquierda tienes una tercera tecla de permutar entre si los dos elementos que estan entre las barras.

pues bien despues de muchas horas pensando XDDD (no se si es que soy lento ;)
tengo una duda y me gustaria saber si alguien me la podria solventar.


me Explico un poco en breves imaginemos que tengo este codigo


Código PHP:
import random


def inicializar
():
  

     
pJugador=list(input("introduce la palabra con la que desea jugar:  "))
     if(
len(pJugador)>2):
        
pJugador=pJugador
     
if(len(pJugador)<=2):
          print(
'La palabra introducida por el jugador es demasiado corta, para poder jugar')
          print(
'necesita una palabra de mas de 2 caracteres')
     while(
len(pJugador)<=2):
        
pJugador=list(input("introduce la palabra con la que desea jugar:  "))
     return 
pJugador
    
    
    
   
def desordenar
(list):
        
pDesordenada=list
        
random.shuffle(pDesordenada)
        return 
pDesordenada



def ranaRama_main
():
inicializar()
desordenar(pJugador

esto es parte del codigo, mi duda es.... por que cuando va a inicializar la funcion main(ranaRama()) cuando va a ejecutar "desordenar" siempre me dice que pJugador(lista) no esta declarada .... he intentado poniendola como variable global y no se si es por que no lo domino bien.. o no se, he probado en hacer un getters como en java y meterlo buscando dentro de la funcion y tampoco, y ya no se que hacer XDDD

Alguien puede iluminarme??? me haria el hombre mas feliz del mundo XD ya que soy una persona que no para hasta que resuelve algo y ya son 12 horas pensando XD

Muchas gracias, un saludo.


pd:aqui estamos para lo que necesiteis
  #2 (permalink)  
Antiguo 25/01/2013, 17:15
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: RanaRama

Lo que pasa es que en efecto nunca declaras la variable pJugador y esto es por que "capturas" lo que retorna inicializar()
  #3 (permalink)  
Antiguo 26/01/2013, 01:49
 
Fecha de Ingreso: enero-2013
Mensajes: 5
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: RanaRama

ummm entiendo, pero en una de las pruebas que hice lo puse como variable global vacia al principio, antes de las dos cabeceras y luego la modificaba en la primera funciion y con la segunda recogia lo que me tiraba la primera y asi siempre me la dejaba vacia, nunca me la tomaba con los cambios introducidos en def1
  #4 (permalink)  
Antiguo 27/01/2013, 04:25
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: RanaRama

Cita:
Iniciado por maykkk Ver Mensaje
ummm entiendo, pero en una de las pruebas que hice lo puse como variable global vacia al principio, antes de las dos cabeceras y luego la modificaba en la primera funciion y con la segunda recogia lo que me tiraba la primera y asi siempre me la dejaba vacia, nunca me la tomaba con los cambios introducidos en def1
Yo también tengo lío con las declaraciones de variables globales.

En tu ejemplo la declaración no debería ir en???

import random


def inicializar():

glogal pJugador
pJugador=list(input("introduce la palabra con la que desea jugar: "))
  #5 (permalink)  
Antiguo 27/01/2013, 07:34
 
Fecha de Ingreso: enero-2013
Mensajes: 5
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: RanaRama

De la manera que me dices de declarar global pJugador en la primera funcion me pasa lo que ya puse anteriormente, que cuando la segunda funcion toma lo que le tira la priemera, es siempre una lista vacia, no contiene los datos introducidos en la funcion 1.



La verdad es que estoy un poco perdido XDDDD
  #6 (permalink)  
Antiguo 27/01/2013, 19:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: RanaRama

maykkk como te dije antes solo tienes que capturar o almacenar el valor de retorno de tu función.


Código Python:
Ver original
  1. import random
  2.  
  3.  
  4. def inicializar():
  5.    
  6.  
  7.      pJugador=list(input("introduce la palabra con la que desea jugar:  "))
  8.      if(len(pJugador)>2):
  9.         pJugador=pJugador
  10.      if(len(pJugador)<=2):
  11.           print('La palabra introducida por el jugador es demasiado corta, para poder jugar')
  12.           print('necesita una palabra de mas de 2 caracteres')
  13.      while(len(pJugador)<=2):
  14.         pJugador=list(input("introduce la palabra con la que desea jugar:  "))
  15.      return pJugador
  16.      
  17.      
  18.      
  19.    
  20. def desordenar(list):
  21.         pDesordenada=list
  22.         random.shuffle(pDesordenada)
  23.         return pDesordenada
  24.  
  25.  
  26.  
  27. def ranaRama_main():
  28.     pJugador = inicializar()
  29.     desordenar(pJugador)  
  30.  
  31. ranaRama_main()

Esto corre perfectamente.
  #7 (permalink)  
Antiguo 27/01/2013, 19:57
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: RanaRama

Si quieren aprender de variables globales pueden ver la nueva FAQ
http://www.forosdelweb.com/f130/faqs...ml#post4356803
  #8 (permalink)  
Antiguo 28/01/2013, 17:20
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: RanaRama

Cita:
Iniciado por razpeitia Ver Mensaje
Si quieren aprender de variables globales pueden ver la nueva FAQ
http://www.forosdelweb.com/f130/faqs...ml#post4356803
Gracias por el enlace y por la solución!

def ranaRama_main():
pJugador = inicializar()

no sabía que se inicializaba la variable tomando la salida de la otra función que en este caso tiene el mismo nombre.

Desde mi punto de vista entonces la variable que está dentro de la función es local, y la que toma el valor afuera es la global, pero no es necesario definirla como tal.

Espero haber entendido bien el concepto.
  #9 (permalink)  
Antiguo 28/01/2013, 22:49
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: RanaRama

Cita:
Iniciado por tecafede Ver Mensaje
Gracias por el enlace y por la solución!

def ranaRama_main():
pJugador = inicializar()

no sabía que se inicializaba la variable tomando la salida de la otra función que en este caso tiene el mismo nombre.
No, en este caso pJugador es una variable local.

Cita:
Iniciado por tecafede Ver Mensaje
Desde mi punto de vista entonces la variable que está dentro de la función es local
Si, así es.

Cita:
Iniciado por tecafede Ver Mensaje
y la que toma el valor afuera es la global
Exacto!

Cita:
Iniciado por tecafede Ver Mensaje
pero no es necesario definirla como tal.
Solo me queda agregar que solamente es necesario definirla como tal dentro de la función, si vas a asignarle un nuevo valor. De todas formas, es mejor que expreses explicitamente que esa variable es global usando globals.

Y por ultimo, no usen variables globales, aparte que el código se vuelve mas difícil de leer, las variables globales hacen que los componente de un programa estén atados, pueden sufrir problemas de concurrencia y generalmente el uso de variables globales es propensa a errores. Ademas es considerado como una mala practica.
  #10 (permalink)  
Antiguo 29/01/2013, 02:17
 
Fecha de Ingreso: enero-2013
Mensajes: 5
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: RanaRama

Muchas gracias por la web razpeitia, me a aclarado bastante el tema de las variables globales ;), y tienes razon no declarere en la funcion tres la llamada a la variable. Muchas gracias por todo¡¡¡ ;)
  #11 (permalink)  
Antiguo 29/01/2013, 04:27
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: RanaRama

Cita:
Iniciado por razpeitia Ver Mensaje

Solo me queda agregar que solamente es necesario definirla como tal dentro de la función, si vas a asignarle un nuevo valor. De todas formas, es mejor que expreses explicitamente que esa variable es global usando globals.

Y por ultimo, no usen variables globales, aparte que el código se vuelve mas difícil de leer, las variables globales hacen que los componente de un programa estén atados, pueden sufrir problemas de concurrencia y generalmente el uso de variables globales es propensa a errores. Ademas es considerado como una mala practica.
10 puntos como siempre! muchas gracias

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:00.