Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Yidu en 28 Marzo 2013, 18:42 pm



Título: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 28 Marzo 2013, 18:42 pm
Hola de nuevo  :D

Me estoy liando un poco con el tema de los menús de opciones en Python. Querría saber cual es la forma correcta de hacerlos. Es decir, para crear el típico ejemplo de una calculadora.

Por lo que he podido de ver, de los ejemplos que están por la red, la mayoría recomiendan usar funciones. Osea, que la primera función sea (por ejemplo) menu(). Y dentro de esta función, todas las opciones. Luego, dependiendo la opción que escojamos, nos mande a otra función...sumar(), restar(),etc...

Otros programadores, usan muchos if y repiten en cada opción, los raw_input dentro de cada función. Yo esto, no lo encuentro muy correcto.

Me gustaría ver si alguien puede postear la forma correcta de hacerlo. Pero sin recurrir a la POO. Ya que todavía no he llegado a eso.... :-\

Quiero aprender como es la mejor manera de hacer un menú. Entiendo que hay muchas maneras de hacerlo. Y quiero evitar recurrir a muchos if, elif, else, raw_inputs, ...

...Un saludo!


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: daryo en 28 Marzo 2013, 18:55 pm
no hay una unica forma correcta de hacerlo. Si no fuera asi la programacion seria muy aburrida no? XD

para mi la mejor calculadora es esta
 ;D

Código
  1. n=input("escriba su operacion matematica a realizar>")
  2. print n
  3.  


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 28 Marzo 2013, 19:01 pm
no hay una unica forma correcta de hacerlo. Si no fuera asi la programacion seria muy aburrida no? XD


Ya, eso lo entiendo. Pero supongo, que cuantos menos código, mejor. Y claro, he visto ejemplos de como hacer una calculadora con whiles y un monton de raw_input. En cambio, otros optan por usar funciones. En este último caso, veo el código mas ordenado y comprensible. Eso sin contar que es mas fácil volver a llamar bloques de código llamando a esas funciones de nuevo.

Pienso, que abusando de los ciclos, esta uno mas atado al código.


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 28 Marzo 2013, 19:05 pm

para mi la mejor calculadora es esta
 ;D

Código
  1. n=input("escriba su operacion matematica a realizar>")
  2. print n
  3.  


También está la opción de comprar una calculadora en los chinos y no teclear una línea de código  ;D

A ver si alguien se anima y postea un ejemplo mas ilustrativo. A lo que me refiero es no ir tecleando en cada opción líneas de código parecido. No tiene por que ser una calculadora expresamente, eh...

En este enlace http://foro.elhacker.net/scripting/python_menu_con_while-t307856.15.html se recurre a los while. Yo pregunto como hacerlo con funciones.


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: daryo en 28 Marzo 2013, 19:22 pm
Código
  1. def suma(a,b):
  2.    return a+b
  3. def resta(a,b):
  4.    return a-b
  5. def multiplicar(a,b):
  6.    return a*b
  7. def dividir(a,b):
  8.    return a/b
  9.  
  10. while True:
  11.    print """
  12. teclee:
  13.  
  14. 1 para sumar
  15. 2 para restar
  16. 3 para multiplicqar
  17. 4 para dividir
  18. """
  19.    opcion=input(">")
  20.    a=input("digite el primer numero:")
  21.    b=input("digite el primer numero:")
  22.    if opcion == 1:
  23.        print suma(a,b)
  24.    elif opcion == 2:
  25.        print resta(a,b)
  26.  
  27.    elif opcion == 3:
  28.        print multiplicar(a,b)
  29.  
  30.    elif opcion == 4:
  31.        print dividir(a,b)
  32.  
  33.    else:
  34.        print "opcion incorrecta"
  35.  


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 28 Marzo 2013, 19:32 pm
¡Muchas gracias daryo!. A esto me refería. Es que he visto ejemplos que abusan de los whiles y repetición constante de los inputs. Supongo que luego se puede definir el menu como una función. Y así, si estamos en otra parte del programa, poder llamarlo de nuevo. Cosa mas complicada si es un while ¿No?

Voy a practicar e iré posteando mis avances. Un saludo!


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: daryo en 28 Marzo 2013, 19:36 pm
¡Muchas gracias daryo!. A esto me refería. Es que he visto ejemplos que abusan de los whiles y repetición constante de los inputs. Supongo que luego se puede definir el menu como una función. Y así, si estamos en otra parte del programa, poder llamarlo de nuevo. Cosa mas complicada si es un while ¿No?

Voy a practicar e iré posteando mis avances. Un saludo!

por nada jeje

claro el menu puede ser una funcion y llamarlo luego :)



Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: 0x5d en 29 Marzo 2013, 01:49 am
Hola, muy buenos días.

Veo que ya te respondieron, sin embargo me gustaría poder exponer mi respuesta.

No necesariamente debemos crear una función con el menú de la aplicación a crear, pues eso podría ir dentro de un bucle "Infinito" (o mientras sea True), mediante el popular while. Posteriormente realizar un despliegue de las opciones que el usuario poseerá a lo largo de la utilización del programa (mediante print). Luego deberías pedir que el usuario ingrese una opción , ya sea mediante input() (numérico) o raw_input(). Todo depende si las opciones que despliegues son del tipo 1.- , 2.- , etc. Ó si son a) , b) , etc.

Ya teniendo eso tienes que hacer una comprobación de las opciones ingresadas y luego según la que escoja el usuario, llamas a la función (sumar, restar, multiplicar, dividir, etc) y por parámetros le pasas los números a procesar...

Esa sería una forma, la cuál no me gusta, ya que limitas a que el usuario simplemente maneje 2 números. Por eso prefiero esta calculadora:
Código
  1. print eval(raw_input("Operacion: ")
  2.  

Espero haber podido aclarar algunas dudas.

Saludos, Javier.


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 29 Marzo 2013, 11:20 am


No necesariamente debemos crear una función con el menú de la aplicación a crear,

Ya...lo que pasa, es que estoy aprendiendo el uso de funciones. Y claro, estoy haciendo pruebas simples y tal. Supongo que una calculadora (como dijeron por aquí) se puede hacer de mil formas. Pero claro, busco no repetir el código en cada opción que pulsemos. Por eso, mi énfasis en uso de funciones. Y mas, que es lo que recomiendan en todos los libros que voy leyendo de Python.

Pero me he quedao estancado. Estoy haciendo este código...y cuando le doy a la opción 1 [sumar], me pide los dos números correctamente. Pero la suma no la hace. Me da error. El código no está acabado. Pero con solo probar la suma, no funciona.

Código
  1. def escojo ():
  2.    num1 = int (raw_input ('> Dime el primer numero: '))
  3.    num2 = int (raw_input ('> Dime el segundo numero: '))
  4.    return num1,num2
  5.  
  6. def suma (a,b):
  7.    return a + b
  8. def opcion():
  9.  
  10.    opc = int(raw_input ('Escoge una opcion "q" salir'))
  11.    if opc == 1:
  12.        escojo()
  13.        print suma (num1,num2)
  14.  
  15. def menu():
  16.    print '''Menu\n
  17.    1. Suma
  18.    2. Resta
  19.    3. Multiplicacion
  20.    4. Division
  21.    Q. Salir'''
  22. while 1:
  23. menu()
  24. opcion()
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: 0x5d en 30 Marzo 2013, 01:56 am
Pues es porque las variables num1 y num2 que pides los datos no son accesibles desde otro def, pues no son globales... Y usa input() no int(raw_input())

Creo que no leíste nada de lo que escribí más arriba u_u

Saludos, Javier.


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 30 Marzo 2013, 11:13 am
Pues es porque las variables num1 y num2 que pides los datos no son accesibles desde otro def, pues no son globales... Y usa input() no int(raw_input())

Creo que no leíste nada de lo que escribí más arriba u_u

Saludos, Javier.

Si que he leído lo que has escrito. Pero es normal que tenga dudas. En todo caso, siempre recomiendan usar los menos posible el input. Yo utilizo la versión 2.7.3. Dicen, que usando el input se puede liar un follón. Osea, código malicioso y tal. Yo intento aprender con lo que leo en los manuales o tutoriales.

Un saludo!


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: daryo en 30 Marzo 2013, 16:39 pm
corregido :
si te fijas solo cambie dos lineas de codigo del programa asi que vas por buen camino
si no entiendes lee algo sobre listas  ;D

el return no les da nombre el a las variables num1 y num2 eso es algo que uno se lo da luego

siempre que retornes un valor de una funcion guardalo en una variable (o lista que es un conjunto de variables)
Código
  1. def cinconum():
  2. return 5
  3.  
  4. cinco=cinconum()
  5.  

claro esto a menos que quieras imprimir directamente la funcion

Código
  1. def cinconum():
  2. return 5
  3.  
  4. print cinconum()
  5.  

Código
  1. def escojo ():
  2.    num1 = int (raw_input ('> Dime el primer numero: '))
  3.    num2 = int (raw_input ('> Dime el segundo numero: '))
  4.    return num1,num2
  5.  
  6. def suma (a,b):
  7.    return a + b
  8. def opcion():
  9.    opc = int(raw_input ('Escoge una opcion "q" salir'))
  10.    if opc == 1:
  11.        numeros=escojo()
  12.        print suma(numeros[0],numeros[1])
  13.  
  14. def menu():
  15.    print '''Menu\n
  16.    1. Suma
  17.    2. Resta
  18.    3. Multiplicacion
  19.    4. Division
  20.    Q. Salir'''
  21. while 1:
  22. menu()
  23. opcion()
  24.  
  25.  
  26.  
PD:no te preocupes por la seguridad del code hasta mas adelante diria yo... ademas de eso piensa en input y raw_input como funciones...


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 30 Marzo 2013, 19:19 pm
Muchas gracias daryo. Como se nota que para ti es coser y cantar. Pero al principio, esto de las funciones, se me atraganta un poco. Como bien recomienda todo el mundo...practicar y practicar. Ya veremos cuando llegue a la POO   :silbar:

Me estudiaré bien tu modificación al código que posteé. Es mas o menos lo que quería hacer. Me ha gustado el tema de incluir dentro de la función [suma] los indices a que hacen referencia la variable [numeros]. Es decir, la variable se transforma en parámetro.

Cuando tenga la calculadora pondré en este post. Un saludo!

EDITO:

Código
  1. def escojo ():
  2.    num1 = int (raw_input ('> Dime el primer numero: '))
  3.    num2 = int (raw_input ('> Dime el segundo numero: '))
  4.    return num1,num2

Ah...! , ya lo entiendo.

Cuando ejecutamos la función escojo(), esta, nos devuelve una tupla. Es por este motivo que podemos recurrir a sus indices ¡Muy bueno! Supongo que esto luego se puede modificar. Es decir, que esta tupla que nos devuelve el return se puede convertir en objeto list o lo que se nos ocurra.


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: Yidu en 31 Marzo 2013, 20:48 pm
Pues ahora me ha surgido una duda. Es decir, que le veo lagunas al tema de las funciones dentro del bucle while.

Como dentro del while está la función opcion(), no me deja salir de ella. Osea, si escojo la opción Q del menu (que es salir), se me repite el bucle. Por lo tanto, hay algo que se me escapa...


Título: Re: [PYTHON] Menu opciones ¿Con funciones es lo correcto?
Publicado por: 0x5d en 3 Abril 2013, 02:56 am
Si que he leído lo que has escrito. Pero es normal que tenga dudas. En todo caso, siempre recomiendan usar los menos posible el input. Yo utilizo la versión 2.7.3. Dicen, que usando el input se puede liar un follón. Osea, código malicioso y tal. Yo intento aprender con lo que leo en los manuales o tutoriales.

Un saludo!
Usar input() es más limpio que utilizar int(raw_input()) y es igual que usar input() , de una manera más sucia.