Subpage under development, new version coming soon!
Subject: Asesoramiento: Programación para aficionados
Ojo, Python está dividido en 2 ramas: la 2.x y la 3.x. A partir de la versión 3.x modificaron toda la sintaxis y por lo tanto no hay retrocompatibilidad.
Para la rama 2.x (la 2.7) hay un montón de librerías y código de ejemplo, pero para la 3.x todo se reduce bastante. Por eso vas a encontrar que la mayoría sigue usando 2.7. Obviamente en un futuro la sintaxis de 3.x se va a imponer, pero no va a ser algo rápido.
Para la rama 2.x (la 2.7) hay un montón de librerías y código de ejemplo, pero para la 3.x todo se reduce bastante. Por eso vas a encontrar que la mayoría sigue usando 2.7. Obviamente en un futuro la sintaxis de 3.x se va a imponer, pero no va a ser algo rápido.
Puta, yo ya arranqué con el 3... Había empezado con el 2.7, pero al toque me avivé y me pasé al 3. Me daba un poco de pereza al principio que "print" hubiera pasado a ser una función (era más cómodo "print variable" que "print (variable)") pero pensé que sería para mejor.
Bueh, no sé, ahora termino porque si no siempre estoy empezando, y después veo con cual laburo, supongo que aunque la sintaxis sea distinta en algunos temas, las ideas centrales siempre serán las mismas.
Bueh, no sé, ahora termino porque si no siempre estoy empezando, y después veo con cual laburo, supongo que aunque la sintaxis sea distinta en algunos temas, las ideas centrales siempre serán las mismas.
Otro tema:
if (reaseguro == "s") or (reaseguro=="S"):
if (reaseguro.lowercase == "s"):
Che, algo anda mal con esto, me da siempre un error (AttributeError: 'str' object has no attribute 'lowercase'). Por lo que leí en tu propio link, string.lowercase es una constante... o sea, no la puedo usar con "mi" string... o mandé cualquiera?
if (reaseguro == "s") or (reaseguro=="S"):
if (reaseguro.lowercase == "s"):
Che, algo anda mal con esto, me da siempre un error (AttributeError: 'str' object has no attribute 'lowercase'). Por lo que leí en tu propio link, string.lowercase es una constante... o sea, no la puedo usar con "mi" string... o mandé cualquiera?
como dijo yogurtu,
Ahora no lo puedo probar, por eso estoy tocando de oido. Pero era para que te des una idea
Ahora no lo puedo probar, por eso estoy tocando de oido. Pero era para que te des una idea
Era así, gracias Yorurtu!
Por otro lado, justo había encontrado un ejemplo en el tutorial donde resolvían un problema parecido así:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
O sea, en mi caso debería haber sido:
reaseguro=input('¿Está seguro (S/N)? ')
if reaseguro in ('s', 'S'):
.... IngJug()
Por otro lado, justo había encontrado un ejemplo en el tutorial donde resolvían un problema parecido así:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
O sea, en mi caso debería haber sido:
reaseguro=input('¿Está seguro (S/N)? ')
if reaseguro in ('s', 'S'):
.... IngJug()
Si, ambas son buenas opciones.
Tambien string debe tener seguro un contains.
Donde si el input tiene una s entraria
algo asi como ok.lower().contains('s');
Tambien string debe tener seguro un contains.
Donde si el input tiene una s entraria
algo asi como ok.lower().contains('s');
hasta donde me fije no tiene :P, pero tiene un count y un find, que se pueden usar igual
Che, a ver, me trabé con esto:
En mi programa Python para manager de jugadores de SK/UM, creé una función para leer un archivo .txt donde está la info de los jugadores.
El programa principal, siguiendo el consejo del tutorial en el que estoy, se ejecuta desde una función llamada main()
Antes de todo, no obstante, están las importaciones de módulos y las variables globales. Una de las variables globales es el número de jugadores (definida al inicio como 0).
Creé una función para leer el txt. Esa función, al leer el txt, va incorporando jugadores a la matriz (lista de lista), definida también como variable global. Ahora bien:
La función de lectura del txt se ejecuta, los jugadores son incoporados, y modifico también el valor de la variable número de jugadores.
Luego ejecuto otra función, la de imprimir los jugadores en la pantalla, que usa la info del número de jugadores. Cuando ejecuto esa función, siempre toma por valor del número de jugadores 0, es como si la modificación que hice en la función de lectura de txt fuera irrelevante. Como sospeché de eso, incluso cambié: le puse a la función de lectura de txt que retorne un número equivalente al número de jugadores, y entonces en la función principal puse numjug = leertxt() (cosa de que numjug se modificara dentro de la función main y no en la función leertxt misma.
Bueno, ni así, invoco la función imprimirplantel y arranca con numjug 0.
Ahora, antes de que creara esta función leer txt, cuando jugadores arracaba con algunos datos adentro (no como ahora, que arranca en 0 y le incorporo los jugadores) también modificaba numjug dentro de la función agregarjugador, y nunca me hizo historia. ¿Por qué ahora sí?
En mi programa Python para manager de jugadores de SK/UM, creé una función para leer un archivo .txt donde está la info de los jugadores.
El programa principal, siguiendo el consejo del tutorial en el que estoy, se ejecuta desde una función llamada main()
Antes de todo, no obstante, están las importaciones de módulos y las variables globales. Una de las variables globales es el número de jugadores (definida al inicio como 0).
Creé una función para leer el txt. Esa función, al leer el txt, va incorporando jugadores a la matriz (lista de lista), definida también como variable global. Ahora bien:
La función de lectura del txt se ejecuta, los jugadores son incoporados, y modifico también el valor de la variable número de jugadores.
Luego ejecuto otra función, la de imprimir los jugadores en la pantalla, que usa la info del número de jugadores. Cuando ejecuto esa función, siempre toma por valor del número de jugadores 0, es como si la modificación que hice en la función de lectura de txt fuera irrelevante. Como sospeché de eso, incluso cambié: le puse a la función de lectura de txt que retorne un número equivalente al número de jugadores, y entonces en la función principal puse numjug = leertxt() (cosa de que numjug se modificara dentro de la función main y no en la función leertxt misma.
Bueno, ni así, invoco la función imprimirplantel y arranca con numjug 0.
Ahora, antes de que creara esta función leer txt, cuando jugadores arracaba con algunos datos adentro (no como ahora, que arranca en 0 y le incorporo los jugadores) también modificaba numjug dentro de la función agregarjugador, y nunca me hizo historia. ¿Por qué ahora sí?
No se me ocurre que te puede estar pasando, sería más fácil viendo el código. Este foro no es el ideal para pegar código, especialmente de Python, porque no respeta los tabs, pero igual va a ayudar bastante.
Un consejo: usar variables globales es MUY malo, así que tratá de acostumbrarte desde ahora a no usarlas. :-)
Un consejo: usar variables globales es MUY malo, así que tratá de acostumbrarte desde ahora a no usarlas. :-)
Claro, pero te explico mi lógica para ver si es correcta o, si no lo es, cómo puedo hacer para no caer en lo que quiero evitar:
Trato de hacer que el programa sea lo más fácilmente "editable" si le voy agregando cosas o incluso si la "fuente" (SK, UM) cambia. Por ejemplo, de momento, estoy trabajando sólo con 14 "datos" por jugador, o sea que la función "Imprimir plantel" imprime 14 columnas (una fila por cada jugador). Pero supongamos que mañana agrego datos, o los agrega SK (no sé, inventan una habilidad nueva).
Mi idea era: cambio la variable global "numcol" (número de columnas, pero podría llamarse numdat, por número de datos, o lo que sea) y listo, todas las funciones y todas las alusiones que haga en el programa en sí a la cantidad de datos por jugador me queda en una variable.
Si no hago eso, en muchos lugares, donde cambie la cantidad de datos, voy a tener que ir editando a manopla "14" por "16", y si cambia en el futuro, otra vez "16" por "20" o lo que sea. Eso es lo que quería evitar.
Ahora, más allá de cómo termine resolviendo el tema, me llama la atención igual el comportamiento, es decir, que ciertas variables que defino en cierto lugar me las banca como globales, y otras variables que defino en el mismo lugar, no. Me desconcierta.
Mirá: así abro el programa:
import _string, time, os
numjug = 0
numcol = 14
referencias=("Nombre", "Apellido", "Edad","Valor","Salario",
"Forma","Condición","Rapidez","Técnica","Pases",
"Portería","Defensa","Creación", "Anotación")
refabv=("nn", "NN", "ed","val","sal",
"FOR","CON","RAP","TÉC","PAS",
"POR","DEF","CRC","ANT")
jugadores=[]
En negrita, dos variables globales.
Más adelante, dentro de la función "main" (donde arranca la ejecución del programa), que es básicamente el display del menú, cuando el usuario opta por la opción uno (cargar datos desde archivo), digo:
opcion = getChoice(MenuPpal, 4) #ejecuta una función que muestra el menú y pide un número
while opcion != 4:
....if opcion==1:
........numjug=CDJ()
Le digo que numjug (que también es global y vale 0) es igual a la cantidad de jugadores que había cargado en el archivo (CDJ() es una función que abre el archivo, carga los jugadores y los almacena en la matriz global jugadores[], y devuelve con return la cantidad de jugadores que cargó).
Si el usuario, luego, apreta "imprimir plantel", salta a la siguiente función:
#Impresión de Plantel
def ImpPlantel(njug):
....# Encabezado
....for col in range (numcol):
........print (refabv[col], end= '\t')
....print ("\n", end="")
....#Impresión de jugadores
....fila=0
....while fila
Trato de hacer que el programa sea lo más fácilmente "editable" si le voy agregando cosas o incluso si la "fuente" (SK, UM) cambia. Por ejemplo, de momento, estoy trabajando sólo con 14 "datos" por jugador, o sea que la función "Imprimir plantel" imprime 14 columnas (una fila por cada jugador). Pero supongamos que mañana agrego datos, o los agrega SK (no sé, inventan una habilidad nueva).
Mi idea era: cambio la variable global "numcol" (número de columnas, pero podría llamarse numdat, por número de datos, o lo que sea) y listo, todas las funciones y todas las alusiones que haga en el programa en sí a la cantidad de datos por jugador me queda en una variable.
Si no hago eso, en muchos lugares, donde cambie la cantidad de datos, voy a tener que ir editando a manopla "14" por "16", y si cambia en el futuro, otra vez "16" por "20" o lo que sea. Eso es lo que quería evitar.
Ahora, más allá de cómo termine resolviendo el tema, me llama la atención igual el comportamiento, es decir, que ciertas variables que defino en cierto lugar me las banca como globales, y otras variables que defino en el mismo lugar, no. Me desconcierta.
Mirá: así abro el programa:
import _string, time, os
numjug = 0
numcol = 14
referencias=("Nombre", "Apellido", "Edad","Valor","Salario",
"Forma","Condición","Rapidez","Técnica","Pases",
"Portería","Defensa","Creación", "Anotación")
refabv=("nn", "NN", "ed","val","sal",
"FOR","CON","RAP","TÉC","PAS",
"POR","DEF","CRC","ANT")
jugadores=[]
En negrita, dos variables globales.
Más adelante, dentro de la función "main" (donde arranca la ejecución del programa), que es básicamente el display del menú, cuando el usuario opta por la opción uno (cargar datos desde archivo), digo:
opcion = getChoice(MenuPpal, 4) #ejecuta una función que muestra el menú y pide un número
while opcion != 4:
....if opcion==1:
........numjug=CDJ()
Le digo que numjug (que también es global y vale 0) es igual a la cantidad de jugadores que había cargado en el archivo (CDJ() es una función que abre el archivo, carga los jugadores y los almacena en la matriz global jugadores[], y devuelve con return la cantidad de jugadores que cargó).
Si el usuario, luego, apreta "imprimir plantel", salta a la siguiente función:
#Impresión de Plantel
def ImpPlantel(njug):
....# Encabezado
....for col in range (numcol):
........print (refabv[col], end= '\t')
....print ("\n", end="")
....#Impresión de jugadores
....fila=0
....while fila
Como usar variables globales no es una buena práctica, Python tiene un forma de salvaguardar al programador haciéndolo consciente de lo que está haciendo y obligándolo a declarar las variables globales con la palabra clave "global".
En tu caso, suponiendo que declaraste numjug como explicaste en tu post anterior y estás llamando a la función CDJ() desde adentro de main(), lo lógico es que adentro de main() hagas algo así:
import _string, time, os
numjug = 0
numcol = 14
def main():
....global numjug # Acá le estás deciendo que use la variable global
....numjug = CDJ()
En realidad todas esas variables que estás declarando globales podrían declararse localmente dentro de la función que la use, pero no quiero embarullarte demasiado con ese tema porque si estás siguiendo un tutorial capaz que te hago lío, pero eso que estás haciendo no es para nada recomendable. :-)
(edited)
En tu caso, suponiendo que declaraste numjug como explicaste en tu post anterior y estás llamando a la función CDJ() desde adentro de main(), lo lógico es que adentro de main() hagas algo así:
import _string, time, os
numjug = 0
numcol = 14
def main():
....global numjug # Acá le estás deciendo que use la variable global
....numjug = CDJ()
En realidad todas esas variables que estás declarando globales podrían declararse localmente dentro de la función que la use, pero no quiero embarullarte demasiado con ese tema porque si estás siguiendo un tutorial capaz que te hago lío, pero eso que estás haciendo no es para nada recomendable. :-)
(edited)